2022. 10. 4. 18:15ใ์ธํ๋ฐ/์ค์ ! ์คํ๋ง ๋ฐ์ดํฐ JPA
์ค๋ ๊ฐ์๋ค์ ๋ด์ฉ์ ์ค๋ฌด์์๋ ์~~~์ฒญ ์์ฃผ ์ฌ์ฉํ์ง๋ ์์ง๋ง
๊ทธ๋๋ ์๋ ๊ธฐ๋ฅ๋ค์ด๊ณ , ์ ์ฌ์ฉํ๋ฉด ๋๋ฆ ์ ์ฉํ๊ฒ ์ธ ์ ๋ ์๋ค๊ณ ํด์ ์๊ฐํ๋ ์น์ ์ด๋ผ๊ณ ํ๋ค.
1๏ธโฃ Specifications (๋ช ์ธ)
: ์ฑ ๋๋ฉ์ธ ์ฃผ๋ ์ค๊ณ (Domain Driven Design)๋ SPECIFICATION(๋ช ์ธ) ๋ผ๋ ๊ฐ๋ ์ ์๊ฐํ๋๋ฐ
์คํ๋ง ๋ฐ์ดํฐ JPA ๋ JPA Criteria๋ฅผ ํ์ฉํด์ ์ด ๊ฐ๋ ์ ์ฌ์ฉํ ์ ์๋๋ก ์ง์ํ๋ค.
(์ผ๋จ JPA Criteria๋ฅผ ํ์ฉํด์ ์ง์ํ๋ค๋ ๊ฒ ์์ฒด๋ถํฐ๊ฐ ์ค๋ฌด์์ ์ฌ์ฉํ๊ธฐ์ ํ๋ค๋ค๋ ์๊ธฐ๋ค.. )
์ ์ด Predicate
- ์ฐธ ๋๋ ๊ฑฐ์ง์ผ๋ก ํ๊ฐ
- AND OR ๊ฐ์ ์ฐ์ฐ์๋ก ์กฐํฉํด์ ๋ค์ํ ๊ฒ์์กฐ๊ฑด์ ์ฝ๊ฒ ์์ฑ(์ปดํฌ์งํธ ํจํด)
- ์) ๊ฒ์ ์กฐ๊ฑด ํ๋ํ๋
- ์คํ๋ง ๋ฐ์ดํฐ JPA๋ org.springframework.data.jpa.domain.Specification ํด๋์ค๋ก ์ ์
โ ์ปดํฌ์งํธ ํจํด
๊ฐ์ฒด๋ค์ ๊ด๊ณ๋ฅผ ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ๊ตฌ์ฑํ์ฌ ๋ถ๋ถ-์ ์ฒด ๊ณ์ธต์ ํํํ๋ ํจํด
๋ช ์ธ ๊ธฐ๋ฅ ์ฌ์ฉ ๋ฐฉ๋ฒ
: JpaSpecificationExecutor ์ธํฐํ์ด์ค ์์
MemberRepository
JpaSpecificationExecutor
-> Specification์ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์์ ๊ฒ์ ์กฐ๊ฑด์ผ๋ก ์ฌ์ฉ
MemberRepositoryTest
๐ Specification ์ ๊ตฌํํ๋ฉด ๋ช ์ธ๋ค์ ์กฐ๋ฆฝํ ์ ์์.
-> where(), and(), or(), not() ์ ๊ณต
Specification ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฒ์ and๋ก ์ฐ๊ฒฐํ๊ณ ์ถ์ผ๋ฉด ์ฐ๊ฒฐํ ์ ์๊ณ ,
JpaSpecificationExecutor ๋ฅผ ์์ํ๊ธฐ ๋๋ฌธ์ ๊ทธ๋ฅ memberRepository.findAll()์์ Specification ๊ตฌํํ ๊ฒ์ ๊ทธ๋ฅ ํ๋ผ๋ฏธํฐ๋ก ๋๊ธฐ๋ฉด ์์์ sql์ ๋ง๋ค์ด์ค๋ค.
-> findAll์ ๋ณด๋ฉด ํ์ ์ด๋ฆ ๋ช ์ธ username์ ํ ์ด๋ฆ ๋ช ์ธ teamName ์ and ๋ก ์กฐํฉํด์ ๊ฒ์ ์กฐ๊ฑด์ผ๋ก ์ฌ์ฉ
MemberSpec
-> ๋ช ์ธ๋ฅผ ์ ์ํ๋ ค๋ฉด Specification ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ผํ๋ค.
๋ช ์ธ๋ฅผ ์ ์ํ ๋๋ toPredicate(...) ๋ฉ์๋๋ง ๊ตฌํํ๋ฉด ๋๋๋ฐ JPA Crieria์ Root, CriteriaQuery, CriteriaBuilder ํด๋์ค๋ฅผ ํ๋ผ๋ฏธํฐ ์ ๊ณต
โญ์ฐธ๊ณ
: ์ค๋ฌด์์๋ JPA Criteria ๋ฅผ ๊ฑฐ์ ์์ด๋ค..!!! ์ด๊ฒ๋ ์ฐธ๊ณ ๋ก๋ง ๋ณด๊ณ QueryDSL์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํ๋ค.
๊ฐ์ ๋ด๋ด ๊ฐ์ฌ๋์ด ์ฌ์ฉํ๋ฉด ์์ฒญ ํํํ ๊ฑฐ๋ผ๊ณ ๊ทธ๋ฅ ์ฌ์ฉํ์ง ์๋๊ฒ์ ์ถ์ฒํ๋ค๊ณ ๋ช๋ฒ์ด๋ ๊ฐ์กฐํ๋ค. ใ
ใ
ใ
ใ
ใ
2๏ธโฃ Query By Example
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#query-by-example
MemberRepositoryTest
Probe: ํ๋์ ๋ฐ์ดํฐ๊ฐ ์๋ ์ค์ ๋๋ฉ์ธ ๊ฐ์ฒด
-> Member ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋ค์์ Team ๊ฐ์ฒด๋ ์์ฑํ๊ณ ์ฐ๊ด๊ด๊ณ๋ก ์ธํ ํด์ค -> ๋ด๋ถ์กฐ์ธ์ผ๋ก teamA ๊ฐ๋ฅ
ExampleMatcher : ํน์ ํ๋๋ฅผ ์ผ์น์ํค๋ ์์ธํ ์ ๋ณด ์ ๊ณต, ์ฌ์ฌ์ฉ ๊ฐ๋ฅ
-> ExampleMatcher๋ฅผ ์์ฑํด์ age ํ๋กํผํฐ๋ ๋ฌด์ํ๋๋ก ์ค์ ํ๋ค. ์ด๊ฑฐ ์์ผ๋ฉด select ํ ๋ age ๋ ํฌํจํด์ ์ฟผ๋ฆฌํจ.
-> ExampleMatcher ์ ๊ฑฐํ์ ๋
age๋ intํ์ผ๋ก ๊ธฐ๋ณธ ํ์ ์ด๊ธฐ ๋๋ฌธ์ ๊ธฐ๋ณธ ๊ฐ์ด 0์ด ์์ด์ ์ฟผ๋ฆฌํ ๋ ์ด๊ฒ๋ ํฌํจํด์ ์กฐํํ๊ฒ ๋จ..!
Example : Probe์ ExampleMatcher ๋ก ๊ตฌ์ฑ, ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋๋ฐ ์ฌ์ฉ
-> Example์ Probe์ธ Member์ ExampleMatcher ์ธ example์ Example.of ํ๋ผ๋ฏธํฐ๋ก ์ ๊ณตํด์ฃผ๊ณ , ์ด๋ฅผ memberRepository.findAll์ ๋๊ฒจ์ฃผ๋ฉด ๊ฒ์ ์กฐ๊ฑด์ ํฌํจํ sql์ ์์ฑํ๋ค.
์ฅ์
- ๋์ ์ฟผ๋ฆฌ๋ฅผ ํธ๋ฆฌํ๊ฒ ์ฒ๋ฆฌ
- ๋๋ฉ์ธ ๊ฐ์ฒด๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉ
- ๋ฐ์ดํฐ ์ ์ฅ์๋ฅผ RDB์์ NOSQL๋ก ๋ณ๊ฒฝํด๋ ์ฝ๋ ๋ณ๊ฒฝ์ด ์๊ฒ ์ถ์ํ ๋์ด ์์
- ์คํ๋ง ๋ฐ์ดํฐ JPA JpaRepository ์ธํฐํ์ด์ค์ ์ด๋ฏธ ํฌํจ
๋จ์
- ์กฐ์ธ์ ๊ฐ๋ฅํ์ง๋ง ๋ด๋ถ ์กฐ์ธ(INNER JOIN)๋ง ๊ฐ๋ฅํจ, ์ธ๋ถ ์กฐ์ธ(LEFT JOIN) ์๋จ
- ์ค์ฒฉ ์ ์ฝ ์กฐ๊ฑด ์๋จ
ex) firstname = ?0 or (firstname = ?1 and lastname = ?2)
- ๋งค์นญ ์กฐ๊ฑด์ด ๋งค์ฐ ๋จ์ํจ (์ ํํ ๋งค์นญ (=)๋ง ์ง์)
โ ์ ๋ฆฌ
์ค๋ฌด์์ ์ฌ์ฉํ๊ธฐ์๋ ๋งค์นญ ์กฐ๊ฑด์ด ๋๋ฌด ๋จ์ํ๊ณ , LEFT ์กฐ์ธ์ด ์๋จ
-> inner join๋ง ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ outer join์ด ๋ค์ด๊ฐ๋ ค๊ณ ํ๋ฉด ๊ฒฐ๊ตญ ์ด ์ฝ๋๋ค์ ๋ชจ๋ ์ ๊ฑฐํ๊ณ ๋ค์ ํด์ผ ํ๊ธฐ ๋๋ฌธ์...
์ค๋ฌด์์๋ QueryDSL ์ ์ฌ์ฉํฉ์๋ค..!!!!
3๏ธโฃ Projections
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#projections
: ์ํฐํฐ ๋์ ์ DTO๋ฅผ ํธ๋ฆฌํ๊ฒ ์กฐํํ ๋ ์ฌ์ฉ
(์ ์ฒด ์ํฐํฐ๋์ ์ ํ์ ์ด๋ฆ๋ง ์กฐํํ๊ณ ์ถ์ ๋..?)
UsernameOnly
-> ์กฐํํ ์ํฐํฐ์ ํ๋๋ฅผ getter ํ์์ผ๋ก ์ง์ ํ๋ฉด ํด๋น ํ๋๋ง ์ ํํด์ ์กฐํ (Projection)
MemberRepository
-> ๋ฉ์๋ ์ด๋ฆ์ ์์ ์ด๊ณ , ๋ฐํ ํ์ ์ผ๋ก ์ธ์งํ๋ค.
MemberRepositoryTest
-> SQL์์๋ select ์ ์์ username๋ง ์กฐํ(Projection) ํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
- ์ธํฐํ์ด์ค ๊ธฐ๋ฐ Closed Projections
: ํ๋กํผํฐ ํ์(getter)์ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ฉด, ๊ตฌํ์ฒด๋ ์คํ๋ง ๋ฐ์ดํฐ JPA๊ฐ ์ ๊ณตํ๋ค.
- ์ธํฐํ์ด์ค ๊ธฐ๋ฐ Open Projections
: ์คํ๋ง์ SpEL ๋ฌธ๋ฒ์ ์ง์ํ๋ค.
๊ทผ๋ฐ SpEL ๋ฌธ๋ฒ์ ์ฌ์ฉํ๋ฉด DB์์ ์ํฐํฐ ํ๋๋ฅผ ๋ค ์กฐํํด์จ ๋ค์์ ๊ณ์ฐํ๊ธฐ ๋๋ฌธ์ JPQL SELECT ์ ์ต์ ํ๊ฐ ๋์ง ์๋๋ค..!!
-> ์ธํฐํ์ด์ค ๊ธฐ๋ฐ Open Projections ๋ฅผ ์ฌ์ฉํ๋ฉด SQL SELECT์ ์ด ์ต์ ํ ๋์ง ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
- ํด๋์ค ๊ธฐ๋ฐ Projection
UsernameOnlyDto
-> ๋ค์๊ณผ ๊ฐ์ด UsernameOnly ์ธํฐํ์ด์ค๊ฐ ์๋ ๊ตฌ์ฒด์ ์ธ DTO ํ์๋ ๊ฐ๋ฅํ๋ค.
์์ฑ์์ ํ๋ผ๋ฏธํฐ ์ด๋ฆ์ผ๋ก ๋งค์นญ
MemberRepository
MemberRepositoryTest
- ๋์ Projections
MemberRepository
MemberRepositoryTest
GenericType์ผ๋ก ์ฃผ๋ฉด ๋์ ์ผ๋ก ํ๋ก์ ์ ๋ฐ์ดํฐ ๋ณ๊ฒฝ ๊ฐ๋ฅํ๋ค.
- ์ค์ฒฉ ๊ตฌ์กฐ ์ฒ๋ฆฌ
NestedClosedProjection
MemberRepository
MemberRepositoryTest
-> ์๊น ๋์ Projections์ ์ค์ฒฉ ๊ตฌ์กฐ ํด๋์ค๋ฅผ ๋ด๊ณ ๋ฆฌํดํด์ฃผ๋ฉด ๋๋ค.
โ ์ฃผ์
ํ๋ก์ ์ ๋์์ด root ์ํฐํฐ์ด๋ฉด, JPQL SELECT์ ์ต์ ํ ๊ฐ๋ฅ
ํ๋ก์ ์ ๋์์ด ROOT๊ฐ ์๋๋ฉด
- LEFT OUTER JOIN ์ฒ๋ฆฌ
- ๋ชจ๋ ํ๋๋ฅผ SELECT ํด์ ์ํฐํฐ๋ก ์กฐํํ ๋ค์์ ๊ณ์ฐ
โญ ์ ๋ฆฌ
- ํ๋ก์ ์ ๋์์ด root ์ํฐํฐ๋ฉด ์ ์ฉํ๋ค.
๊ทธ๋ฐ๋ฐ ํ๋ก์ ์ ๋์์ด root ์ํฐํฐ๋ฅผ ๋์ด๊ฐ๋ฉด JPQL SELECT ์ต์ ํ๊ฐ ์๋๋ค..!
->์์ ์ฟผ๋ฆฌ๋ฅผ ๋ณด๋ฉด Member์์๋ username๋ง ์กฐํํ๋ฉด์ ์ต์ ํ๊ฐ ๋์ง๋ง,
team์ root ์ํฐํฐ๊ฐ ์๋๊ธฐ ๋๋ฌธ์ select ์์ ์ต์ ํ๋์ง ์์ ๊ฒ์ ํ์ธํ ์ ์๋ค.
- ์ค๋ฌด์ ๋ณต์กํ ์ฟผ๋ฆฌ๋ฅผ ํด๊ฒฐํ๊ธฐ์๋ ํ๊ณ๊ฐ ์๋ค.
- ์ค๋ฌด์์๋ ๋จ์ํ ๋๋ง ์ฌ์ฉํ๊ณ , ๋ณต์กํด์ง๋ฉด QueryDsl์ ์ฌ์ฉํ์..!!!
4๏ธโฃ ๋ค์ดํฐ๋ธ ์ฟผ๋ฆฌ
์ด๋ฒ ๊ฐ์๋ฅผ ๋ค์ ๋๋ ๊ฑฐ์ ์ฌ์ฉํ๋ผ๊ณ ๊ถ์ฅํ๋ ๊ฑด ์์๋๊ฒ ๊ฐ๋ค.
๋ค์ผ๋ฉด์๋ ?-? ์ด๋ฌ๋ฉด์ ๋ค์๋ฏ..ใ ใ ใ
์๋ฌดํผ ๋ค์ดํฐ๋ธ ์ฟผ๋ฆฌ๋ ๊ฐ๊ธ์ ์ฌ์ฉํ์ง ์๋๊ฒ ์ข๊ณ , ์ ๋ง ์ด์ฉ~~์ ์์ ๋ ์ฌ์ฉํ๋ผ๊ณ ํ๋ค.
์๊ฐ๋ ์ต๊ทผ์ ๋์จ ๊ถ๊ทน์ ๋ฐฉ๋ฒ์ธ ์คํ๋ง ๋ฐ์ดํฐ Projections์ ํ์ฉํด์ ํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์์ด์ ํ๋ค๊ณ ํ๋ค.
- ์คํ๋ง ๋ฐ์ดํฐ JPA ๊ธฐ๋ฐ ๋ค์ดํฐ๋ธ ์ฟผ๋ฆฌ
ํ์ด์ง ์ง์
๋ฐํ ํ์ : Object[], Tuple, DTO(์คํ๋ง ๋ฐ์ดํฐ ์ธํฐํ์ด์ค Projections ์ง์)
์ ์ฝ
- Sort ํ๋ผ๋ฏธํฐ๋ฅผ ํตํ ์ ๋ ฌ์ด ์ ์ ๋์ํ์ง ์์ ์ ์๋ค. (๋๋ค ์๋๋ค ํ๊ธฐ ๋๋ฌธ์ ๋ฏฟ์ง ๋ง๊ณ ์ง์ ์ฒ๋ฆฌํ๋ผ๊ณ ํจ)
- JPQL ์ฒ๋ผ ์ ํ๋ฆฌ์ผ์ด์ ๋ก๋ฉ ์์ ์ ๋ฌธ๋ฒ ํ์ธ ๋ถ๊ฐ
- ๋์ ์ฟผ๋ฆฌ ๋ถ๊ฐ
- JPA ๋ค์ดํฐ๋ธ SQL ์ง์
- Projections ํ์ฉ
-> ์คํ๋ง ๋ฐ์ดํฐ JPA ๋ค์ดํฐ๋ธ ์ฟผ๋ฆฌ + ์ธํฐํ์ด์ค ๊ธฐ๋ฐ Projections ํ์ฉ
MemberProjection
โ ๊ฐ์ฌ๋๋ ๊ทธ๋ฅ ๋ค์ดํฐ๋ธ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ธฐ๋ณด๋ค๋ JdbcTemplate๋ฅผ ์ฌ์ฉํ๊ธฐ๋ ํ๋ค๊ณ ํ๋ค.
๋ค์ดํฐ๋ธ ์ฟผ๋ฆฌ๋ ๊ฐ๊ธ์ ์ฌ์ฉํ์ง ๋ง์~~
'์ธํ๋ฐ > ์ค์ ! ์คํ๋ง ๋ฐ์ดํฐ JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์คํ๋ง ๋ฐ์ดํฐ JPA] 6. ์คํ๋ง ๋ฐ์ดํฐ JPA ๋ถ์ (0) | 2022.10.03 |
---|---|
[์คํ๋ง ๋ฐ์ดํฐ JPA] 5. ํ์ฅ ๊ธฐ๋ฅ (1) | 2022.09.29 |
[์คํ๋ง ๋ฐ์ดํฐ JPA] 4. ์ฟผ๋ฆฌ ๋ฉ์๋ ๊ธฐ๋ฅ (0) | 2022.09.28 |
[์คํ๋ง ๋ฐ์ดํฐ JPA] 3. ๊ณตํต ์ธํฐํ์ด์ค ๊ธฐ๋ฅ (0) | 2022.09.22 |
[์คํ๋ง ๋ฐ์ดํฐ JPA] 2. ์์ ๋๋ฉ์ธ ๋ชจ๋ธ (0) | 2022.09.22 |