내일배움캠프 TIL - Dart 1Weeks

Jaden Lee·2025년 3월 10일
0

내일배움캠프

목록 보기
7/15
post-thumbnail

Dart 쇼핑몰 콘솔 프로그램 트러블슈팅 TIL

Git Repo는 여기서 !

프로젝트 개요

Dart로 간단한 콘솔 기반의 쇼핑몰 프로그램을 개발했다. 사용자는 상품을 장바구니에 추가하고, 장바구니 내용을 확인하며, 총 가격을 계산할 수 있다. 또한 장바구니를 초기화하거나 프로그램을 종료하는 기능도 포함했다.


1. stdin.readLineSync()에서 null이 발생하는 문제

문제:

콘솔에서 사용자 입력을 받을 때 stdin.readLineSync()null을 반환하는 경우가 발생했다.

원인:

  • 사용자가 빈 입력을 넣었거나 trim()을 사용하지 않아 공백이 그대로 전달됨
  • stdin.readLineSync()null을 반환할 가능성이 있기 때문에 ?.trim()을 사용하지 않으면 null 오류가 발생할 수 있음

해결 방법:

var input = stdin.readLineSync()?.trim();
if (input == null || input.isEmpty) {
  print('❌ 올바른 입력을 해주세요.');
  continue;
}

null 또는 빈 문자열을 체크하는 예외 처리를 추가하여 해결함.


2. 숫자 입력 시 int.tryParse()의 예외 처리 필요

문제:

숫자를 입력받을 때 문자를 입력하면 프로그램이 충돌함.

원인:

  • int.parse()를 사용하면 숫자가 아닌 입력이 들어올 경우 예외가 발생함.

해결 방법:

var quantity = int.tryParse(stdin.readLineSync()?.trim() ?? '');
if (quantity == null || quantity <= 0) {
  print('❌ 올바른 수량을 입력하세요!');
  continue;
}

int.tryParse()를 사용하여 변환 실패 시 null을 반환하도록 하고, 유효성 검사를 추가하여 예외를 방지함.


3. 장바구니에 중복 상품이 개별적으로 추가되는 문제

문제:

같은 상품을 여러 개 담을 경우 개별적으로 추가되어 장바구니가 중복된 리스트 형태로 저장됨.

원인:

  • 상품을 리스트에 개별적으로 추가하면서 중복 처리가 되지 않음.

해결 방법:

  • 장바구니를 Map<String, int> 형태로 변경하여 상품명과 개수를 저장하는 방식으로 해결
Map<String, int> cart = {};

void addToCart(int productIndex, int quantity) {
  var selectedProduct = products[productIndex - 1];
  cart[selectedProduct.name] = (cart[selectedProduct.name] ?? 0) + quantity;
}

이렇게 하면 같은 상품을 담을 때 기존 수량을 증가시키는 방식으로 장바구니를 관리할 수 있음.


4. 프로그램 종료 확인 로직이 의도와 다르게 동작하는 문제

문제:

종료 여부를 묻는 과정에서 5를 입력하지 않아도 프로그램이 종료되는 경우가 발생함.

원인:

  • exitConfirm 값이 null이거나 의도치 않은 입력값을 처리하지 않았음.

해결 방법:

stdout.write('정말 종료하시겠습니까? (종료하려면 5 입력): ');
var exitConfirm = stdin.readLineSync()?.trim();
if (exitConfirm == '5') {
  print('이용해 주셔서 감사합니다 ~ 안녕히 가세요! 👋');
  isRunning = false;
} else {
  print('🚫 종료하지 않습니다.');
}

이제 사용자가 5를 입력해야만 프로그램이 종료되며, 다른 입력을 하면 종료되지 않도록 변경됨.


마무리

이번 Dart 쇼핑몰 콘솔 프로그램을 만들면서 다양한 입력 예외 처리와 리스트 관리 방식에 대한 고민을 많이 했다. 특히 stdin.readLineSync()null 처리와 int.tryParse()를 활용한 예외 처리는 Dart 콘솔 애플리케이션을 개발할 때 필수적인 부분이라는 점을 깨달았다. 앞으로도 유사한 프로그램을 개발할 때 더 효율적인 방법을 고민해봐야겠다!

0개의 댓글