당니의 개발자 스토리

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

스프링/실전! 스프링 부트와 JPA 활용1

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

clainy 2024. 4. 29. 20:36

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

이번 시간에는 상품 도메인을 개발해 보겠습니다.

상품 도메인의 구현 기능은 크게 3가지인데요.

먼저 상품을 이전에 봤던 화면을 생각해 보시면, 상품을 등록하고 상품 목록을 쭉 조회한 다음에, 마지막으로 상품을 수정할 수가 있습니다.

자 그리고 개발 순서는

먼저 상품 엔티티 도메인 자체에 비즈니스 로직을 추가할 겁니다. 그리고 상품 리포지토리를 개발하고 상품 서비스를 개발할 겁니다. 그런데 상품 기능을 테스트하는 것은 이번에는 생략할 거에요. 왜냐면 이게 약간 단순해서 이전과 비슷하기 때문입니다.

그러면 상품 엔티티 개발을 한번 해보겠습니다. 상품이니까 Item 클래스로 가셔야겠죠.

이제 두 가지 어떤 비즈니스를 넣을 거에요. 뭘 넣을 거냐면 재고를 늘리고 줄이는 걸 할 거예요. 예전에 상품을 주문할 때 보면 재고가 늘고 줄고 했죠. 그래서 그 로직이 여기 필요합니다.

왜냐면 이제 보통 도메인 주도 설계라고 할 때 이 엔티티 자체가 해결할 수 있는 것들이나 그런 것들은 주로 엔티티 안에 비즈니스 로직을 넣는 게 되게 좋거든요. 되게 객체 지향적인 거죠.

그래서 지금 stockQuantity 라는 재고 수량이 Item 엔티티 안에 있단 말이에요. 그러면 이 stockQuantity 라는 데이터를 가지고 있는 곳에 비즈니스 로직이 나가는 게 아무래도 가장 응집도가 있겠죠.

자 그래서 addStock으로 재고 수량을 더하고 싶은 거에요. 이게 재고 수량을 증가하는 로직입니다.

그 다음에는 이제 재고를 줄일 수가 있어요. 재고를 늘리는 거는 쭉 늘릴 수 있는데 줄이는 건 0보다 줄어들면 안 되겠죠. 그래서 그거를 체크하는 로직이 들어가야 됩니다.

현재 나의 수량에다가 파라미터로 넘어온 그 수량 값을 가지고, 남은 수량을 계산을 했어요. 그런데 만약에 남은 수량이 0보다 작단 말이에요. 그럼 이제 난리가 나겠죠.

그래서 이런 예외를 터트려버릴 거예요. NotEnoughStockException을 만들어야 되구요.

이제 이 체크가 통과하면 현재 나의 stockQuantity는 남은 수량으로 세팅을 하면 됩니다.

자 그래서 이제 NotEnoughStockException을 만들어 줄 거에요.

먼저 패키지를 만들어줄 건데, <- 를 누르면 패키지들이 하나씩 접힙니다.

공용으로 쓴다고 생각하고 패키지를 하나 만들어 줬고요. 여기에다가 NotEnoughStockException 클래스를 만들어주면 되겠죠.

이렇게만 만ㄷ르어 놓고, 다시 Item으로 돌아갈게요.

먼저 설명을 드리면, 여러분들은 보통 개발하실 때 막 ItemService 이런 데서 stockQuantity를 가져와서 거기서 막 stock을 더해서 값을 만든 다음에 마지막에 보통 Item.setStockQuantity 해서 결과를 넣는 식으로 코딩을 많이 하셨을 거에요.

근데 우리가 이제 객체 지향적으로 생각을 해보면 이 stockQuantity 라는 데이터를 가지고 있는 쪽에 비즈니스 메서드가 있는 게 가장 좋거든요. 그래야 응집력이 있죠.

그래서 이 재고를 넣고 빼는 로직은 stockQuantity 라는 정보를 사용하는데 이게 현재 Item 엔티티에 가지고 있단 말이에요. 그래서 여기에 있는 게 가장 관리하기가 좋아요.

그래서 여기에다 이제 핵심 비즈니스 로직을 엔티티에 직접 넣었습니다.

자 그리고 이제 NotEnoughStockException은

extends 해서 RuntimeException으로 만들고,

필요한 것들을 implementation 해주면 되는데, Override Method 해서

OK하면,

이렇게 쭉 나옵니다. 왜 Override를 해야 되냐면,

메세지 같은 거를 넘겨줘야 되고, 또 메세지랑 이 NotEnoughStockException 예외가 발생한 어떤 근원적인 Exception을 또 넣어서 그 Exception trace가 쭉 나오게 할 수 있거든요. 그런 것 때문에 이런 것들이 다 필요합니다. 여러분 이렇게 대략 넣었구요.

마지막 거는 필요없어 보여서 지우겠습니다.

이렇게 해서 기본적으로 Item 엔티티의 비즈니스 로직을 드디어 넣었습니다.

보시면 알겠지만, 저는 지금 편의를 위해서 Setter를 넣어놨는데 Setter를 넣는 게 아니라,

stockQuantity를 변경해야 될 일이 있으면 이런 식으로 핵심 비즈니스 메서드를 가지고 변경을 해야 되는 거예요.

막 Setter를 가지고 바깥에서 stockQuantity를 가져와서 여기서 어떻게 쭉쭉 계산해서 넣는 게 아니라, 그냥 이 Item 클래스 안에서 addStock, removeStock을 하고,

이 안에 필요한 Validation(확인, 검증)이 있으면 되는 거예요. 이게 가장 객체 지향적인 거겠죠.

자 이제 다음 시간에는 이걸 가지고 상품 리포지토리를 한번 개발해 보겠습니다.

'스프링 > 실전! 스프링 부트와 JPA 활용1' 카테고리의 다른 글

상품 서비스 개발  (0) 2024.04.29
상품 리포지토리 개발  (0) 2024.04.29
회원 기능 테스트  (0) 2024.04.27
회원 서비스 개발  (0) 2024.04.24
회원 리포지토리 개발  (0) 2024.04.24