필수기능 과제 수행 간 작성했던 트러블슈팅 링크
진행중인 GitHub Repository 링크
GitHub - sjww0604/CommerceProject: 커머스 과제 구현 레포지토리입니다.
커머스 과제 구현 레포지토리입니다. Contribute to sjww0604/CommerceProject development by creating an account on GitHub.
github.com
☠️트러블 슈팅
- 발생한 Issue
- 1️⃣ 기본 설정 관련
- ① 필수기능 진행 이후 기본적인 코드 리팩토링 과정에서 메서드명, 변수명 선언부를 수정하다 코드가 꼬여버리는 상황이 발생
- 리팩토링을 하고자 했던 주 목적
: 가독성 및 유지보수성을 향상시키고 싶었고, 비즈니스 로직 클래스에 다양한 기능들이 추가되다보니 사용한 메서드,변수명, 클래스 명등이 명확하게 구분되지 않고 혼선을 일으킬 가능성이 높아서 이를 해소하고자 했음
- 리팩토링을 하고자 했던 주 목적
- 병렬 배열 → 단일 배열로 수정하는 과정 중 인덱스 값 관리 실수 발생
- Index Mismatch 로 인해 특정 상품을 장바구니에 추가하는 과정중 화면이 노출되지 않는 상황 발생
- ① 필수기능 진행 이후 기본적인 코드 리팩토링 과정에서 메서드명, 변수명 선언부를 수정하다 코드가 꼬여버리는 상황이 발생
- 2️⃣ 과제 진행 관련
- ① 고객 정보(Customer) 클래스를 역할 분리하는 과정에서 어느정도의 역할을 비즈니스 로직 클래스(CommerceSystem)과 나눠야 할 지 혼선이 많았음
- 관리자 메뉴 번호 충돌
: displayMainMenu 화면에서 관리자 모드 메뉴를 추가하여 화면에 노출했으나 실질적인 기능은 showCart(), order() 메서드를 불러와 화면구성과 접근 로직이 잘못되는 형태가 있었음
- 관리자 메뉴 번호 충돌
- ① 고객 정보(Customer) 클래스를 역할 분리하는 과정에서 어느정도의 역할을 비즈니스 로직 클래스(CommerceSystem)과 나눠야 할 지 혼선이 많았음
- 1️⃣ 기본 설정 관련

- ② 관리자모드 - 상품 추가 입력화면 조건부 불만족
: 메뉴 기능을 접근하고 입력 폼을 받아오게끔 구현한 와중에 공백값 검증을 위한 isempty() 문이 기본적으로 먼저 실행되는 이슈가 발생
private Product productForm() {
System.out.print("상품명: ");
String name = sc.nextLine().trim();
while (name.isEmpty()) {
System.out.print("입력값은 공백일 수 없습니다. 다시 입력: ");
name = sc.nextLine().trim();
}
// 상품명을 입력하기도 전에 재입력을 요청하는 출력문이 나오게 되는 이슈
- ③ String.format 할인 % 양식을 진행하다 발생한 UnknownFormatConversionException로 인해 문자열이 정상적으로 출력되지 않는 상황 발생
- 해결방법 / 찾아본 내용
- 1️⃣ 기본 설정 관련
- ① 병렬 배열로 관리함에 따라 발생할 수 있는 인덱스 관리 이슈들에 대해서 해소가 필요했음
- 일부 메서드가 이전 병렬 배열 기준의 인덱스를 참고함에 따라서 조회하고 반환하는 값들이 달라 오류가 발생했음
- 설정해놓은 기능별로 클래스를 올바르게 호출하는지 단계별 점검 및 실행과정을 통해서 컴파일 단계의 오류였는지, 실행 이후 단계의 오류인지(출력을 해야하나 실행은 되고 출력은 안나오는 상황) 점검하고 수정해 나아감
- ① 병렬 배열로 관리함에 따라 발생할 수 있는 인덱스 관리 이슈들에 대해서 해소가 필요했음
- 2️⃣ 과제 진행 관련
- ① 클래스 파일의 목적에 맞게 아래와 같이 정리하여 진행하고자 했음
- Customer.java = 데이터/역할(권한) 보유
- CommerceSystem = 메뉴 흐름/ 비즈니스 규칙
→ 실습과정에서는 중첩 클래스로 구성하여 활용하는 것이 직관적이지만 과제에서 요구하는 추가기능들 그리고, 그 기능들을 묶어 새로운 클래스로의 확장을 위해 파일을 분리하여 진행하고자 했음 - 관리자 메뉴 번호 충돌
- start() 메서드에서 메뉴 번호를 고정한 형태로 되어 있어 displayMainMenu에서 보여주는 메뉴 순번과 실제 동작되는 기능의 순번이 전부 고정되어 있었던 이슈
- 사용자의 입력값에 따라 로직을 수행하던 개념에서 장바구니의 보유 여부에 따라 showCart() / order() 흐름이 아예 실행되지 않고 정상적으로 관리자모드로 진입할 수 있도록 수정하였음
- ① 클래스 파일의 목적에 맞게 아래와 같이 정리하여 진행하고자 했음
- 1️⃣ 기본 설정 관련


- ② 관리자모드 - 상품 추가 입력화면 조건부 불만족
: 해당 이슈는 선행과정(관리자 모드 메뉴 진입 및 카테고리 선택과정에서 숫자를 입력해 화면을 진입함) 에서 nextInt()가 엔터를 처리하지 못해서 발생한 이슈- nextInt() 는 정수만 읽고, 엔터(개행문자) 는 버퍼에 그대로 남아있게 됨
- 그 다음 줄에서 nextLine()을 호출하면, 버퍼에 남아 있는 엔터(\n) 를 그대로 읽어와서 **빈 문자열(””)**을 반환해버리는 상황
- 이로 인해 isEmpty() 조건이 만족하게 되면서 오류일때 실행되어야 할 출력문 및 입력요청이 실행되게 된 것
→ 이로 인해 우선적으로 nextInt() 를 사용한 이후에 nextLine() 으로 버퍼로 남아있는 엔터값을 처리하도록 임시 조치를 진행했음
→ 최종적으로는 두가지 방법으로 해당 이슈를 간단하게 해소할 수 있는 것으로 보임 (진행 예정! )
• 전부 nextLine()으로 받고 parseInt() : 문자열로 우선 받고 숫자로 바꾸는 방식
• 또는 readIntSafely() 같은 헬퍼로 nextInt() 뒤 개행을 항상 소비 :
- ③ UnknownFormatConversionException의 경우는 포맷 문자열에 잘못된 %가 들어갔을 때 나오는 예외 오류
- 할인율(%) 를 표시하려는 형태였는데 만약 %라는 글자를 보여주고 싶다면 %% 형태로 선언해야 오류를 방지할 수 있음
- 할인율의 경우는 보통 %의 형태로 저장하지 않고 연산처리를 위해 소수 형태로 구성하니 나의 경우는 %0f%% 형태로 선언하여 깔끔한 정수 느낌의 퍼센트로 나타내게끔 수정해 문제를 해결했음
- → 지금은 연습차원에서 String.format 을 지속적으로 사용했으나 리팩토링 과정에서는 printf로 코드를 깔끔하게 구성하는 방법도 연습해볼 필요가 있음
'JAVA > Java 실습' 카테고리의 다른 글
| [JAVA Algorithm] 커머스 과제 알고리즘 기능 구현 (0) | 2025.10.13 |
|---|---|
| [Java Algorithm] 거스름돈 문제 풀이 예시 따라가보기 (0) | 2025.09.29 |
| [JAVA 실습] 객체지향 커머스 과제 (0) | 2025.09.22 |
| Lv3. Enum, 제네릭, 람다 & 스트림을 이해한 계산기 만들기 (0) | 2025.09.18 |
| [JAVA] 계산기 과제 개념 추가 정리 (0) | 2025.09.16 |