실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발
스프링 핵심 원리 - 기본편 - 인프런
스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다. 초급 프레임워크 및 라이브러리 웹 개발 서버 개발 Back-End Spring 객체지향 온
www.inflearn.com
강의를 들으며 생각 정리 + "자바 ORM 표준 JPA 프로그래밍" 책 참고
상품 엔티티 개발(비즈니스 로직 추가)
Item 도메인에 다음 비즈니스 로직을 추가한다.
//==비즈니스 로직==//
/**
* stock 증가
*/
public void addStock(int quantity) {
this.stockQuantity += quantity;
}
/**
* stock 감소
*/
public void removeStock(int quantity) {
int restStock = this.stockQuantity - quantity;
if (restStock < 0) {
throw new NotEnoughStockException("need more stock");
}
this.stockQuantity = restStock;
}
위와 같은 비즈니스 로직은 서비스 로직에 넣어도 좋고, 위처럼 도메인에 넣어도 좋다. 여기서는 도메인 주도 설계 방식을 사용했다. 도메인 주도 설계는 도메인이 비즈니스 로직의 주도권을 가지고 개발하는 설계 방식을 말한다. 반대로 서비스는 엔티티를 호출하는 정도의 얇은 비즈니스 로직을 갖게 된다. stockQuantity같은 데이터를 가지고 있는 쪽에 비즈니스 메서드가 있는 것이 응집력이 좋다.
위처럼 도메인 주도 설계는 엔티티를 객체로서 사용하는 것이고, 엔티티가 아닌 서비스 로직에 비즈니스 로직을 넣는 것은 엔티티를 자료구조로서 사용하는 것이다.
상품 리포지토리 개발
기본 틀은 회원 리포지토리와 같으나 상품을 save하는 로직이 살짝 다르다.
public void save(Item item) {
if (item.getId() == null) {
em.persist(item);
} else {
em.merge(item);
}
}
회원 리포지토리의 save의 경우 단순히 persist를 했다면 상품 리포지토리의 save는 상품의 재고가 변하는 등 수정되는 상황을 고려한다. 처음 저장하는 상품(id==null)에 대해서는 persist를 하고 상품 id가 이미 있는 수정한 상품에 대해서는 merge(병합)를 사용한다. merge에 대해서는 뒤에서 다시 자세하게 다루겠다.
상품 서비스 개발
상품 서비스는 단순히 상품 리포지토리의 로직들을 호출하는 수준이다.
상품 서비스를 포함한 전체 코드를 깃허브에 등록했다.
'java > jpa' 카테고리의 다른 글
[JPA] 웹 계층 개발 (0) | 2021.04.20 |
---|---|
[JPA] 주문 도메인 개발 (0) | 2021.02.14 |
[JPA] 회원 도메인 개발 (0) | 2021.02.12 |
[JPA] 애플리케이션 구현 준비 (0) | 2021.02.11 |
[JPA] 도메인 분석 설계 (0) | 2021.02.11 |