커머스 시스템을 만들면서, 튜터님과 책임과 열할에 대해 많은 얘기를 나눴는데,
코드를 작성하다보니 아 이건 내가 잘못 생각하고 절적하게 배분하지 못한거같다는 부분이 생겨서 TIL을 작성하려고 합니다.
문제
발생원인
이슈가 발생한 부분은 cart를 제작하면서 였습니다. 클래스를 다 만들고, 이제 커머스 시스템에서 카드를 관리하는 시스템을 만들려 생각을 해보니.
"음.. 근데 커머스 시스템은 결제, 고객, 상품등을 통제해주는 객체인데, 그럼 카트 관리는 카트에서 해야하지 않을까??" 라는 생각이 들었습니다.
그래서 이런 CartController라는 메서드를 만들었습니다.
package org.commerce;
import java.util.*;
import java.util.stream.Collectors;
public class Cart {
private final List<CartItem> items = new ArrayList<>();
...생략...
// 커머스 시스템에서 처음에 이런 서비스를 만들려했는데 튜텨님과 대화하다보니 카트를 관리하는 서비스인데,
// 왜 커머스 시스템에 만들지? 여기서 만들어서 커머스시스템은 그냥 활용만 하면 되는거 아닌가? 생각이 들었습니다.
public void cartController(Scanner sc) {
if (this.items.isEmpty()) {
System.out.println("장바구니가 비어있습니다.");
return;
}
System.out.println("=================================== 장바구니 =============================================");
System.out.println("장바구니 리스트");
System.out.println(this);
System.out.println("1. 상품구매 | 2. 수량 조절 | 3. 상품 삭제 | 0. 뒤로");
int cartMenu = sc.nextInt();
if (cartMenu == 0) {
return;
}
System.out.println("원하는 상품을 선택 해주세요.");
String inputCardItemId = sc.next().trim();
switch (cartMenu) {
case 1 -> System.out.println("상품 구매 프로세스");
case 2 -> {
System.out.println("추가 혹은 뺴기 원하는 수를 입력 해 주세요 ex) 추가 : 4 빼기 : -4");
int itemCount = sc.nextInt();
manageItemQuantity(inputCardItemId , itemCount);
}
case 3 -> removeItem(inputCardItemId);
}
}
...
}
사실 저 생각이 어느정도는 맞다고 지금도 생각은합니다.
다만 "관리한다" 라는 범위가 어디 까지일까요? 지금 제가 만드는 서비스는 자바로 만드는 일종의 프로그램입니다. 그럼 커머스 시스템이라는 객체는 고객과 소통하면서 고객이 원하는 서비스를 이용할 수 있게 해주는 메뉴 컨트롤러 같은 존재라면,
카트, 상품, 카테고리, 고객 등등의 객체는 그 안에서 활용하는 일종의 "데이터" 일것입니다.
즉, 사용자는 커머스 시스템만 보면 될 것이고, 커머스 시스템은 각각의 객체가 제공해주는 메서드(서비스)들을 사용자가 이용할 수 있게 해주는 중간 다리 역할 이 될것입니다.
그렇다면, 지금 카트에서 제공하는 저 서비스는 무엇일까요? 조금 다르지만 고객이 커머스시스템을 "직접" UI적으로 통제를 하는 상황같습니다.
여기서 카트의 책임과 역할은
책임 : 고객의 장바구니 데이터를 관리 할 수 있어야하고, 다른 고객이나 커머스 시스템, 관리자 등이 볼 수 없게 통제해야한다.
역할 : 장바구니로서 장바구니안에 물건을 담고 빼고 할 기능을 제공한다.
저는 이렇게 생각했습니다.
그럼 여기에 "카트는 고객에게 직접적으로 장바구니를 제어 할 수 있는 입력, 흐름을 제공 해야하는가?" 에 대해서 고민해보자면, 이는 아닌거같습니다.
흐름 제어의 역할은 오롯이-> 커머스 시스템의 것일겁니다.
해결
해당 메서드를 카트가 아니라 커머스 시스템이 관리하도록 변경 해 주어야 했습니다.
// 흐름 제어는 커머스 시스템에서 해주는게 맞다고 생각이 변함...
private void cartController() {
Cart cart = customer.cart;
if (cart.getItems().isEmpty()) {
System.out.println("장바구니가 비어있습니다.");
return;
}
System.out.println("=================================== 장바구니 =============================================");
System.out.println("장바구니 리스트");
System.out.println(this);
System.out.println("1. 상품구매 | 2. 수량 조절 | 3. 상품 삭제 | 0. 뒤로");
int cartMenu = sc.nextInt();
if (cartMenu == 0) {
return;
}
System.out.println("원하는 상품을 선택 해주세요.");
String inputCardItemId = sc.next().trim();
switch (cartMenu) {
case 1 -> System.out.println("상품 구매 프로세스");
case 2 -> {
System.out.println("추가 혹은 뺴기 원하는 수를 입력 해 주세요 ex) 추가 : 4 빼기 : -4");
int itemCount = sc.nextInt();
cart.manageItemQuantity(inputCardItemId , itemCount);
}
case 3 -> cart.removeItem(inputCardItemId);
}
}
느낀점.
이 과정이 진짜 저에겐 솔직히 조금 어려웠습니다, 책임과 역할을 부여하고 이를 겹치지 않게 나누고, 관리한다는게 쉬운 과정은 아니라고 생각이 들었고, 이걸 잘못했을때 메서드를 거의 다시 만드는 이런 쓸데없는 생산성 하락까지 경험하니... 이 과정이 얼마나 중요하고 어려운것인지 알게되었습니다.
생각보다 이 과정을 빡빡하게 잡아야할지 아니면 러프하게 잡고 천천히 좁혀나가는 과정을 겪어야 할지 아직 저에겐 조금 더 고민해보고 생각해봐야할 숙제같습니다.
'이슈' 카테고리의 다른 글
| [트러블 슈팅] spring swagger 버전 이슈 ControllerAdviceBean (0) | 2026.02.05 |
|---|---|
| [트러블 슈팅] "List.add()해도 추가되지 않는 이슈" - 불변 객체 건드리기. (1) | 2026.01.22 |
| [트러블슈팅]java.lang.NullPointerException: Cannot invoke "java.util.List.stream()" because "this.items" is null (1) | 2026.01.21 |
| 제네릭에 extends Number를 해도 사칙연산이 안되는 이유 (0) | 2026.01.14 |
| Next.js 서버컴포넌트(SSR)에서 서버 통신시 쿠키 세팅 안됨이슈 (0) | 2025.12.16 |