[์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA] 7. ๋‚˜๋จธ์ง€ ๊ธฐ๋Šฅ๋“ค

2022. 10. 4. 18:15ใ†์ธํ”„๋Ÿฐ/์‹ค์ „! ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA

728x90

 

์˜ค๋Š˜ ๊ฐ•์˜๋“ค์€ ๋‚ด์šฉ์€ ์‹ค๋ฌด์—์„œ๋Š” ์—„~~~์ฒญ ์ž์ฃผ ์‚ฌ์šฉํ•˜์ง€๋Š” ์•Š์ง€๋งŒ 

๊ทธ๋ž˜๋„ ์žˆ๋Š” ๊ธฐ๋Šฅ๋“ค์ด๊ณ , ์ž˜ ์‚ฌ์šฉํ•˜๋ฉด ๋‚˜๋ฆ„ ์œ ์šฉํ•˜๊ฒŒ ์“ธ ์ˆ˜ ๋„ ์žˆ๋‹ค๊ณ  ํ•ด์„œ ์†Œ๊ฐœํ•˜๋Š” ์„น์…˜์ด๋ผ๊ณ  ํ•œ๋‹ค. 

 

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

 

Spring Data JPA - Reference Documentation

Example 109. Using @Transactional at query methods @Transactional(readOnly = true) interface UserRepository extends JpaRepository { List findByLastname(String lastname); @Modifying @Transactional @Query("delete from User u where u.active = false") void del

docs.spring.io

 

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

 

Spring Data JPA - Reference Documentation

Example 109. Using @Transactional at query methods @Transactional(readOnly = true) interface UserRepository extends JpaRepository { List findByLastname(String lastname); @Modifying @Transactional @Query("delete from User u where u.active = false") void del

docs.spring.io

 

: ์—”ํ‹ฐํ‹ฐ ๋Œ€์‹ ์— 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๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค. 

๋„ค์ดํ‹ฐ๋ธŒ ์ฟผ๋ฆฌ๋Š” ๊ฐ€๊ธ‰์  ์‚ฌ์šฉํ•˜์ง€ ๋ง์ž~~ 

 

 

 

 

 

 

 

 

 

 

 

728x90