Querydsl의 기본 문법을 코드로 알아보자. 일단 테스트 코드 기본 세팅은 아래와 같다. @SpringBootTest @Transactional public class QuerydslBasicTest { @Autowired EntityManager em; @BeforeEach public void Before() { queryFactory = new JPAQueryFactory(em); Team teamA = new Team("teamA"); Team teamB = new Team("teamB"); em.persist(teamA); em.persist(teamB); Member member1 = new Member("member1", 10, teamA); Member member2 = new Memb..
전체 글
바쁜 새벽(busymidnight)을 살아보고자 만든 블로그네이티브 쿼리 가급적 사용하지 않는게 좋다. 최근에는 스프링 데이터 Projections를 활용한다. 스프링 데이터 JPA 기반 네이티브 쿼리 페이징 지원 반환 타입 Object[] Tuple DTO(스프링 데이터 인터페이스 Projections 지원) 제약 Sort 파라미터를 통한 정렬이 정상 동작하지 않을 수 있음(믿지 말고 직접 처리) JPQL처럼 애플리케이션 로딩 시점에 문법 확인 불가 동적 쿼리 불가 JPA 네이티브 SQL 지원 public interface MemberRepository extends JpaRepository { @Query(value = "select * from member where username = ?", nativeQuery = true) Member findByNa..
Projections 엔티티 대신에 DTO를 편리하게 조회할 때 사용 예제) 전체 엔티티가 아니라 만약 회원 이름만 조회하고 싶으면? public interface UsernameOnly { String getUsername(); } 조회할 엔티티의 필드를 getter 형식으로 지정하면 해당 필드만 선택해서 조회(Projection) public interface MemberRepository ... { List findProjectionsByUsername(String username); } 메서드 이름은 자유, 반환 타입으로 인지 @Test public void projections() throws Exception { //given Team teamA = new Team("teamA"); em.pe..
Query By Example Probe: 필드에 데이터가 있는 실제 도메인 객체 ExampleMatcher: 특정 필드를 일치시키는 상세한 정보 제공, 재사용 가능 Example: Probe와 ExampleMatcher로 구성, 쿼리를 생성하는데 사용 예제) @SpringBootTest @Transactional public class QueryByExampleTest { @Autowired MemberRepository memberRepository; @Autowired EntityManager em; @Test public void basic() throws Exception { //given Team teamA = new Team("teamA"); em.persist(teamA); em.persi..
Specifications (명세) 도메인 주도 설계(Domain Driven Design)는 SPECIFICATION(명세)라는 개념을 소개 스프링 데이터 JPA는 JPA Criteria를 활용해서 이 개념을 사용할 수 있도록 지원 술어(predicate) 참 또는 거짓으로 평가 AND OR 같은 연산자로 조합해서 다양한 검색조건을 쉽게 생성(컴포지트 패턴) 예) 검색 조건 하나하나 스프링 데이터 JPA는 org.springframework.data.jpa.domain.Specification 클래스로 정의 참고: 실무에서는 JPA Criteria를 거의 안쓴다! 대신에 QueryDSL을 사용하자. 명세 기능 사용 방법 JpaSpecificationExecutor 인터페이스 상속 public inter..
스프링 데이터 JPA 구현체 분석 스프링 데이터 JPA가 제공하는 공통 인터페이스의 구현체 org.springframework.data.jpa.repository.support.SimpleJpaRepository @Repository @Transactional(readOnly = true) public class SimpleJpaRepository ...{ @Transactional public S save(S entity) { if (entityInformation.isNew(entity)) { //새로운 엔티티인지 확인 em.persist(entity); return entity; } else { return em.merge(entity); } } ... } @Repository 적용 JPA 예외를 ..
도메인 클래스 컨버터 HTTP 파라미터로 넘어온 엔티티의 아이디로 엔티티 객체를 찾아서 바인딩 도메인 클래스 컨버터 사용 전 @RestController @RequiredArgsConstructor public class MemberController { private final MemberRepository memberRepository; @GetMapping("/members/{id}") public String findMember(@PathVariable("id") Long id) { Member member = memberRepository.findById(id).get(); return member.getUsername(); } @PostConstruct public void init() { m..
엔티티를 생성, 변경할 때 변경한 사람과 시간을 추적하고 싶으면? 등록일 수정일 등록자 수정자 순수 JPA 사용 주요 이벤트 어노테이션 @PrePersist, @PostPersist @PreUpdate, @PostUpdate 등록일, 수정일 적용 package study.datajpa.entity; @MappedSuperclass @Getter public class JpaBaseEntity { @Column(updatable = false) private LocalDateTime createdDate; private LocalDateTime updatedDate; @PrePersist public void prePersist() { LocalDateTime now = LocalDateTime.now()..