Projects/Java [Personal]

[Java] 이커머스 프로그램 개발일지

montmer27 2025. 12. 18. 22:42

12.18 : 필수과제 마무리, 데이터를 외부에서 가져오는 방식으로 바꾸기 위해 develop 브랜치 새로 생성

 

변경 전

: Main에서 CommerceSystem 객체 생성 및 start() 메서드만 실행. 카테고리, 상품 객체 생성 및 할당은 모두 CommerceSystem 생성자에 맡김. CommerceSystem 객체는 3개의 Category 타입 멤버 변수를 가지며, 1개의 Customer타입 멤버 변수를 가짐

 

문제

1. 강한 결합(Tight Coupling) 문제

- Product 생성자 시그니처가 바뀌거나, 초기 상품 데이터를 바꾸고 싶을 때, CommerceSystem 클래스 자체를 수정해야 한다.

2. 테스트 어려움

- 생성자 외부에서 테스트용 Mock-Up 데이터를 만들어 넣을 수가 없음

3. 유연성 낮음

- 외부 DB나 파일에서 데이터를 읽어올 수 없음

4. 재사용성, 확장성 저하

- 이미 데이터가 들어있어 다른 프로젝트에서 재사용하기 번거로움

5. 단일 책임 원칙 위반(SRP)

- CommerceSystem, Category, Product 클래스가 나눠서 해야 할 일을 몰아주게 되어 유지보수가 어려워짐.

 

(변경 전) Main 클래스
(변경 전) CommerceSystem 클래스

변경 후

- Main에서 CommerceSystem이 사용할 Category, Product 객체를 생성하여 생성자를 통해 주입해 줌. (Product 객체는 우선 컬렉션에 포장한 뒤 Category 클래스 객체 생성 시 주입하였고, 이후 해당 Category 객체를 컬렉션에 포장한 뒤 CommerceSystem 객체 생성 시 주입해 주었다.

(변경 후) Main 클래스 - 1
(변경 후) Main 클래스 - 2

 

(변경 후) 더 간소화된 CommerceSystem 클래스

 

- 오늘의 커밋 목록

 

12/19 : 상품 선택 화면에서 장바구니에 담는 기능을 구현할 수 있도록 Category 클래스의 selectProduct() 메서드를 CommerceSystem의 메서드로 변경

 

AS-IS

카테고리 선택 메뉴에서 사용자의 입력값이 카테고리 개수 이내인 경우(즉 제품 카테고리를 선택한 경우), 해당 카테고리 객체에 접근하여 제품 선택 여부를 확인하도록 하였고, 이 기능은 해당 카테고리의 selectProduct() 메서드를 통해 구현.

해당 메서드는 userChoice라는 scanner 값을 받아서 boolean 값을 return하는데, 해당 메서드가 실행되고 사용자로부터 입력받은 값이 다음과 같을 때,

 

1) 0을 선택한 경우 : 뒤로가기로 간주하여 true를 return, 다시 제품 전체 출력 화면으로 넘어옴. (화면 속 무한루프문)

참고로 printCategory()가 해당 카테고리 내 제품 리스트를 출력하는 것이다. 

2) 제품 범위를 벗어난 경우 : 재입력받기 위해 경고 메시지 출력 후 true return. 결과는 상동

 

2) 1~마지막 제품까지의 번호 : 제품 선택으로 간주하여 false를 return, 무한루프를 탈출하고 이를 호출한 start() 함수로 다시 빠져나옴

 

TO-BE (구현 완료)

selectProduct() 메서드 실행 후 상품을 선택했을 때, '장바구니에 추가하겠습니까?'라는 안내와 함께 예/아니오 선택 옵션이 출력됨. 해당 입력을 받으면 선택한 상품이 장바구니에 추가 후 메인으로 돌아감.