[TIL] Commerce 과제

mong k·2026년 4월 2일

1. 작성 개요

이전 계산 과제를 진행하면서 객체지향적 사고에 첫걸음을 내딛었다.
이번에는 커머스 과제를 진행하면서 객체지향적사고와 공부가 필요한 부분에 대해서 기술 할 예정이다.


2. 주요 기능 구현

STEP1. 객체 지향 설계 적용 사품관리 시스템 프로그래밍

  • Product 클래스 생성 및 상품명, 가격, 설명, 재고수량 필드 정의
  • 상품 정보 출력 및 0 입력 시 프로그램 종료

STEP2.

  • CommerceSystem 클래스 생성
    • start 함수 구현하여 입력과 반복문 로직 구현

STEP3.4. 상품 선택 및 출력 기능 구현

  • 카테고리 선택 후 상품 목록 출력
  • 상품 선택 시 상세 정보 출력
  • 사용자 입력 검증 로직 추가

Lv1.장바구니 및 주문하기 기능 추가

  • 카테고리별 상품 목록 조회
  • 상품 선택 및 상제 정보 확인
  • 장바구니 담기 기능
  • 동일 상품 재선택 시 수량 증가 처리
  • 장바구니 내역 및 총 주문 금액 확인
  • 주문 확정 시 재고 차감
  • 주문 취소 가능

Lv2. 관리자 모드 기능 추가

  • 관리자 로그인 기능 구현 (비밀번호 3회 실패 시 메인 메뉴 복귀)
  • 상품 추가 기능
    • 카테고리 선택 후 상품 등록
    • 상품명, 가격, 설명, 재고 입력
    • 동일 카테고리 내 중복 상품 검증
  • 상품 수정 기능
    • 상품 선택 후 가격, 설명, 재고 수정
  • 상품 삭제 기능
    • 카테고리 및 상품 선택 방식으로 삭제
    • 삭제 전 확인 메시지 출력
    • 장바구니에 담긴 동일 상품도 함께 삭제
  • 전체 상품 현황 조회 기능
    • 카테고리별 전체 상품 목록 및 재고 확인

3. 트러블 슈팅 🔥

1. 콘솔 출력 형식 정리 문제

  • 문제
    상품 목록 출력 시 정렬이 맞지 않아 가독성이 떨어짐

  • 해결
    printf 포맷을 활용하여 정렬 및 형식 통일

    • %d : 정수 출력
    • %s : 문자열 출력
    • %-15s : 문자열 왼쪽 정렬
    • %,d : 천 단위 콤마
    • %n : 줄바꿈

👉 다양한 형식으로 출력을 나타낼 수 있다는 걸 배웠고 아래 링크에 정리하였다.

👉 자세한 내용 (링크 첨부)
https://velog.io/@gpekd5/Java-%EB%AC%B8%EB%B2%95-printf


2. 입력값 예외 처리 문제

  • 문제
    숫자를 입력해야 하는 상황에서 문자 입력 시 프로그램이 종료됨

  • 원인
    Scanner.nextInt() 사용 시 InputMismatchException 발생

  • 해결
    try-catch로 예외 처리 후
    sc.nextLine()으로 입력 버퍼 초기화

👉 예외처리를 하지 않으면 프로그램이 종료 될 가능성이 높기에 항상 인지를 하고 있어야겠다. 단순하게 Exception 키워드처럼 나타낼게 아니라 정확한 디버깅과 추적을 위해 다양한 예외의 종류를 아래 링크에 정리하였다.

👉 자세한 내용 (링크 첨부)
https://velog.io/@gpekd5/Java-%EB%AC%B8%EB%B2%95-%EC%98%88%EC%99%B8%EC%B2%98%EB%A6%AC-try-catch


3. final 적용 기준 혼란

  • 문제
    final을 어디에 써야 할지 명확한 기준 없이 사용

  • 해결
    “변하지 않는 값에 사용한다”는 기준을 다시 정리

    • 상품 이름, 설명 → final 가능
    • 재고, 가격 → 변경 가능 → final X

👉 무조건 사용하는 것이 아니라, 목적에 맞게 사용하는 것이 중요!!!!!
final 키워드에 대한 간단한 정리를 아래 링크로 첨부하였다.

👉 자세한 내용 (링크 첨부)
https://velog.io/@gpekd5/Java-%EB%AC%B8%EB%B2%95-final-%ED%82%A4%EC%9B%8C%EB%93%9C


4. 객체 구조 설계 문제

  • 문제
    상품, 장바구니, 수량을 하나의 흐름으로 처리하려다 구조가 꼬임

  • 원인
    각 클래스의 책임(역할)에 대한 이해 부족

  • 해결
    역할 기준으로 객체 분리

    • Product : 상품 정보
    • CartItem : 상품 + 수량
    • Cart : 장바구니 관리
    • Category : 카테고리 및 상품 목록

👉 객체지향은 데이터를 나누는 것이 아니라 역할을 나눠서 유지보수가 편할 수 있게 개발자가 수정을 원활하게 할 수 있도록 해야겠다는 것을 느꼈다. 또한 처음 구조설계?를 하는 것이 어려운 것 같다.


5. 장바구니 삭제 동기화 문제

  • 문제
    관리자에서 상품 삭제 시
    카테고리에서는 삭제되지만 장바구니에는 남아있는 문제 발생

  • 원인
    CommerceSystemAdmin이 각각 다른 Cart 객체를 사용
    → 서로 다른 장바구니를 보고 있었음
    cartItems.size()가 0으로 나오는 현상 발생

  • 해결
    Cart 객체를 하나만 생성하고
    Admin에 전달하여 동일 객체를 공유하도록 수정

     private final Cart cart = new Cart();
      private final Admin admin = new Admin(categories, cart);

👉 동일한 데이터를 여러 객체에서 따로 관리하면 데이터 불일치 문제가 발생해서 예상치 못한 프로그램 오류가 발생한다. 따라서, 구조 관계를 잘 이해하고 해야할 것 같다.


0개의 댓글