스프링데이터 + JPA 112

7. JPQL vs QueryDSL

일단 JPQL로 한번 짜보고, 똑같은 걸 QueryDSL로 짜서 비교해 볼거임. @Test public void startJPQL(){ String sql = "select m from Member m where m.username = :username"; Member result = em.createQuery(sql, Member.class) .setParameter("username", "member1") .getSingleResult(); assertThat(result.getUsername()).isEqualTo("member1"); } 뭐 그냥 JPQL이다. select m1_0.member_id, m1_0.age, m1_0.team_id, m1_0.username from member m1_0..

5. H2 DB 설치 및 설정

스프링 부트 h2의 라이브러리의 버전에 맞춰서 H2 설치 db파일 생성 잘 시키고, implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0' src/main/resources의 application.yml 파일. default는 application.properties 파일인데 사람마다 선호하는 게 다른 가봄. (회사마다 다를거임) 여튼 없을테니, application.properties 지우고 application.yml 만들어 주셈. spring: datasource: url: jdbc:h2:tcp://localhost/./querydsl username: sa password: driver-class-name: org.h2...

3. QueryDSL 설정

일단 Gradle에 설정하고(이게 스프링부트 버전이나, 인텔리제이 버전이나, QueryDSL 버전마다 조금씩 다르다고 함.) https://qwefdg3.tistory.com/647 일단은 현재 스프링 부트 3.0 이상 버전은 저걸로 하면 됨. 쿼리DSL은 엔티티에 대하여 자바코드로 쿼리를 짤 수 있게 해주는 것 이므로, (구조 자체가 엔티티 스캔해서 그 엔티티에 대한 클래스를 엔티티마다 구현체를 만들어 놓음. 그게 QueryDSL 파일 들이고, 그걸로 QueryDSL 하는거임.) 그래서 먼저, 테스트 엔티티를 만듦. @Entity @Getter public class TestEntity { @Id @GeneratedValue private Long id; private String username; }..

2. 프로젝트 생성

지금까지 계속 비슷하게 환경설정을 했는데, QueryDSL은 약-간 다른 점이 있다. 아직까지는 똑같음. queryDSL이 스프링에서 버전 관리는 해주는데, starter에는 없다고 함. 실행해서 종속성 설치 해 주고, @RestController public class TestController { @GetMapping("/") public String test(){ return "hello"; } } 그냥 간단하게 컨트롤러 만들어 줌. @RestController니 따로 html 페이지를 찾는 게 아니라 그냥 글자 반환함. 객체면 json 형태로 알아서 그 resolver가 바꿔서 반환함. (@RestController 쓰면 ViewResolver 대신 httpMessageConverter가 해 줌.)

29. 네이티브 쿼리

먼저 사실 Jpa를 사용하면 네이티브 쿼리는 왠만하면 사용하지 않는 게 좋음. 정말 정말 방법이 없을 때 최종적으로 사용하는 게 네이티브 쿼리. (리포지토리가 DB끼리의 표준화가 안될 터이니..) 일단 그래도 정말 가끔 어쩔 수 없어서 짜야 할 수도 있으니, 알 긴 해야할 듯. 방법은 정말 간단함. 그냥 Spring Data Jpa에서 @Query(value = "select * from member where username = ?", nativeQuery = true) Member findByNativeQuery(String username); jpql 직접 할 때 처럼 저렇게 @Query하고 쿼리 적는 건 똑같은데, 아마 jpql과 문법이 달라 문자열이지만 오류를 표시해 줌. 그 때 nativeQu..

28. Projections

이번거는 앞의 2개와 달리 때때로 도움이 될 수 있음. 일단 Jpa자체가 엔티티를 대상으로 조회하려고 만들어 진 거임. 근데 뭐 예를들어 엔티티 자체가 아니라 엔티티의 값 하나만, Member의 username 하나만 조회하고 싶으면? 쉽게 이야기 해서, Projections 직역은 예상, 계획인데 select () from 저기 select 절 뒤에 들어갈 거라고 보면 된다. 사용법도 간단함 public interface UsernameOnly { String getUsername(); } 먼저 이렇게 인터페이스를 만듦. 저 메소드명이 중요한데, 가져올 것의 프로퍼티명으로 만들어 버리셈. 당연히 타입은 맞춰주고. 그 다음, List findProjectionsByUsername(String userna..

27. Query By Example

이거는 보기에 생각보다 좋아보인다. @Test public void queryByExample(){ Team teamA = new Team("teamA"); em.persist(teamA); Member m1 = new Member("m1", 0, teamA); Member m2 = new Member("m2", 0, teamA); em.persist(m1); em.persist(m2); em.flush(); em.clear(); Member member = new Member("m1"); Example example = Example.of(member); List result = memberRepository.findAll(example); assertThat(result.size()).isEqualT..