백엔드/JPA
[JPA 활용2] [2] API 개발 고급 - 준비
RE-Heat
2023. 8. 31. 19:48
인프런 김영한 님의 강의를 듣고 작성한 글입니다.
[1] 조회용 샘플 데이터 입력
프로그램 실행할 때마다 데이터를 입력하는 게 번거로우므로 따로 샘플 데이터값이 들어갈 수 있도록 세팅
<샘플 데이터>
주문 2건
userA (구입한 책은 JPA 책 2권)
- JPA1 BOOK
- JPA2 BOOK
userB (구입한 책은 스프링 책 2권)
- SPRING1 BOOK
- SPRING2 BOOK
InitDb
/**
* 총 주문 2개
* userA
* JPA1 BOOK
* JPA2 BOOK
* userB
* SPRING1 BOOK
* SPRING2 BOOK
*/
@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);
}
private static Delivery createDelivery(Member member) {
Delivery delivery = new Delivery();
delivery.setAddress(member.getAddress());
return delivery;
}
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 static Member createMember(String name, String city, String street, String zipcode) {
Member member = new Member();
member.setName(name);
member.setAddress(new Address(city, street, zipcode));
return member;
}
private static Book createBook(String book, int price, int stockQuantity) {
Book book1 = new Book();
book1.setName(book);
book1.setPrice(price);
book1.setStockQuantity(stockQuantity);
return book1;
}
}
}
- @PostConstructor : 스프링 빈이 생성되는 시점에 실행되도록 하는 어노테이션이다.
- dbInit()을 @PostConstructor에 직접 넣어도 될 것 같지만, 스프링 라이프사이클이 있어 @Transactional이 제대로 동작하지 않을 수 있으므로 따로 분리한다.
- createMember, createBook으로 다시 쓰기 편하게끔 메소드화
- IntelliJ 윈도우 단축키 ctrl + alt + m으로 원하는 부분을 메소드화 할 수 있다.
- UserA, UserB에 파라미터 형식으로 넣는 방식으로 하면 IntelliJ가 알아서 처리해 준다. 단, 파라미터 변수명은 수정 필요할 수 있다.
- stockQuantity 같은 경우 모두 100으로 했더니 100 값이 들어갔는데, ctrl+alt+p를 눌러주면 알아서 파라미터화 해준다.
■ 실행결과
① 회원목록
② 상품목록
③ 주문내역
- userA와 userB는 각각 두 개의 상품을 시켰으나 샘플을 간략하게 만들기 위해 대표상품 1개만 화면에 노출되도록 만듦.
- 다시 말해 회원당 주문 내역을 하나만 출력했다는 의미다.