๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Spring-study๐ŸŒฑ/SpringData-JPA29

Section 7-4. ๋„ค์ดํ‹ฐ๋ธŒ ์ฟผ๋ฆฌ JPA์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์ธ ๋„ค์ดํ‹ฐ๋ธŒ ์ฟผ๋ฆฌ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž. ๊ฐ€๊ธ‰์  ๋„ค์ดํ‹ฐ๋ธŒ ์ฟผ๋ฆฌ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๊ฒŒ ์ข‹์Œ, ์ •๋ง ์–ด์ฉ” ์ˆ˜ ์—†์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA ๊ธฐ๋ฐ˜ ๋„ค์ดํ‹ฐ๋ธŒ ์ฟผ๋ฆฌ ํŽ˜์ด์ง• ์ง€์› ๋ฐ˜ํ™˜ ํƒ€์ž… Object[] Tuple DTO(์Šคํ”„๋ง ๋ฐ์ดํ„ฐ ์ธํ„ฐํŽ˜์ด์Šค Projections ์ง€์›) ์ œ์•ฝ Sort ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ํ†ตํ•œ ์ •๋ ฌ์ด ์ •์ƒ ๋™์ž‘ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ(๋ฏฟ์ง€ ๋ง๊ณ  ์ง์ ‘ ์ฒ˜๋ฆฌ) JPQL์ฒ˜๋Ÿผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋กœ๋”ฉ ์‹œ์ ์— ๋ฌธ๋ฒ• ํ™•์ธ ๋ถˆ๊ฐ€ ๋™์  ์ฟผ๋ฆฌ ๋ถˆ๊ฐ€ MemberRepository์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•œ๋‹ค. JPQL์€ ์œ„์น˜ ๊ธฐ๋ฐ˜ ํŒŒ๋ฆฌ๋ฏธํ„ฐ๋ฅผ 1๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์ง€๋งŒ ๋„ค์ดํ‹ฐ๋ธŒ SQL์€ 0๋ถ€ํ„ฐ ์‹œ์ž‘ ๋„ค์ดํ‹ฐ๋ธŒ SQL์„ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์•„๋‹Œ DTO๋กœ ๋ณ€ํ™˜์€ ํ•˜๋ ค๋ฉด DTO ๋Œ€์‹  JPA TUPLE ์กฐํšŒ DTO ๋Œ€์‹  MAP ์กฐํšŒ @SqlR.. 2023. 1. 30.
Section 7-3. Projections ์—”ํ‹ฐํ‹ฐ ๋Œ€์‹ ์— DTO๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ์กฐํšŒํ•  ๋•Œ ์‚ฌ์šฉ ์ „์ฒด ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์•„๋‹ˆ๋ผ ๋งŒ์•ฝ ํšŒ์› ์ด๋ฆ„๋งŒ ๋”ฑ ์กฐํšŒํ•˜๊ณ  ์‹ถ์œผ๋ฉด? ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค. public interface UsernameOnly { String getUsername(); } public interface MemberRepository ... { List findProjectionsByUsername(String username); } ํ…Œ์ŠคํŠธ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค ๊ธฐ๋ฐ˜ Open Proejctions ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์Šคํ”„๋ง์˜ SpEL ๋ฌธ๋ฒ•๋„ ์ง€์›ํ•œ๋‹ค. public interface UsernameOnly { @Value("#{target.username + ' ' + target.age + ' ' + target.team.name}") Strin.. 2023. 1. 29.
Section 7-2. Query By Example @SpringBootTest @Transactional public class QueryByExampleTest { @Test public void basic() throws Exception { //given Team teamA = new Team("teamA"); em.persist(teamA); em.persist(new Member("m1", 0, teamA)); em.persist(new Member("m2", 0, teamA)); em.flush(); //when //Probe ์ƒ์„ฑ Member member = new Member("m1"); Team team = new Team("teamA"); //๋‚ด๋ถ€์กฐ์ธ์œผ๋กœ teamA ๊ฐ€๋Šฅ member.setTeam(team); //ExampleMatch.. 2023. 1. 29.
Section 7-1. Specifications (๋ช…์„ธ) 7-3๊นŒ์ง€์— ๋Œ€ํ•œ ๋‚ด์šฉ์€ ์‹ค๋ฌด์—์„œ ์ค‘์š”ํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜์ง€๋Š” ์•Š๋Š”๋‹ค๊ณ  ํ•œ๋‹ค. ๋” ์ข‹์€ ๋ฐฉ์•ˆ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ!! ๊ฐ€๋ณ๊ฒŒ ๋ณด๋ฉด ์ข‹์„๋“ฏํ•˜๋‹ค. ์ฑ… ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„(Domain Driven Design)๋Š” SPECIFICATION(๋ช…์„ธ)๋ผ๋Š” ๊ฐœ๋…์„ ์†Œ๊ฐœํ•œ๋‹ค. ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA๋Š” JPA Criteria๋ฅผ ํ™œ์šฉํ•ด์„œ ์ด ๊ฐœ๋…์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•œ๋‹ค. ์ˆ ์–ด(predicate) ์ฐธ ๋˜๋Š” ๊ฑฐ์ง“์œผ๋กœ ํ‰๊ฐ€ AND OR ๊ฐ™์€ ์—ฐ์‚ฐ์ž๋กœ ์กฐํ•ฉํ•ด์„œ ๋‹ค์–‘ํ•œ ๊ฒ€์ƒ‰์กฐ๊ฑด์„ ์‰ฝ๊ฒŒ ์ƒ์„ฑ(์ปดํฌ์ง€ํŠธ ํŒจํ„ด) ์˜ˆ) ๊ฒ€์ƒ‰ ์กฐ๊ฑด ํ•˜๋‚˜ํ•˜๋‚˜ ์Šคํ”„๋ง ๋ฐ์ดํ„ฐ JPA๋Š” org.springframework.data.jpa.domain.Specification ํด๋ž˜์Šค๋กœ ์ •์˜ ๊ธฐ์กด์— MemberRepository์— JpaSpecificationExecutor ์ธํ„ฐํŽ˜์ด์Šค.. 2023. 1. 29.
Section 6-2. ์ƒˆ๋กœ์šด ์—”ํ‹ฐํ‹ฐ๋ฅผ ๊ตฌ๋ณ„ํ•˜๋Š” ๋ฐฉ๋ฒ• * save() ๋ฉ”์„œ๋“œ* ์ƒˆ๋กœ์šด ์—”ํ‹ฐํ‹ฐ๋ฉด ์ €์žฅ( persist ) ์ƒˆ๋กœ์šด ์—”ํ‹ฐํ‹ฐ๊ฐ€ ์•„๋‹ˆ๋ฉด ๋ณ‘ํ•ฉ( merge ) ์ƒˆ๋กœ์šด ์—”ํ‹ฐํ‹ฐ๋ฅผ ํŒ๋‹จํ•˜๋Š” ๊ธฐ๋ณธ ์ „๋žต ์‹๋ณ„์ž๊ฐ€ ๊ฐ์ฒด์ผ ๋•Œ null ๋กœ ํŒ๋‹จ ์‹๋ณ„์ž๊ฐ€ ์ž๋ฐ” ๊ธฐ๋ณธ ํƒ€์ž…์ผ ๋•Œ 0 ์œผ๋กœ ํŒ๋‹จ (long ๊ฐ™์€๊ฑฐ) Persistable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด์„œ ํŒ๋‹จ ๋กœ์ง ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ -> ์ด๊ฑฐ๋Š” @GeneratedValue๋ฅผ ์“ฐ์ง€์•Š๊ณ  ์‹๋ณ„์ž๋ฅผ ์ง์ ‘ ๋„ฃ์–ด์ค„ ๋•Œ๋ฅผ ๋Œ€๋น„ํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค. isNew๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด ๊ฐ์ฒด์ธ์ง€ ์•„๋‹Œ์ง€๋ฅผ ํŒ๋‹จํ•  ์ˆ˜ ์žˆ๋‹ค. JPA ์‹๋ณ„์ž ์ƒ์„ฑ ์ „๋žต์ด @GenerateValue ๋ฉด save() ํ˜ธ์ถœ ์‹œ์ ์— ์‹๋ณ„์ž๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์ƒˆ๋กœ์šด ์—”ํ‹ฐํ‹ฐ๋กœ ์ธ์‹ํ•ด์„œ ์ •์ƒ ๋™์ž‘ํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ JPA ์‹๋ณ„์ž ์ƒ์„ฑ ์ „๋žต์ด @Id ๋งŒ ์‚ฌ์šฉํ•ด์„œ ์ง์ ‘ ํ• ๋‹น์ด๋ฉด ์ด๋ฏธ ์‹๋ณ„์ž ๊ฐ’์ด ์žˆ๋Š” ์ƒ.. 2023. 1. 29.