분류 전체보기
-
JPA - API 개발 고급(OneToOne, ManyToOne 지연 로딩과 조회 성능 최적화)Spring/JPA 2022. 3. 22. 20:11
API 개발 고급(OneToOne, ManyToOne 지연 로딩과 조회 성능 최적화) 엔티티를 직접 노출 엔티티를 DTO로 변환 - 페치 조인 최적화 JPA에서 DTO로 바로 조회 대부분의 성능 문제는 조회에서 발생하므로 OneToOne, ManyToOne 관계에서의 조회에 대한 성능 최적화에 대해 알아보자. 엔티티를 직접 노출 항상 강조하지만 엔티티를 직접 전달하는 방법은 여러 문제가 발생할 뿐만 아니라 유지보수에도 문제가 생긴다. 따라서 참고만 하고 DTO를 사용하자. 문제 1 - 양방향 연관관계에서의 문제 @RestController @RequiredArgsConstructor public class OrderSimpleApiController { private final OrderRepositor..
-
Querydsl - 설정 및 검증Spring/Querydsl 2022. 3. 22. 12:42
Querydsl 설정 및 검증 Querydsl 설정 Querydsl을 사용하기 위해서는 Spring Initializr 에서 해당 라이브러리를 추가하지 못하므로 따로 추가해줘야 한다. build.gradle buildscript { ext { queryDslVersion = "5.0.0"// (1) } } plugins { //querydsl 추가 id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"// (2) } dependencies { //querydsl 추가 implementation "com.querydsl:querydsl-jpa:${queryDslVersion}"// (3) annotationProcessor "com.querydsl:queryds..
-
JPA - API 기본Spring/JPA 2022. 3. 21. 19:31
API에서는 하나만 기억하면 된다. 파라미터를 받거나 전송할 때 Entity를 사용하지 않고 DTO를 사용해야하는 것을 명심하자. DTO 사용 시 이점 엔티티 대신에 RequestBody와 ResponseBody에 각각 DTO를 매핑한다. 엔티티와 프레젠테이션(화면) 계층을 위한 로직을 분리할 수 있다. 엔티티와 API 스펙을 명확하게 분리할 수 있다. 엔티티가 변해도 API 스펙이 변하지 않는다. 실무에서는 엔티티를 API 스펙에 노출하면 안된다. 엔티티로 매핑시 문제점 엔티티에 프레젠테이션 계층을 위한 로직이 추가된다 엔티티에 API 검증을 위한 로직이 들어간다.(@NotEmpty 등) 실무에서는 회원 엔티티를 위한 API가 다양하게 만들어지는데, 한 엔티티에 각각의 API를 위한 모든 요청 요구사항..
-
Spring Data JPA - 페이징과 정렬Spring/Spring Data JPA 2022. 3. 21. 14:26
페이징과 정렬 페이징과 정렬 파라미터로 Pageable을 받을 수 있다. Pageable은 인터페이스, 실제로는 PageRequest 구현체가 생성된다. 요청 파라미터 - page : 현재 페이지, 0부터 시작 - size : 한 페이지에 노출할 데이터 건수 - sort : 정렬 조건을 정의 예시 : /members?page=0&size=3&sort=id,desc&sort=username,desc @GetMapping("/members") public Page list(Pageable pageable) { Page page = memberRepository.findAll(pageable); return page; } @Qualifier 페이징 정보가 둘 이상인 경우 사용 @Qualifier에 접두사명 추..
-
Spring Data JPA - 도메인 클래스 컨버터Spring/Spring Data JPA 2022. 3. 21. 11:46
도메인 클래스 컨버터 Spring이 내부적으로 HTTP 파라미터로 엔티티의 PK가 넘어오면 엔티티 객체를 찾아서 바인딩해준다. 도메인 클래스 컨버터를 사용하기 전 @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(); } } 도메인 클래스 컨버터 사용..
-
Spring Data JPA - 엔티티의 생성, 변경한 사람과 시간을 추적(Auditing)Spring/Spring Data JPA 2022. 3. 21. 11:34
엔티티의 생성, 변경한 사람과 시간을 추적(Auditing) 기본적으로 운영할 때는 등록일, 수정일, 등록자, 수정자를 모든 테이블에 적용하는 것이 좋다. 누가 등록했고, 누가 수정했는지 추적하기가 쉽다. 유지보수에 용이 순수 JPA 사용의 Auditing @MappedSuperclass : 해당 필드들을 사용할 수 있도록 맵핑해주는 어노테이션 @PrePersist : 저장할 때 이벤트 실행 @PreUpdate : 수정할 때 이벤트 실행 1. 모든 Entity에 적용하는 공통 Entity 생성 @MappedSuperclass @Getter public class JpaBaseEntity { @Column(updatable = false) private LocalDateTime createdDate; pr..
-
Spring Data JPA - 사용자 정의 리포지토리 구현Spring/Spring Data JPA 2022. 3. 21. 10:47
사용자 정의 리포지토리 구현 Spring Data JPA에서 제공하는 JpaRepository 인터페이스는 스프링이 구현체를 자동으로 생성해준다. Spring Data JPA가 제공하는 인터페이스를 직접 구현하면 구현해야 하는 메서드들이 너무 많다. 사용자 정의 리포지토리 구현 - JpaRepository의 메서드들을 오버라이드 안 해도 된다. 인터페이스의 메서드를 직접 구현 - 사용자 정의 리포지토리 사용 - JPA 직접 사용 - 스프링 JDBC Template 사용 - MyBatis 사용 - 데이터베이스 커넥션 직접 사용 등 - Querydsl 사용 사용자 정의 리포지토리 구현 1. 사용자 정의 인터페이스 생성 public interface MemberRepositoryCustom { List fin..
-
Spring Data JPA - @EntityGraphSpring/Spring Data JPA 2022. 3. 20. 19:51
@EntityGraph @EntityGraph를 이용하여 연관된 엔티티들을 SQL 한번에 조회할 수 있다. 주 엔티티에서 연관 관계를 맺고 있는 엔티티를 fetch join 해준다. JPQL fetch join @Query("select m from Member m left join fetch m.team") List findMemberFetchJoin(); @EntityGraph @EntityGraph는 fetch join을 간단하게 쓸 수 있는 방법이다. LEFT OUTER JOIN 사용 //공통 메서드 오버라이드 @Override @EntityGraph(attributePaths = {"team"}) List findAll(); //JPQL + 엔티티 그래프 @EntityGraph(attribute..