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이 사용할 Category, Product 객체를 생성하여 생성자를 통해 주입해 줌. (Product 객체는 우선 컬렉션에 포장한 뒤 Category 클래스 객체 생성 시 주입하였고, 이후 해당 Category 객체를 컬렉션에 포장한 뒤 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() 메서드 실행 후 상품을 선택했을 때, '장바구니에 추가하겠습니까?'라는 안내와 함께 예/아니오 선택 옵션이 출력됨. 해당 입력을 받으면 선택한 상품이 장바구니에 추가 후 메인으로 돌아감.

'Projects > Java [Personal]' 카테고리의 다른 글
| Test - 1부 (0) | 2026.02.12 |
|---|---|
| [CS 기초] 오버플로우 (0) | 2026.01.14 |
| [프로젝트 리뷰] 계산기 만들기 과제 (0) | 2025.12.16 |
| [Java] 문자열을 Enum으로 변환하는 메서드를 static으로 작성해야 하는 이유 (0) | 2025.12.10 |
| [Java] 특정 문자열을 입력해야만 무한루프를 종료하는 기능 구현 (Con'd) (2) | 2025.12.09 |