Spring
-
Querydsl - DTO로 조회하기Spring/Querydsl 2022. 3. 25. 12:15
순수 JPA에서의 DTO 조회 new 명령어 사용해야 한다. DTO의 package 이름을 다 적어줘야하는 불편함이 있다. 생성자 방식만 지원한다. List result = em.createQuery( "select new study.querydsl.dto.MemberDto(m.username, m.age) " + "from Member m", MemberDto.class) .getResultList(); 위와 같은 순수 JPA에서의 DTO 조회 시 사용하기 불편했던 것들을 Querydsl에서 해결해준다. DTO로 조회하기 프로퍼티 접근 - setter 필드 직접 접근 생성자 사용 @QueryProjection 프로퍼티 접근 - setter Projections.bean(class, {field, .....
-
Querydsl - 프로젝션에 따른 결과 반환Spring/Querydsl 2022. 3. 25. 10:53
튜플은 repository 계층에서만 쓰는게 좋은 설계 프로젝션에 따른 결과 반환 프로젝션 : select문에서 가져올 데이터를 지정하는 것을 말한다. 프로젝션 대상이 하나면 타입을 명확하게 지정할 수 있다 프로젝션 대상이 둘 이상이면 튜플이나 DTO로 조회 프로젝션 대상이 하나 프로젝션 대상이 하나면 타입을 명확하게 지정 가능 List result = queryFactory .select(member.username) .from(member) .fetch(); List result = queryFactory .selectFrom(member) .fetch(); 프로젝션 대상이 둘 이상 프로젝션 대상이 둘 이상일 때는 Tuple이나 DTO로 조회 List result = queryFactory .sele..
-
JPA - OSIV와 성능 최적화Spring/JPA 2022. 3. 24. 10:33
OSIV와 성능 최적화 Open Session In View : 하이버네이트 Open EntityManager In View : JPA (관례상 OSIV라 한다) OSIV ON spring.jpa.open-in-view=true // OSIV 기본값 OSIV 전략은 트랜잭션 시작처럼 최초 데이터베이스 커넥션 시작 시점부터 API 응답이 끝날 때까지 영속성 컨텍스트와 데이터베이스 커넥션을 유지한다. 즉, 영속성 컨텍스트가 데이터베이스 커넥션을 응답을 보낼 때까지 유지하여 지금까지 View Template이나 API 컨트롤러에서 지연 로딩이 가능했던 것이다. 그런데 이 전략은 너무 오랜 시간 동안 데이터베이스 커넥션 리소스를 사용하기 때문에, 실시간 트래픽이 중요한 애플리케이션에서는 커넥션이 모자랄 수 있고..
-
Querydsl - Querydsl 기본 문법Spring/Querydsl 2022. 3. 23. 22:36
Querydsl 기본 문법 Querydsl 사용 방법 Q-Type 검색 조건 쿼리 결과 조회 정렬 페이징 집합 조인 - 기본 조인 조인 - on절 조인 - 페치 조인 서브 쿼리 Case 문 상수, 문자 더하기 기본 문법을 테스트하기 위한 데이터 @Autowired EntityManager em; JPAQueryFactory queryFactory; @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 Memb..
-
JPA - API 개발 고급(OneToMany 컬렉션 조회 최적화)Spring/JPA 2022. 3. 23. 17:31
API 개발 고급(컬렉션 조회 최적화) 엔티티 직접 노출 엔티티를 DTO로 변환 - 페치 조인 최적화 JPA에서 DTO 직접 조회 - 컬렉션 조회 최적화 대부분의 성능 문제는 조회에서 발생하므로 컬렉션인 OneToMany 관계에서의 조회에 대한 성능 최적화에 대해 알아보자. 엔티티 직접 노출 항상 강조하지만 엔티티를 직접 전달하는 방법은 여러 문제가 발생할 뿐만 아니라 유지보수에도 문제가 생긴다. 따라서 참고만 하고 DTO를 사용하자. 지연로딩으로 인한 문제 지연 로딩으로 인해 JSON은 Order 엔티티가 갖고 있는 OrderItem를 proxy 객체로 가지고 있게 된다. proxy 객체로 가지고 있다는 것은 실제로 OrderItem 엔티티의 정보가 없고 OrderItem 엔티티의 정보를 접근할 시점에..
-
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를 위한 모든 요청 요구사항..