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
โ
โ
โท์๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ ๋งคํ
'๐ฅ๏ธ ๋ฐฑ์๋ > SpringBoot' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JPA] ๊ฐ์ฒด์งํฅ ์ฟผ๋ฆฌ ์ธ์ด - ๊ธฐ๋ณธ๋ฌธ๋ฒ (2) (1) | 2023.11.26 |
---|---|
[JPA] ๊ฐ์ฒด์งํฅ ์ฟผ๋ฆฌ ์ธ์ด - ๊ธฐ๋ณธ๋ฌธ๋ฒ (1) (1) | 2023.11.26 |
[์คํ๋ง๋ถํธ ํต์คํํธ] ch.4 JPA API (0) | 2023.11.23 |
[์คํ๋ง๋ถํธ ํต์คํํธ] ch.3 ํ ์คํธ, ๋ก๊น , ๋น๋ (1) | 2023.11.23 |
[์คํ๋ง๋ถํธ ํต์คํํธ] ch.2 ์์กด์ฑ๊ณผ ์๋์ค์ (0) | 2023.11.23 |