728x90 백엔드/JPA12 QueryDsl, data jpa 하나의 레포지토리 사용 클래스, 인터페이스 구조 최종 사용하는 레포지토리 (MemberDataRepository) import java.util.Optional; @EnableJpaRepositories /** * 실제 사용하는 리포지토리 * 단순한 CRUD 쿼리는 여기서 작성 */ public interface MemberDataRepository extends JpaRepository, MemberCustomRepository { Member findMemberByEmail(String email); } MemberCustomRepository import java.util.List; @Repository //커스텀 인터페이스 쿼리 작성 public interface MemberCustomRepository { Long e.. 2022. 3. 10. JPA Auditing으로 생성일/수정일 자동화하기 현재 진행중인 프로젝트에서 해당 데이터의 생성시간과 수정시간을 관리해야 할 부분이 있었습니다. 예를 들어, 주문 도메인에서 주문한 시간과 주문 내용을 수정한 시간이 필요했습니다. 그리고 결제 도메인에서는 결제 요청한 시간과 결제 내용을 수정하는 시간이 필요했습니다. 현재 개발 초기 단계이지만 벌써 두 곳에서 생성시간/수정시간이 필요했습니다. 언제 만들어졌는지, 언제 수정되었는지 등은 차후 더 필요해질 것이라 생각 생각했습니다. 여기저기 찾아보다가 책에 해당 내용이 있었습니다. 이제 그 내용을 읽고 적용한 것을 같이 공유하고자 합니다. JPA Auditing으로 생성시간/수정시간 자동화하기 보통 엔티티는 해당 데이터의 생성시간과 수정시간을 포함합니다. 그렇다 보니 매번 DB에 insert하기 전, upda.. 2021. 12. 29. 스프링 데이터 jpa 사용자 정의 ID를 사용하는경우 @GeneratedValue 를 사용하지 않는경우 사용자 정의 id를 사용하는경우 스프링데이터 jpa에서는 save() 작업을 하는경우 merge가 발생하므로 따로 설정해줘야한다. Persisteable 인터페이스를 구현해야한다. package com.study.datajpa.entity; import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.domain.Persistable; import org.springframework.data.jpa.domain.support.AuditingEntityLi.. 2021. 10. 24. 스프링 데이터 jpa Auditing BaseEntity 생성 package com.study.datajpa.entity; import lombok.Getter; import org.springframework.data.annotation.CreatedBy; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedBy; import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; import javax.persistenc.. 2021. 10. 23. 스프링 데이터 jpa 사용자 정의 repository 구현 사용자 정의 인터페이스 구현 package com.study.datajpa.repository; import com.study.datajpa.entity.Member; import java.util.List; public interface MemberRepositoryCustom { List findMemberCustom(); } 사용자 정의 인터페이스 구현체 상속해줄려는 스프링 데이터 jpa 인터페이스명 + "Impl", 부모 인터페이스 명은 상관없음, 구현체명이 중요! package com.study.datajpa.repository; import com.study.datajpa.entity.Member; import lombok.RequiredArgsConstructor; import javax.p.. 2021. 10. 23. 스프링 데이터 jpa 패치조인 @EntityGraph 인터페이스 XToOne 연관관계 일때 FetchType.Lazy 설정으로 바꾸고 스프링 데이터 jpa에서 패치조인 @Query("select m from Member m left join fetch m.team") List findMemberFetchJoin(); @Override @EntityGraph(attributePaths = {"team"}) List findAll(); // jpql에 적용 @EntityGraph(attributePaths = {"team"}) @Query("select m from Member m") List findMemberEntityGraph(); @EntityGraph(attributePaths = ("team")) List findEntityGraphByUsernam.. 2021. 10. 23. 스프링 데이터 jpa 벌크 쿼리 인터페이스 package com.study.datajpa.repository; import com.study.datajpa.dto.MemberDto; import com.study.datajpa.entity.Member; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Slice; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; import org.spr.. 2021. 10. 23. 스프링 data jpa 페이징 인터페이스 구현 import com.study.datajpa.dto.MemberDto; import com.study.datajpa.entity.Member; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Slice; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Para.. 2021. 10. 23. 스프링 데이터 JPA 복잡한 정적 쿼리 @Query @Query 어노테이션 사용 장점 : 컴파일시 문법오류 체크 package com.study.datajpa.repository; import com.study.datajpa.entity.Member; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import java.util.List; public interface MemberRepository extends JpaRepository { List findByUsername(String userna.. 2021. 10. 22. 스프링 데이터 JPA 기초 레포지토리 인터페이스 생성 후 JpaRepository 상속 package com.study.datajpa.repository; import com.study.datajpa.entity.Member; import org.springframework.data.jpa.repository.JpaRepository; public interface MemberRepository extends JpaRepository { } 테스트 스프링 데이터 JPA 리턴시 결과는 Optional로 준다. package com.study.datajpa.repository; import com.study.datajpa.entity.Member; import org.junit.jupiter.api.Test; import org.sp.. 2021. 10. 22. JPA 조인 패치조인 // 컨트롤러 @GetMapping("/api/v3/simple-orders") public List ordersV3(){ List orders = orderRepository.findAllWithMemberDelivery(); List result = orders.stream() .map(o -> new SimpleOrderDto(o)) .collect(Collectors.toList()); return result; } // DB 패치조인 조회 public List findAllWithMemberDelivery() { return em.createQuery( "select o from Order o" + " join fetch o.member m" + " join fetch o.deliver.. 2021. 10. 19. Rest API 개발시 양뱡향 연관관계 주의할 점 1. 양뱡향 연관관계인 경우 조회 데이터를 다시 호출하는 객체에 @JsonIgnore 어노테이션을 붙여준다. 2. hibernate5Module 설치후 빈 등록 //그래들 설치 implementation 'com.fasterxml.jackson.datatype:jackson-datatype-hibernate5' @Bean Hibernate5Module hibernate5Module(){ return new Hibernate5Module(); } 2021. 10. 18. 이전 1 다음 728x90