[백엔드] 스프링 부트와 JPA 활용 3 - 상품, 주문 도메인 개발

유승선 ·2022년 7월 28일
0

이번 강의에서는 상품과 주문 도메인 개발에 목적을 두고 코드를 작성했다. 회원 도메인을 작성하는 단계에서부터 꽤 단순했고 특히 리포지토리를 만드는 과정은 정말 비슷했기때문에 같은 작업에 @Getter @Setter, @RequiredArgsConstructor 등등에 어노테이션은 이제 익숙 해진거같다.

상품 엔티티 개발 (비즈니스 로직 추가)

상품 엔티티 개발

아이템 클라스에 두가지 로직이 추가된것을 확인할 수 있다. 첫번째는 addStock, 그리고 removeStock 인데 정말 단순히 재고가 늘어나고 줄어들고를 구현한 코드기에 코드 자체로만 봐도 단순하다. 다만 여기서 배운점은,

엔티티 자체가 해결할수 있는 로직 같은 경우 엔티티 안에 비즈니스 로직을 적는게 가장 객체지향적인 코드이다

추가적으로, NotEnoughStockException 이라는 클래스는 따로 구현을 해준것을 확인할 수 있다.

extends RuntimeException 을 해주었고 Override 방식으로 메서드를 import 해준 결과이다. 자바 자체에서 배우는 코드라고 생각하지만 상당히 유용하고 신기해서 활용을 더 해보고 싶다.

상품 리포지토리 개발

상품 리포지토리 개발

아이템을 관리할 수 있는 리포지토리를 또 따로 만든다는 점이 개인적으로 궁금하고 더 알아가보고 싶은 부분이다. 그냥 모든 리포지토리를 한번에 만드는것도바는 이게 더 나을거같기도 한 느낌..리포지토리 개발은 단순했다.

다만 findOne은 EntityManager 클래스로 바로 find() 메서드를 불러서 찾을 수 있는 반면에, findAll() 메서드는 JPQL 을 사용하는것만 이해하면 될거같다.

상품 서비스 개발

상품 서비스 개발

큰 설명 필요없이 이미 이전에 아이템 리포지토리에서 모든 구현적인 코드를 다 만들어서 서비스 클래스에서는 리포지토리에 기능들을 불러오는 역활만 하고 있다.

주문, 주문 상품 엔티티 개발

주문, 주문상품 엔티티 개발

이 프로젝트에 가장 핵심 기능인 주문 상품 개발 클래스이다.

오더 클래스에서 추가해준 기능들인데. 생성자 메서드로 구현체로 만들어서 모든 정보를 넣어준게 가장 인상적이었다.

그리고 createOrder 클래스를 잘 보면은 OrderItem 클래스 옆에 ... 으로 구성된걸 볼 수 있는데 너무 궁금해서 찾아보았다. 자세한 설명 여기에서 알게되었지만 ... 을 붙힐 경우 일반적인 for 룹도 돌릴수 있고 하나 이상의 아이템을 넣어서 계산할 수 있기에 저런식으로 넣어준것이다.

cancel 같은 경우 delivery status 를 업데이트 시켜주었고 오더 아이템에 cancel() 로직을 이용해주며 재고 수량을 올려주었다.

오더 아이템에 메서드 목록이고, 오더 클래스와 비슷하게 생성자 메서드를 통해 비즈니스 로직을 추가 해주었다.

주문 리포지토리 개발

주문 리포지토리 개발

이번에도 큰 설명 필요없는 비슷한 형태에 리포지토리를 만들어 주었다. 다만 검색을 통한 쿼리 설정을 하는 코드가 어려웠는데. 실무에서도 잘 안쓰이는 메서드를 설명한 만큼, 그냥 저런 기능이 있다 정도만 생각하면 될거같다.

주문 서비스 개발

주문 서비스 개발

어떻게 보면 핵심 기능을 구현한 클래스기도 하고 여러가지 리포지토리를 활용하며 데이터를 가지고 오는 작업이 정말 중요했다.

생성자 메서드를 사용하며 구성을 했던 코드 덕에 리포지토리에서 맞는 정보만 얻는다면은 바로 주문 상품 객체를 만들면서 생성해주었고 이게 생성자 메서드에 가장 큰 장점이 아닐까 싶다.

가장 기본적인 의존관계 설정은 @RequiredArgsConstructor 로 구현을 해주었고 @Transactional 노테이션도 중요하게 적어줘야 하는것도 알 수 있었다.

추가적으로,

OrderItem 컨스트럭터에 이렇게 NoArgsConstructor 로 써준것을 볼 수 있는데, 생성자 메서드를 사용하는게 아닌 @Setter 메서드를 써서 정보를 입력해주는것을 방지하기 위해 protected 로 객체를 감싸주는 역활을 하고 있다고 생각하면 될거같다.

지금까지 코드를 쓰면서 사용했던 메서드는 위에서 설명하는 도메인 모델 패턴이라고 정의한다.

배운점

배운점

이제 강의도 거의 다 끝나가는 시점이지만 꽤 많이 배웠고 점점 스프링 어노테이션에 익숙해지고 있는 단계인거같다. 다만, 의존관계 주입과 객체지향형 프로그래밍에 대한 공부는 이번 강의가 끝나고도 다시한번 보면서 리마인드 할 필요가 있다고 생각하기에 계속 돌아보면서 생각할 예정이다. 그리고 검색을 이용한 쿼리 설정같은 경우는 어려운 구현 같았고 더 자세 알아봐야겠다.

profile
성장하는 사람

0개의 댓글