๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ–ฅ๏ธ ๋ฐฑ์—”๋“œ/SpringBoot

[์Šคํ”„๋ง๋ถ€ํŠธ ํ€ต์Šคํƒ€ํŠธ] ch.5 ์Šคํ”„๋ง๋ฐ์ดํ„ฐ JPA

by OR15A 2023. 11. 23.
CrudRepository ์ธํ„ฐํŽ˜์ด์Šค
์ฟผ๋ฆฌ ๋ฉ”์„œ๋“œ
@Query ์• ๋„ˆํ…Œ์ด์…˜
Querydsl

 

โ–ถ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA ํ€ต์Šคํƒ€ํŠธ

  • ์Šคํ”„๋ง๋ถ€ํŠธ๋Š” JPA ์—ฐ๋™์— ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค๊ณผ ๋ณต์žกํ•œ XML์„ค์ •์„ ์ž๋™์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด JPA์Šคํƒ€ํ„ฐ๋ฅผ ์ œ๊ณตํ•จ

โ€‹

โ–ท ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA ์‚ฌ์šฉํ•˜๊ธฐ

  • ๊ธฐ๋ณธ์„ค์ • : application.propertiesํŒŒ์ผ์—์„œ DataSource, JPA, Logging Setting
  • Repository ์ธํ„ฐํŽ˜์ด์Šค๋“ค์˜ ์ƒ์† ๊ตฌ์กฐ
์ตœ๊ณ ์กฐ์ƒ, ๊ธฐ๋Šฅ ๊ฑฐ์˜ ์—†์Œ
<interface>
Repository
Spring Data ๋ชจ๋“ˆ์—์„œ ์ œ๊ณต
๋Œ€๋ถ€๋ถ„ ์ด๊ฒƒ
๊ธฐ๋ณธ์ ์ธ CRUD ๊ธฐ๋Šฅ ์ œ๊ณต
<interface>
CrudRepository
๊ฒ€์ƒ‰๊ธฐ๋Šฅ + ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ
<interface>
PagingAndSortingRepository
 
<interface>
JpaRepository
Spring Data JPA์—์„œ
์ถ”๊ฐ€๋กœ ์ œ๊ณต
  • ๋ชจ๋“  ์ธํ„ฐํŽ˜์ด์Šค๋“ค์€ ๊ณตํ†ต์ ์œผ๋กœ ๋‘ ๊ฐœ์˜ ์ œ๋„ค๋ฆญ ํƒ€์ž…์„ ์ง€์ •ํ•˜๋„๋ก ๋˜์–ด์žˆ์Œ<ํด๋ž˜์Šคํƒ€์ž…, ์‹๋ณ„์ž ํƒ€์ž…>
  • ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋ณ„๋„์˜ ๊ตฌํ˜„ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์ •์˜ํ•จ์œผ๋กœ์จ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ = ์Šคํ”„๋ง๋ถ€ํŠธ๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ๊ตฌํ˜„ ๊ฐ์ฒด๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด์คŒ
  • JPA ๋‹จ๋…์œผ๋กœ ์‚ฌ์šฉ ์‹œ ์—”ํ‹ฐํ‹ฐ๋งค๋‹ˆ์ €ํŒฉํ† ๋ฆฌ, ์—”ํ‹ฐํ‹ฐ๋งค๋‹ˆ์ €, ์—”ํ‹ฐํ‹ฐํŠธ๋žœ์ ์…˜ ๊ฐ์ฒด๋„ ํ•„์š” ์—†์Œ (๋ชจ๋“  ๊ฐ์ฒด๋“ค์˜ ์ƒ์„ฑ๊ณผ ํ™œ์šฉ์ด ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA์—์„œ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ)
  • CrudRepository ์ธํ„ฐํŽ˜์ด์Šค ๋ฉ”์„œ๋“œ
long count()                       //๋ชจ๋“  ์—”ํ‹ฐํ‹ฐ์˜ ๊ฐœ์ˆ˜ ๋ฆฌํ„ด
void delete(ID)                    //์‹๋ณ„ ํ‚ค๋ฅผ ํ†ตํ•œ ์‚ญ์ œ
void delete(Iterable<? Extend T>)  //์ฃผ์–ด์ง„ ๋ชจ๋“  ์—”ํ‹ฐํ‹ฐ ์‚ญ์ œ
void deleteAll()                   //๋ชจ๋“  ์—”ํ‹ฐํ‹ฐ ์‚ญ์ œ
boolean exists(ID)                 //์‹๋ณ„ ํ‚ค๋ฅผ ๊ฐ€์ง„ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธ
Iterable<T> findAllBtId()          //๋ชจ๋“  ์—”ํ‹ฐํ‹ฐ ๋ชฉ๋ก ๋ฆฌํ„ด
Iterable<T> findAll(Iterable<ID>)  //ํ•ด๋‹น ์‹๋ณ„ ํ‚ค๋ฅผ ๊ฐ€์ง„ ์—”ํ‹ฐํ‹ฐ ๋ชฉ๋ก ๋ฆฌํ„ด
Optional<T> findById(ID)           //ํ•ด๋‹น ์‹๋ณ„ ํ‚ค์— ํ•ด๋‹นํ•˜๋Š” ๋‹จ์ผ ์—”ํ‹ฐํ‹ฐ ๋ฆฌํ„ด
saveAll(Iterable<S>)               //์—ฌ๋Ÿฌ ์—”ํ‹ฐํ‹ฐ๋“ค์„ ํ•œ ๋ฒˆ์— ๋“ฑ๋ก, ์ˆ˜์ •
<S extends T>S save(S entity)      //ํ•˜๋‚˜์˜ ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋“ฑ๋ก, ์ˆ˜์ •
 
  • ์ ์šฉ ์˜ˆ์‹œ
Board board = boardRepo.findById(1L).get();
//์ˆ˜์ •
boardRepo.save(board)
 
  • ์ฟผ๋ฆฌ๋ฌธ์„ ํ™•์ธํ•ด๋ณด๋ฉด SELECT / SELECT + UPDATE ์ฒ˜๋ฆฌ (์ˆ˜์ •ํ•  ๋ฐ์ดํ„ฐ์— ํ•ด๋‹นํ•˜๋Š” ์—”ํ‹ฐํ‹ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ฆฌ๊ธฐ์œ„ํ•ด์„œ ๊ฒ€์ƒ‰์„ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ)

โ€‹

โ–ท ์ฟผ๋ฆฌ ๋ฉ”์†Œ๋“œ

  • ๋ฉ”์„œ๋“œ ์ด๋ฆ„์œผ๋กœ ํ•„์š”ํ•œ ์ฟผ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ธฐ๋Šฅ
find + ์—”ํ‹ฐํ‹ฐ์ด๋ฆ„ + By + ๋ณ€์ˆ˜์ด๋ฆ„
//ex
findBoardByTitle()  //Board ์—”ํ‹ฐํ‹ฐ์—์„œ title ๋ณ€์ˆ˜ ๊ฐ’๋งŒ ์กฐํšŒ
 
  • ์ด๋Ÿฌํ•œ ๋ฉ”์„œ๋“œ๊ฐ€ ์—†์–ด๋„ ์ž์ œ ํ•ด์„ํ•จ. ์ด๊ฒƒ ์ž์ฒด๊ฐ€ ์ฟผ๋ฆฌ์ž„
  • ์ฟผ๋ฆฌ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์—”ํ‹ฐํ‹ฐ ์ด๋ฆ„ ์ƒ๋žต๋„ ๊ฐ€๋Šฅํ•จ. ์—”ํ‹ฐํ‹ฐ ์ด๋ฆ„์ด ์ƒ๋žต๋˜๋ฉด ํ˜„์žฌ ์‚ฌ์šฉํ•˜๋Š” Repository์ธํ„ฐํŽ˜์ด์Šค์— ์„ ์–ธ๋œ ํƒ€์ž… ์ •๋ณด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ž๋™์œผ๋กœ ์ ์šฉ๋จ

โ€‹

โ–ท ํŽ˜์ด์ง•๊ณผ ์ •๋ ฌ ์ฒ˜๋ฆฌ

  • ๋ชจ๋“  Find์ฟผ๋ฆฌ ๋ฉ”์„œ๋“œ๋Š” ๋งˆ์ง€๋ง‰ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ํŽ˜์ด์ง•์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ Pageable์—”ํ„ฐํŽ˜์ด์Šค์™€ ์ •๋ ฌ์„ ์ฒ˜๋ฆฌํ•˜๋Š” Sort์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Œ
  • Select์˜ Order By : ๋ฐ์ดํ„ฐ ์กฐํšŒ์‹œ ์ •๋ ฌ
  • Paging์˜ Order By : ํŽ˜์ด์ง•๋œ ๊ฒฐ๊ณผ๋ฅผ ์ •๋ ฌ
  • ์Šคํ”„๋ง MVC์—์„œ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉํ•  ๋ชฉ์ ์ด๋ผ๋ฉด List<T>๋ณด๋‹ค Page<T>๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Œ. Page<T>๊ฐ์ฒด๋Š” ํŽ˜์ด์ง• ์ฒ˜๋ฆฌํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ์ •๋ณด๋“ค์„ ์ถ”๊ฐ€๋กœ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ

โ€‹

โ–ท @Query ์• ๋„ˆํ…Œ์ด์…˜

  • @Query ์• ๋„ˆํ…Œ์ด์…˜์˜ ์‚ฌ์šฉ ๋ฐฐ๊ฒฝ : ์กฐ๊ธˆ ๋ณต์žกํ•œ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, ์—ฐ๊ด€๊ด€๊ณ„์— ๊ธฐ๋ฐ˜ํ•œ ์กฐ์ธ๊ฒ€์ƒ‰์„ ์ฒ˜๋ฆฌํ•  ๋•Œ๋Š JPQL์„ ์‚ฌ์šฉํ•ด์•ผํ•จ, ์„ฑ๋Šฅ์ƒ ์–ด๋–จ ์ˆ˜ ์—†์ด ํŠน์ • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ข…์†์ ์ธ ๋„ค์ดํ‹ฐ๋ธŒ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ.
  • (์ฃผ์˜) JPQL์€ ์ผ๋ฐ˜์ ์ธ SQL๊ณผ ์œ ์‚ฌํ•œ ๋ฌธ๋ฒ•์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ, ๊ฒ€์ƒ‰๋Œ€์ƒ์ด ํ…Œ์ด๋ธ”์ด ์•„๋‹Œ ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ๋“ฑ๋ก๋œ ์—”ํ‹ฐํ‹ฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ์—”ํ‹ฐํ‹ฐ ์ด๋ฆ„, ๋ณ€์ˆ˜ ์ด๋ฆ„์˜ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ์ •ํ™•ํžˆ ์ž‘์„ฑ
  • ์‚ฌ์šฉ์ž ์ž…๋ ฅ ๊ฐ’์„ ๋ฐ”์ธ๋”ฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์œ„์น˜ ๊ธฐ๋ฐ˜ ํŒŒ๋ผ๋ฏธํ„ฐ(?1)์™€ ์ด๋ฆ„ ๊ธฐ๋ฐ˜ ํŒŒ๋ผ๋ฏธํ„ฐ(@Param("ํ‚ค์›Œ๋“œ")) ๋‘๊ฐ€์ง€๋ฅผ ์ง€์›ํ•จ.
  • ํŠน์ • ๋ณ€์ˆ˜๋งŒ ์กฐํšŒ ์‹œ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ : ์—ฌ๋Ÿฌ ๋ณ€์ˆ˜ ๊ฐ’๋“ค์ด ์กฐํšŒ O (์—”ํ‹ฐํ‹ฐ ๊ฐ์ฒด ์กฐํšŒ X). ๋ฆฌํ„ดํƒ€์ž…์„ List<Object[]>๋กœ ์„ค์ •ํ•ด์•ผํ•จ

โ€‹

โ–ท ๋„ค์ดํ‹ฐ๋ธŒ ์ฟผ๋ฆฌ ์‚ฌ์šฉ

  • ์ฟผ๋ฆฌ๊ฐ€ ํŠน์ • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ข…์†๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์ง€๋งŒ, ์„ฑ๋Šฅ์ƒ ํŠน์ • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ตœ์ ํ™”๋œ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์— ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•จ.
  • ์ด ์ฟผ๋ฆฌ๊ฐ€ JPQL์ด ์•„๋‹Œ ๋„ค์ดํ‹ฐ๋ธŒ ์ฟผ๋ฆฌ์ž„์„ ์•Œ๋ ค์ฃผ๋Š” nativeQuery=true ์†์„ฑ์„ ์ถ”๊ฐ€ํ•ด์•ผํ•จ

โ€‹โ€‹

โ–ท Querydsl๋ฅผ ์ด์šฉํ•œ ๋™์  ์ฟผ๋ฆฌ

  • JPA์—์„œ @Query๋กœ ๋“ฑ๋กํ•œ ์ฟผ๋ฆฌ๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ ๋กœ๋”ฉ๋˜๋Š” ์‹œ์ ์— ํŒŒ์‹ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ณ ์ •๋œ SQL๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ. ๋™์  ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด์„œ๋Š” Querydsl๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•จ
  • Querydsl๋Š” ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ, ์ฟผ๋ฆฌ๋ฅผ ์ž๋ฐ”์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋Š” ์ผ์ข…์˜ JPQL๋นŒ๋”
  • ํ•„์š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ : Querydsl JPA, Querydsl APT
  • Querydsl ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ธฐ์กด์˜ ์—”ํ‹ฐํ‹ฐRepository๊ฐ€ QuerydslPredicateExecutor ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ถ”๊ฐ€๋กœ ์ƒ์†ํ•ด์•ผํ•จ
  • ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ์ถ”๊ฐ€๋จ
long count(Predicate p)                    //๊ฒ€์ƒ‰๋œ ๋ฐ์ดํ„ฐ์˜ ์ „์ฒด ๊ฐฏ         
boolean exists(Predicate p)                //๊ฒ€์ƒ‰๋œ ๋ฐ์ดํ„ฐ์˜ ์กด์žฌ ์—ฌ๋ถ€
Iterator<T> findAll(Predicate p)           //์กฐ๊ฑด์— ๋งž๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ชฉ๋ก
Page<T> findAll(Predicate p)               //์กฐ๊ฑด์— ๋งž๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ชฉ๋ก
Iterator<t> findAll(Predicate p ,Sort s)   //์กฐ๊ฑด์— ๋งž๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ชฉ๋ก ์ •๋ ฌ
T findOne(Predicate p)                     //์กฐ๊ฑด์— ๋งž๋Š” ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ
 
  • Predicate์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•œ ํด๋ž˜์Šค๊ฐ€ BooleanBuilderํด๋ž˜์Šค
  • Predicate๊ฐ์ฒด๋ฅผ ์ด์šฉํ•˜๋ฉด ๊ฐ€๋ณ€์ ์ธ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ AND๋‚˜ OR์— ํ•ด๋‹นํ•˜๋Š” ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Œ

โ€‹

โ€‹

โ€‹

โ€‹

โ–ถ์—ฐ๊ด€๊ด€๊ณ„ ๋งคํ•‘

  • ํ…Œ์ด๋ธ”์€ PK์™€ FK๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๋งบ์ง€๋งŒ, ๊ฐ์ฒด๋Š” ์ฐธ์กฐ ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๋งบ์Œ
  • RDB๋Š” ์–‘๋ฐฉํ–ฅ, ๊ฐ์ฒด๋ชจ๋ธ์€ ์ฐธ์กฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ๋ฐฉํ–ฅ์ž„

โ–ท ์šฉ์–ด

  • ๋ฐฉํ–ฅ : ๋‹จ๋ฐฉํ–ฅ, ์–‘๋ฐฉํ–ฅ ์žˆ์Œ. ๋ฐฉํ–ฅ์€ ๊ฐ์ฒด์—๋งŒ ์กด์žฌํ•จ(ํ…Œ์ด๋ธ”์€ ํ•ญ์ƒ ์–‘๋ฐฉํ–ฅ)
  • ๋‹ค์ค‘์„ฑ : ๊ด€๊ณ„ ์ˆ˜ (1:1) (1:N) (N:M)
  • ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ : ์—ฐ๊ฒฐ์ปฌ๋Ÿผ์„ ์–ด๋Š ํ…Œ์ด๋ธ”์— ๋งŒ๋“ค ๊ฒƒ์ธ๊ฐ€? ์ฃผ์ธ = FK๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ชฝ

โ€‹

โ–ท ๋‹จ๋ฐฉํ–ฅ ์—ฐ๊ด€๊ด€๊ณ„ ์„ค์ •

@OneToOne
@OneToMany
@ManyToOne
 
  • @ManyToOne์˜ ์†์„ฑ
Optional
ํ•„์ˆ˜์„ ํƒ๊ด€๊ณ„
์—ฐ๊ด€๋œ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ๋ฐ˜๋“œ์‹œ ์žˆ์–ด์•ผ ํ•˜๋Š”์ง€์˜ ์—ฌ๋ถ€
true(์„ ํƒ์ ) false(ํ•„์ˆ˜)
๊ธฐ๋ณธ๊ฐ’ : true
fetch
์กฐ์ธ/์„œ๋ธŒ์ฟผ๋ฆฌ
๊ธ€๋กœ๋ฒŒ ํŽ˜์น˜ ์ „๋žต ์„ค์ •
EAGER : ์—ฐ๊ด€ ์—”ํ‹ฐํ‹ฐ ๋™์‹œ ์กฐํšŒ
LAZY : ์—ฐ๊ด€ ์—”ํ‹ฐํ‹ฐ๋ฅผ ์‹ค์ œ ์‚ฌ์šฉํ•  ๋•Œ ์กฐํšŒ
๊ธฐ๋ณธ๊ฐ’
@ManyToOne : EAGER
@OneToMany : LAZY
cascade
๋ถ€๋ชจ ์‚ญ์ œ ์‹œ
์ž์‹๋„ ์‚ญ์ œ
์˜์†์„ฑ ์ „์ด ๊ธฐ๋Šฅ์„ ์„ค์ •ํ•จ
 
  • @JoinColumn : name์†์„ฑ์„ ํ†ตํ•ด ์ฐธ์กฐํ•˜๋Š” ํ…Œ์ด๋ธ”์˜ ์™ธ๋ž˜ ํ‚ค ์นผ๋Ÿผ์„ ๋งคํ•‘ํ•จ
  • ์—”ํ‹ฐํ‹ฐ๋ฅผ ์ €์žฅํ•  ๋•Œ ์—ฐ๊ด€๊ด€๊ณ„์— ์žˆ๋Š” ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์žˆ๋‹ค๋ฉด, ํ•ด๋‹น ์—”ํ‹ฐํ‹ฐ๋„ ์˜์†์ƒํƒœ์—ฌ์•ผํ•จ
  • ex) โ‘ ์—ฐ๊ด€๊ด€๊ณ„์— ์žˆ๋Š” ํšŒ์›์—”ํ‹ฐํ‹ฐ๋ฅผ ๋จผ์ € ์˜์†์„ฑ ์ปจํ…์ŠคํŠธ์— ์ €์žฅ โ‘ก์ดํ›„ ๊ฒŒ์‹œ ๊ธ€ ์—”ํ‹ฐํ‹ฐ ์ €์žฅ
  • ์™ธ๋ถ€์กฐ์ธ์„ ๋‚ด๋ถ€์กฐ์ธ์œผ๋กœ ๋ณ€๊ฒฝํ•˜๊ธฐ -> @JoinColumn์— nullable์†์„ฑ์„ false๋กœ ์ง€์ •

โ€‹

โ–ท ์–‘๋ฐฉํ–ฅ ์—ฐ๊ด€๊ด€๊ณ„์—์„œ ์ฃผ์ธ ์ง€์ •ํ•˜๊ธฐ

  • @OneToMany์˜ mappedBy์†์„ฑ.
  • ์—ฐ๊ด€๊ด€๊ณ„์˜ ์ฃผ์ธ์€ ํ…Œ์ด๋ธ”์— ์™œ๋ž˜ํ‚ค๊ฐ€ ์žˆ๋Š” ๊ณณ์œผ๋กœ ์ •ํ•ด์•ผํ•จ.
  • ์ฃผ์ธ์ด ์•„๋‹Œ ๋ณ€์ˆ˜์—๋Š” mappedBy="์ฃผ์ธ"์†์„ฑ์„ ์‚ฌ์šฉํ•จ
  • ์„œ๋กœ ์ฐธ์กฐ์‹œ ๋ฌดํ•œ๋ฃจํ”„๊ฐ€ ์ƒ๊ธฐ๊ธฐ ๋•Œ๋ฌธ์— @ToString์• ๋„ˆํ…Œ์ด์…˜์— exclude์†์„ฑ์„ ์ถ”๊ฐ€ํ•ด์„œ ์ƒํ˜ธ ํ˜ธ์ถœ ๊ณ ๋ฆฌ๋ฅผ ๋Š์–ด์•ผํ•จ

โ€‹

โ–ท ์˜์†์„ฑ ์ „์ด

  • ๋ถ€๋ชจ ์—”ํ‹ฐํ‹ฐ์˜ ํด๋ž˜์Šค์˜ ๋ณ€์ˆ˜์— ์„ ์–ธํ•œ ๊ด€๊ณ„ ์• ๋„ˆํ…Œ์ด์…˜(ex. @OnetoMany)์— cascade์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ
  • cascade์†์„ฑ ๊ฐ’ : CascadeType.ALL/PERSIST/MERGE/REMOVE/REFRESH/DETACH

โ€‹

โ€‹

โ–ท์–‘๋ฐฉํ–ฅ ์—ฐ๊ด€๊ด€๊ณ„ ๋งคํ•‘