주문 조회 V4: JPA에서 DTO 직접 조회 OrderApiController @GetMapping("/api/v4/orders") public List ordersV4() { return orderQueryRepository.findOrderQueryDtos(); } OrderQueryRepository private final EntityManager em; /** * 컬렉션은 별도로 조회 * Query: 루트 1번, 컬렉션 N 번 * 단건 조회에서 많이 사용하는 방식 */ public List findOrderQueryDtos() { // 루트 조회(toOne 코드를 모두 한번에 조회) List result = findOrders(); //루프를 돌면서 컬렉션 추가(추가 쿼리 실행) result...
주문 조회 V1: 엔티티 직접 노출 orderItem , item 관계를 직접 초기화하면 Hibernate5Module 설정에 의해 엔티티를 JSON으로 생성한다. 양방향 연관관계면 무한 루프에 걸리지 않게 한곳에 @JsonIgnore 를 추가해야 한다. 엔티티를 직접 노출하므로 좋은 방법은 아니다. 주문 조회 V2: 엔티티를 DTO로 변환 OrderApiController @GetMapping("/api/v2/orders") public List ordersV2() { List orders = orderRepository.findAllByCriteria(new OrderSearch()); List result = orders.stream() .map(o -> new OrderDto(o)) .collec..
주문 + 배송정보 + 회원을 조회하는 API 지연 로딩 때문에 발생하는 성능 문제를 단계적으로 해결! 간단한 주문 조회 V1: 엔티티를 직접 노출 → 사용하면 안 됨! 양방향이 걸리는 곳에 @JsonIgnore을 해주어야 함 지연로딩 LAZY로 되어 있다면 실제 엔티티 대신에 프록시를 가져옴 순수한 자바 객체가 아니므로 JSON에서 오류가 발생함 Hibernate5Module 을 스프링 빈으로 등록하면 해결(스프링 부트 사용중) 간단한 주문 조회 V2: 엔티티를 DTO로 변환 엔티티를 DTO로 변환하는 일반적인 방법 쿼리가 총 1 + N + N번 실행됨 order 조회 1번(order 조회 결과 수 N) order -> member 지연 로딩 조회 N 번, order -> delivery 지연 로딩 조회..
조회용 샘플 데이터 입력 userA JPA1 BOOK JPA2 BOOK userB SPRING1 BOOK SPRING2 BOOK InitDb @Component // 클래스를 빈으로 등록 @RequiredArgsConstructor public class InitDb { private final InitService initService; @PostConstruct // 의존성 주입이 이루어진 후 빈 초기화 수행 public void init() { initService.dbInit1(); initService.dbInit2(); } @Component @Transactional @RequiredArgsConstructor static class InitService { private final Enti..
@RestController : @Controller + @ResponseBody(데이터를 json이나 xml로 보냄) @RequestBody : json 데이터를 member에 매핑해 넣어줌 @Valid : javax validation 자동으로 수행 MemberApiController 회원 등록 API @PostMapping("/api/v1/members") public CreateMemberResponse saveMemberV1(@RequestBody @Valid Member member) { //@RequestBody -> json 데이터를 member에 매핑해 넣어줌, @Valid -> javax validation 자동으로 수행 Long id = memberService.join(member)..