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. ์ด์ 1 2 3 4 ยทยทยท 6 ๋ค์