실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화 - 인프런 | 강의
스프링 부트와 JPA를 활용해서 API를 개발합니다. 그리고 JPA 극한의 성능 최적화 방법을 학습할 수 있습니다., 본 강의는 자바 백엔드 개발의 실전 코스에 있는 활용2 강의 입니다. 스프링 부트와 J
www.inflearn.com
강의를 들으며 생각 정리 + "자바 ORM 표준 JPA 프로그래밍" 책 참고
API 개발 고급 소개
이제부터 실무에서 자주 발생하는 이슈들을 성능 최적화 관점에서 API를 개발해 볼 것이다.
일반적으로 데이터 등록, 수정은 성능 문제가 거의 발생하지 않는다. 보통 장애의 90%는 데이터 조회가 문제이다. 앞으로 조회 기능을 중심으로 성능 최적화를 알아보자.
조회용 샘플 데이터 입력
조회 기능이 중심이기 때문에 미리 데이터를 입력해 놓는다. 프로그램 실행할 때마다 데이터를 일일이 입력하고 조회하는 것이 번거롭기 때문이다.
<샘플 데이터>
주문 2건
userA
- JPA1 BOOK
- JPA2 BOOK
userB
- SPRING1 BOOK
- SPRING2 BOOK
<InitDb.java>
@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 EntityManager em;
public void dbInit1() {
Member member = createMember("userA", "서울", "1", "1111");
em.persist(member);
Book book1 = createBook("JPA1 BOOK", 10000, 100);
em.persist(book1);
Book book2 = createBook("JPA2 BOOK", 20000, 100);
em.persist(book2);
OrderItem orderItem1 = OrderItem.createOrderItem(book1, 10000, 1);
OrderItem orderItem2 = OrderItem.createOrderItem(book2, 20000, 2);
Delivery delivery = createDelivery(member);
Order order = Order.createOrder(member, delivery, orderItem1, orderItem2);
em.persist(order);
}
public void dbInit2() {
Member member = createMember("userB", "진주", "2", "2222");
em.persist(member);
Book book1 = createBook("SPRING1 BOOK", 20000, 200);
em.persist(book1);
Book book2 = createBook("SPRING2 BOOK", 40000, 300);
em.persist(book2);
OrderItem orderItem1 = OrderItem.createOrderItem(book1, 20000, 3);
OrderItem orderItem2 = OrderItem.createOrderItem(book2, 40000, 4);
Delivery delivery = createDelivery(member);
Order order = Order.createOrder(member, delivery, orderItem1, orderItem2);
em.persist(order);
}
private Member createMember(String name, String city, String street, String zipode) {
Member member = new Member();
member.setName(name);
member.setAddress(new Address(city, street, zipode));
return member;
}
private Book createBook(String name, int price, int stockQuantity) {
Book book2 = new Book();
book2.setName(name);
book2.setPrice(price);
book2.setStockQuantity(stockQuantity);
return book2;
}
private Delivery createDelivery(Member member) {
Delivery delivery = new Delivery();
delivery.setAddress(member.getAddress());
return delivery;
}
}
}
<@Component>
컴포넌트 스캔의 대상이 되어 스프링 빈으로 등록이 된다.
<@PostContruct>
스프링 빈이 등록되고 의존관계 주입까지 끝나면 @PostContruct가 붙은 메서드를 통해 초기화 과정을 진행한다.
+) @PostContruct 메서드에 @Transactional이 있으면 오류가 발생하는 경우가 있기 때문에 @PostConstruct는 아래 트랜잭션 로직을 호출하는 정도로 설정했다.
앞으로 이렇게 미리 등록한 데이터로 개발을 진행할 것이다.
지금까지는 Member 엔티티 하나만 사용하는 API를 개발했는데 이제부터 연관관계가 걸린 API들은 어떻게 해결하는지 알아보자.
+) 2021.05.18 추가
참고자료 : JSON 데이터를 스프링 부트를 통해 데이터베이스에 저장하는 방법
https://www.danvega.dev/blog/2017/07/05/read-json-data-spring-boot-write-database/
'java > jpa' 카테고리의 다른 글
[JPA] API 개발 고급 - 컬렉션 조회 최적화 (0) | 2021.05.19 |
---|---|
[JPA] API 개발 고급 - 지연 로딩과 조회 성능 최적화 (0) | 2021.05.18 |
[JPA] API 개발 기본 (0) | 2021.05.17 |
[JPA] 웹 계층 개발 (0) | 2021.04.20 |
[JPA] 주문 도메인 개발 (0) | 2021.02.14 |