김영한JPA27 [JPA] 실무 활용 - 순수 JPA와 Querydsl 내가 공부한 것을 올리며, 중요한 단원은 저 자신도 곱씹어 볼 겸 상세히 기록하고 얕은 부분들은 가볍게 포스팅하겠습니다. 이번 글은 다음과 같은 순서로 이어질 것 이다. 순수 JPA 리포지토리와 Querydsl 동적쿼리 Builder 적용 동적쿼리 Where 적용 조회 API 컨트롤러 개발 1. 순수 JPA 리포지토리와 Querydsl " data-ke-type="html"> HTML 삽입 미리보기할 수 없는 소스 우선 순수 JPA를 기반으로 repository를 하나 만들자. Repository public class MemberJpaRepository { private final EntityManager em; private final JPAQueryFactory jpaQueryFactory; pub.. BackEnd/JPA 2022. 5. 15. [JPA] QueryDSL 중급문법 - 1 내가 공부한 것을 올리며, 중요한 단원은 저 자신도 곱씹어 볼 겸 상세히 기록하고 얕은 부분들은 가볍게 포스팅하겠습니다. 1. 프로젝션과 결과 반환 - 기본 " data-ke-type="html"> HTML 삽입 미리보기할 수 없는 소스 프로젝션이란 열 단위로 조회하는 것을 의미한다. (select는 행 단위 조회) 프로젝션 대상이 하나면 타입을 명확하게 지정할 수 있다. 프로젝션 대상이 둘 이상이면 튜플이나 DTO로 조회할 수 있다. 1-1) 프로젝션 대상이 하나인 경우 @Test public void simple_projection_test() { List result = queryFactory .select(member.username) .from(member) .fetch(); for (Strin.. BackEnd/JPA 2022. 5. 14. [JPA] 스프링 데이터 JPA 분석 내가 공부한 것을 올리며, 중요한 단원은 저 자신도 곱씹어 볼 겸 상세히 기록하고 얕은 부분들은 가볍게 포스팅하겠습니다. 1. 스프링 데이터 JPA 구현체 분석 " data-ke-type="html"> HTML 삽입 미리보기할 수 없는 소스 이번시간에는 Spring Data JPA가 어떻게 동작하는지 내부적인 구현체를 분석해보자! SimpleJpaRepository가 핵심 구현체 이다! @Repository @Transactional(readOnly = true) public class SimpleJpaRepository ... { @Transactional public S save(S entity) { if (entityInformation.isNew(entity)) { em.persist(entity.. BackEnd/JPA 2022. 5. 6. [JPA] 확장 기능 내가 공부한 것을 올리며, 중요한 단원은 저 자신도 곱씹어 볼 겸 상세히 기록하고 얕은 부분들은 가볍게 포스팅하겠습니다. 1. 사용자 정의 리포지토리 구현 " data-ke-type="html"> HTML 삽입 미리보기할 수 없는 소스 이번 시간에는 실무에서 매우 중요한 내용이다. Spring Data JPA Repository는 인터페이스만 정의하고 구현체는 스프링이 자동 생성하게 된다. 문제는! Spring Data JPA가 제공하는 인터페이스에서 일부를 수정하려면 나머지 인터페이스 들도 모두 직접 구현해야 하기 때문에 현실적이지 못하다. 또한 다른 기술들, 예를 들어 MyBatis, QueryDsl 과 같은 기능도 함께 사용하고 싶다면? 다양한 이유로 인터페이스의 메서드를 직접 구현하고 싶다면 어떻.. BackEnd/JPA 2022. 5. 6. [JPA] 쿼리 메소드 기능 - 3 내가 공부한 것을 올리며, 중요한 단원은 저 자신도 곱씹어 볼 겸 상세히 기록하고 얕은 부분들은 가볍게 포스팅하겠습니다. 7. 순수 JPA 페이징과 정렬 " data-ke-type="html"> HTML 삽입 미리보기할 수 없는 소스 이번 시간에는 순수하게 JPA를 사용해 페이징 처리를 해보고, 다음번에 Spring Data JPA를 통해 페이징 처리를 하자. 다음 조건에 맞도록 페이징 처리를 해보자. 검색 조건: 나이가 10살 정렬 조건: 이름으로 내림차순 페이징 조건: 첫 번째 페이지, 페이지당 보여줄 데이터는 3건 우선 Repository 코드는 다음과 같다. @Repository public class MemberJpaRepository { @PersistenceContext private Ent.. BackEnd/JPA 2022. 5. 4. [JPA] 공통 인터페이스 기능 내가 공부한 것을 올리며, 중요한 단원은 저 자신도 곱씹어 볼 겸 상세히 기록하고 얕은 부분들은 가볍게 포스팅하겠습니다. 이번 시간에는 우선 순수한 JPA기반의 repository를 만들어 본 후, 이를 점차 Spring Data JPA를 사용하도록 변경할 것 이다. 1. 순수 JPA 기반 리포지토리 만들기 " data-ke-type="html"> HTML 삽입 미리보기할 수 없는 소스 우선 Team Repository의 코드는 다음과 같다. @Repository public class TeamRepository { @PersistenceContext private EntityManager em; public Team save(Team team) { em.persist(team); return team;.. BackEnd/JPA 2022. 5. 3. [JPA] 예제 도메인 모델 내가 공부한 것을 올리며, 중요한 단원은 저 자신도 곱씹어 볼 겸 상세히 기록하고 얕은 부분들은 가볍게 포스팅하겠습니다. 1. 예제 도메인 모델과 동작확인 " data-ke-type="html"> HTML 삽입 미리보기할 수 없는 소스 앞으로 활용할 간단한 도메인 entity를 하나 만들어보자. 다음과 같다. 위 다이어그램을 통해 만들어지는 Entity는 다음과 같다. Member : Team = N : 1 의 연관관계를 가지고 있다. 1. Member 코드 @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @ToString(of = {"id", "username", "age"}) public class Member { @Id @Gen.. BackEnd/JPA 2022. 5. 2. [JPA] Open Session In View (OSIV) 내가 공부한 것을 올리며, 중요한 단원은 저 자신도 곱씹어 볼 겸 상세히 기록하고 얕은 부분들은 가볍게 포스팅하겠습니다. 1. OSIV와 성능 최적화 " data-ke-type="html"> HTML 삽입 미리보기할 수 없는 소스 JPA의 Entity Manager를 Hibernate에서는 Session이라 부른다. Spring Boot의 프로젝트를 실행해보면 WARN이 기본적으로 하나 뜬다. spring.jpa.open-in-view is enabled by default. Therefore, database queries may be performed during view rendering. Explicitly configure spring.jpa.open-in-view to disable this .. BackEnd/JPA 2022. 4. 24. [JPA] 컬렉션 조회 최적화 - 4 내가 공부한 것을 올리며, 중요한 단원은 저 자신도 곱씹어 볼 겸 상세히 기록하고 얕은 부분들은 가볍게 포스팅하겠습니다. 7. 주문 조회 V6: JPA에서 DTO로 직접 조회, 플랫 데이터 최적화 " data-ke-type="html"> HTML 삽입 미리보기할 수 없는 소스 이번시간에는 지난 V5 버전을 더욱 최적화 하여 쿼리1 번으로 끝내보자! 우선 컨트롤러는 다음과 같다. @GetMapping("/api/v6/orders") public List ordersV6() { return orderQueryRepository.findAllByDtoFlat(); } 이번에는 데이터를 한번에 가져오기 위해 Order, OrderItems, Item을 전부 Join할 것 이다. 다만 그냥 Join을 하게 되면 .. BackEnd/JPA 2022. 4. 24. [JPA] 컬렉션 조회 최적화 - 3 내가 공부한 것을 올리며, 중요한 단원은 저 자신도 곱씹어 볼 겸 상세히 기록하고 얕은 부분들은 가볍게 포스팅하겠습니다. 5. 주문 조회 V4: JPA에서 DTO 직접 조회 " data-ke-type="html"> HTML 삽입 미리보기할 수 없는 소스 이번 시간에는 DTO를 직접 반환하도록 코드를 변경해 보자. join을 해도 tuple의 수가 증가하지 않는 ToOne 관계는 JOIN으로 최적화 하기 쉬우므로 한번에 조회하고, ToMany 관계는 최적화 하기 어려우므로 findOrderItems() 같은 별도의 메서드를 만들어 처리할 것 이다. 우선 컨트롤러는 다음과 같다. @GetMapping("/api/v4/orders") public List ordersV4() { return orderQuery.. BackEnd/JPA 2022. 4. 24. [JPA] 컬렉션 조회 최적화 - 2 내가 공부한 것을 올리며, 중요한 단원은 저 자신도 곱씹어 볼 겸 상세히 기록하고 얕은 부분들은 가볍게 포스팅하겠습니다. 3. 주문 조회 V3: 엔티티를 DTO로 변환 - 페치 조인 최적화 " data-ke-type="html"> HTML 삽입 미리보기할 수 없는 소스 이번시간에는 Fetch Join을 통해 N+1 문제를 해결해보자. 이번 글에서 원래목적은 Order : OrderItems = 1 : N 의 관계에서, Order 기준에서 페이징처리를 하는 것 이 목적이다. 1) 컬력션 Fetch Join과 문제점 변경된 컨트롤러는 다음과 같다. @GetMapping("/api/v3/orders") public List ordersV3() { List orders = orderRepository.findA.. BackEnd/JPA 2022. 4. 23. [JPA] 컬렉션 조회 최적화 - 1 내가 공부한 것을 올리며, 중요한 단원은 저 자신도 곱씹어 볼 겸 상세히 기록하고 얕은 부분들은 가볍게 포스팅하겠습니다. 1. 주문 조회 V1: 엔티티 직접 노출 " data-ke-type="html"> HTML 삽입 미리보기할 수 없는 소스 컬렉션 조회같은 경우 1:N 에서 N의 데이터 수가 3건 이라면, JOIN시 1쪽 또한 3건으로 증가해 버린다. Order - OrderItem - Item 의 연관관계가 (1 : N) (N : 1) 로 되어있는 상황이다. Order 와 Item의 다대다 관계를 중간 Order_Item 테이블을 통하여 만든 상황이다. 우선 다음 컨트롤러를 확인해 보자. @RestController @RequiredArgsConstructor public class OrderApiC.. BackEnd/JPA 2022. 4. 22. 이전 1 2 3 다음