[spring Boot]_15일차_REST API-2 성능최적화

youuu·2022년 11월 7일
0

SPRING

목록 보기
24/33

JPA관점에서 성능 최적화 ➡ Fetch Join

  • 다대일(ManytoOne)의 기본은 Eager 였으나 그럴경우 다 부름. ➡ 성능 최적화를 위해 Lazy로 변경
  • Lazy로 한것 중에서 한번에 보낼것은 Fetch Join을 사용.

  • 새 프로젝트 oBootJpaApi02 만들기

yml > oBootJpaApi01에서 복붙

  • 기본 패키지4개 만들기.

  • oBootJpa03 에서 domain, domain.item 클래스 복붙.


이전파일 -> API로 만들기.


📋 Order.java

연관관계를 확실히 하기.

  1. 연관관계 매핑
  2. @OneToMany를 쓸 경우 mappedBy를 걸어주기. (읽기 전용)
    • @ManyToOne이 있는 OrderItem.java가 주인이다.
// 주문상태 [ORDER, CANCEL]
	@Enumerated(EnumType.STRING)
	private OrderStatus status;
	
	@OneToMany(mappedBy = "order")
	private List<OrderItem> orderItems = new ArrayList<>();


📋 OrderRepository.java

package com.oracle.oBootJpaApi02.repository;

import javax.persistence.EntityManager;
import org.springframework.stereotype.Repository;
import lombok.RequiredArgsConstructor;

@Repository
@RequiredArgsConstructor
public class OrderRepository {
	
	private final EntityManager em;
}


📋 OrderService.java

package com.oracle.oBootJpaApi02.service;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.oracle.oBootJpaApi02.repository.OrderRepository;

import lombok.RequiredArgsConstructor;

@Service
@Transactional
@RequiredArgsConstructor
public class OrderService {
	
	private final OrderRepository orderRepository;
	
}


📋 SimpleOrderDto.java

유저가 필요한 정보만 넘기기 위해 따로 만듬

package com.oracle.oBootJpaApi02.controller;

import java.time.LocalDateTime;

import com.oracle.oBootJpaApi02.domain.Address;
import com.oracle.oBootJpaApi02.domain.Order;
import com.oracle.oBootJpaApi02.domain.OrderStatus;

import lombok.Data;

@Data
public class SimpleOrderDto {
	private Long 			orderId;
	private String 			name;
	private LocalDateTime	orderDate; //주문시간
	private OrderStatus 	orderStatus;
	private Address 		address;
	
	// 유저가 필요한 정보만 넘기기 위해 따로 만듬
	public SimpleOrderDto(Order order) { 
		orderId 	= order.getId();
		name 		= order.getMember().getName();
		orderDate 	= order.getOrderDate();
		orderStatus	= order.getStatus();
		address 	= order.getDelivery().getAddress();
	}
}


📌📋 OrderRestApiController.java

package com.oracle.oBootJpaApi02.controller;

import java.util.List;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import com.oracle.oBootJpaApi02.service.OrderService;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@RestController
@RequiredArgsConstructor
@Slf4j
public class OrderRestApiController {

	private final OrderService orderService;
	
	@GetMapping("/restApi/ordersV21")
	public List<SimpleOrderDto> ordersV21(){
		List<SimpleOrderDto> result = null;
		log.info("OrderRestApiController /restApi/ordersV21 START ============");
		result = orderService.serviceOrdersV21();
		
		return result;
	}
}


SERVICE로 이동

📋 OrderService.java

유저가 필요한 정보만 넘기기 위해 따로 만듬
만들고 service로 넘기기

@Service
@Transactional
@RequiredArgsConstructor
@Slf4j
public class OrderService {
	
	private final OrderRepository orderRepository;

	public List<SimpleOrderDto> serviceOrdersV21() {
		log.info("OrderService serviceOrdersV21 START ===========");
		List<Order> orders = orderRepository.findAll();
		return null;
	}


📋 OrderRepository.java

유저가 필요한 정보만 넘기기 위해 따로 만듬

package com.oracle.oBootJpaApi02.repository;

import java.util.List;

import javax.persistence.EntityManager;
import org.springframework.stereotype.Repository;

import com.oracle.oBootJpaApi02.domain.Order;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

@Repository
@RequiredArgsConstructor
@Slf4j
public class OrderRepository {
	
	private final EntityManager em;

	public List<Order> findAll() {
		log.info("OrderRepository findAll START ============");
		List<Order> orderList = em.createQuery("select o from Order o", Order.class) //Order는 객체이름
							 	  .getResultList();
		return orderList;
	}
}
profile
공부중인 주니어 개발자

0개의 댓글