๐Ÿ๏ธ Spring/JPA

ํด๋ฆญ ์‹œ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ์ˆœ์ˆ˜ํ•œ JPA DATA JPA QueryDSL ์ˆœ์ˆ˜ JPA ์—์„œ์˜ ํŽ˜์ด์ง• ๋‹ค์Œ ๋‘ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ํŽ˜์ด์ง•์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค setFirstResult(int startPosition) : ์กฐํšŒ ์‹œ์ž‘ ์œ„์น˜, 0๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. setMaxResult(int maxResult) : ์กฐํšŒํ•  ๋ฐ์ดํ„ฐ ์ˆ˜ setFirstResult๋Š” ํŽ˜์ด์ง€์˜ ๋ฒˆํ˜ธ๊ฐ€ ์•„๋‹Œ ์กฐํšŒ๋ฅผ ์‹œ์ž‘ํ•  row์˜ ์œ„์น˜๋ฅผ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ์‹œ ์ฝ”๋“œ em.createQuery("select m from Member m where m.age = :age order by m.username desc", Member.class) .setParameter("age", age) .setFirstResult(0) //์‹œ์ž‘ ์œ„์น˜ ์ง€์ • .setMax..
JPA์˜ ๋ฐ˜ํ™˜ ํƒ€์ž…์˜ ์ข…๋ฅ˜ Data JPA์—์„œ ๋ฐ˜ํ™˜ ํƒ€์ž…์„ ์ง€์ •ํ•  ๋•Œ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐ˜ํ™˜ ํƒ€์ž…๋“ค์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. List : ์ปฌ๋ ‰์…˜, ๊ฒฐ๊ณผ๊ฐ€ ์—†์œผ๋ฉด ๋นˆ ์ปฌ๋ ‰์…˜์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. Member : ๋‹จ๊ฑด(๊ฒฐ๊ณผ๊ฐ€ ์—†์œผ๋ฉด ๊ฒฐ๊ณผ๊ฐ€ null, ๊ฒฐ๊ณผ๊ฐ€ 2๊ฐœ์ด๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.) Optional : ๋‹จ๊ฑด optional(๊ฒฐ๊ณผ๊ฐ€ 2๊ฐœ์ด๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค) ... https://docs.spring.io/spring-data/jpa/docs/2.3.0.RELEASE/reference/html/#repository-query-return-types Spring Data JPA - Reference Documentation Example 108. Using @Transactional at query methods @T..
์ฟผ๋ฆฌ ๋ฉ”์†Œ๋“œ ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ฟผ๋ฆฌ ๋ฉ”์†Œ๋“œ ๊ธฐ๋Šฅ์€ ๋Œ€ํ‘œ์ ์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ฉ”์†Œ๋“œ์˜ ์ด๋ฆ„์œผ๋กœ ์ฟผ๋ฆฌ ์ƒ์„ฑ @Query๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฆฌํŒŒ์ง€ํ† ๋ฆฌ ์ธํ„ฐํŽ˜์ด์Šค์— ์ฟผ๋ฆฌ๋ฅผ ์ง์ ‘ ์ •์˜ ๋ฉ”์†Œ๋“œ ์ด๋ฆ„์œผ๋กœ ์ฟผ๋ฆฌ ์ƒ์„ฑ Optional findByUsername(String username); ์œ„์˜ ์˜ˆ์‹œ์ฒ˜๋Ÿผ ๋ฉ”์„œ๋“œ์˜ ์ด๋ฆ„๋งŒ ์„ค์ •ํ•จ์œผ๋กœ์จ ์ฟผ๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ๊ฒƒ์€ ํ•ด๋‹น ํ•„๋“œ๊ฐ€ ์—”ํ‹ฐํ‹ฐ์— ์กด์žฌํ•ด์•ผ ํ•˜๋ฉฐ, ํ•„๋“œ๋ช…๊ณผ ๋ฉ”์„œ๋“œ ์ด๋ฆ„์ด ๋ฐ˜๋“œ์‹œ ์ผ์น˜ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š๋Š”๋‹ค๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ๋”ฉ ์‹œ์ ์— ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ˆ ์–ด https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#appendix.query.method.subje..
์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA์—์„œ ์ถ”์ƒํ™”์˜ ์ค‘์‹ฌ์ด ๋˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋Š” Repository ์ž…๋‹ˆ๋‹ค. Repository๋Š” ๊ด€๋ฆฌํ•  ๋„๋ฉ”์ธ ํด๋ž˜์Šค์™€, ๋„๋ฉ”์ธ ํด๋ž˜์Šค์˜ ID(์‹๋ณ„์ž)๋ฅผ ํƒ€์ž… ์ธ์ž๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ๊ตฌํ˜„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. @NoRepositoryBean public interface CrudRepository extends Repository { S save(S entity); Iterable saveAll(Iterable entities); Optional findById(ID id); boolean existsById(ID id); Iterable findAll(); Iterable findAllById(Iterable ids); long count(); void deleteById(ID id); v..
๋ณตํ•ฉ ํ‚ค(Composite Key) ์—ฌ๋Ÿฌ ์—ด์„ ์กฐํ•ฉํ•˜์—ฌ ๊ธฐ๋ณธ ํ‚ค(Primary Key)์˜ ์—ญํ• ์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“  ํ‚ค๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์‹๋ณ„ ๊ด€๊ณ„ ๋ถ€๋ชจ ํ…Œ์ด๋ธ”์˜ ๊ธฐ๋ณธ ํ‚ค๋ฅผ ๋‚ด๋ ค๋ฐ›์•„์„œ ์ž์‹ ํ…Œ์ด๋ธ”์˜ ๊ธฐ๋ณธ ํ‚ค + ์™ธ๋ž˜ ํ‚ค๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ด€๊ณ„์ž…๋‹ˆ๋‹ค. ๋น„์‹๋ณ„ ๊ด€๊ณ„ ๋ถ€๋ชจ ํ…Œ์ด๋ธ”์˜ ๊ธฐ๋ณธ ํ‚ค๋ฅผ ์ž์‹ ํ…Œ์ด๋ธ”์˜ ์™ธ๋ž˜ ํ‚ค๋กœ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ด€๊ณ„์ž…๋‹ˆ๋‹ค. ๋น„์‹๋ณ„ ๊ด€๊ณ„๋Š” ํ•„์ˆ˜์  ๋น„์‹๋ณ„ ๊ด€๊ณ„์™€ ์„ ํƒ์  ๋น„์‹๋ณ„ ๊ด€๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„์ˆ˜์  ๋น„์‹๋ณ„ ๊ด€๊ณ„(Mandatory) ์™ธ๋ž˜ ํ‚ค์— NULL์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๋ฐ˜๋“œ์‹œ ๋งบ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์„ ํƒ์  ๋น„์‹๋ณ„ ๊ด€๊ณ„(Optional) ์™ธ๋ž˜ ํ‚ค์— NULL์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๋งบ์„์ง€ ๋ง์ง€ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹๋ณ„ ๊ด€๊ณ„์™€ ๋น„์‹๋ณ„ ๊ด€๊ณ„์˜ ์„ ํƒ ์ตœ๊ทผ์—๋Š” ๋น„์‹๋ณ„ ๊ด€๊ณ„๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ๊ผญ ํ•„์š”ํ•œ ๊ณณ์—๋งŒ ..
์ €๋Š” ์ง€๊ธˆ๊นŒ์ง€ ์ผ๋ฐ˜์ ์œผ๋กœ JPA๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ @Id์™€ @GenerateValue, ๊ทธ๋ฆฌ๊ณ  Long ํƒ€์ž…์˜ id๋ฅผ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค. ํ•ญ์ƒ id๋Š” ์ง์ ‘ ํ• ๋‹นํ•˜์ง€ ์•Š์•˜๊ธฐ์— save()์‹œ id์˜ ๊ฐ’์€ ํ•ญ์ƒ null์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค ์ฝ”ํ‹€๋ฆฐ์„ ๊ณต๋ถ€ํ•˜๊ณ , ์ฝ”ํ‹€๋ฆฐ์œผ๋กœ JPA๋ฅผ ์‚ฌ์šฉํ•ด๋ณด๋ ค๋˜ ์ค‘, ์ฝ”ํ‹€๋ฆฐ์—์„œ id์— null์„ ํ—ˆ์šฉํ•˜๊ฒŒ๋” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค๋ฉด ์ฝ”๋“œ๊ฐ€ ๋„ˆ๋ฌด ๋”๋Ÿฌ์›Œ์งˆ ๊ฒƒ ๊ฐ™์•„์„œ, null์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ƒ๊ฐ๋ณด๋‹ค ๊ฐ„๋‹จํ–ˆ๋Š”๋ฐ ๊ฒฐ๋ก ์€ 0์œผ๋กœ ์ดˆ๊ธฐํ™” ์‹œ์ผœ์ฃผ๋ฉด ๋œ๋‹ค์˜€์Šต๋‹ˆ๋‹ค. ํ˜น์€ nullable ํƒ€์ž…์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ด์ œ๋ถ€ํ„ฐ ์ด๋Ÿฌํ•œ ์ด์œ ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. save()๋Š” ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ• ๊นŒ? ์ €์žฅํ•˜๋ ค๋Š” ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์ƒˆ๋กœ์šด ์—”ํ‹ฐํ‹ฐ์ธ ๊ฒฝ์šฐ persist๋ฅผ, ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ merge๋ฅผ ์ง„..
๋ชจ๋“  ๊ฒฝ์šฐ์— ์ž‘๋™ํ•˜์ง€๋Š” ์•Š์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ €์˜ ๊ฒฝ์šฐ์—๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ dialect(๋ฐฉ์–ธ)์ด ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค. ์ œ application.properties ์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด dialect๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์—ˆ๊ณ  spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect ์ด๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ณ ์ณ์ฃผ๋‹ˆ ์˜ค๋ฅ˜๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL55Dialect ์ฐธ๊ณ  - MySQL ์Šคํ† ๋ฆฌ์ง€ ์—”์ง„ ์ข…๋ฅ˜์™€ ํŠน์ง• https://nomadlee.com/mysql-%EC%8A%A4%ED%86%A0%EB%A6%AC%EC%A7%80-%EC%97%94%EC%..
๋ฌธ์ œ ์ƒํ™ฉ์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋‚˜ํƒ€๋‚ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.. TestEntity @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity public class TestEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "test_id") private Long id; private String name; } TestRepository public interface TestRepository extends JpaRepository { } TestService @Service @RequiredArgsConstructor @Transactional pu..
๋ง ๋ž‘
'๐Ÿ๏ธ Spring/JPA' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๊ธ€ ๋ชฉ๋ก (3 Page)