다트 콘솔 쇼핑몰 개발 트러블슈팅 기록

임대한·2025년 3월 14일

소개

Dart 언어를 활용한 콘솔 쇼핑몰 프로젝트를 진행하면서 마주한 도전과 해결 과정을 공유하고자 합니다. 이 프로젝트는 상품 목록 보기, 장바구니 담기, 총 가격 확인 등의 기능을 포함한 터미널 기반의 쇼핑몰 시스템을 구현한 겁니다.

프로젝트를 진행하면서 큰 문제나 트러블슈팅 요소가 많지 않았습니다. 일주일 동안 다트 문법을 공부한 덕분에 대부분의 기능을 무리 없이 구현할 수 있었습니다. 하지만 개발 과정에서 시간이 좀 더 소요되었던 부분들이나 도전 과제들에 대해서 정리해보고자 합니다.

개발 과정의 도전과 해법

체계적인 Git 브랜칭 전략

프로젝트를 진행하면서 버전 관리를 위한 체계적인 Git 브랜칭 전략을 도입하는 데 도전했습니다. 기존에는 개인 프로젝트에서 maindevelop 두 브랜치만 사용했는데, 이번에는 팀 프로젝트처럼 더 체계적인 브랜칭 전략을 시도했습니다.

이를 위해 목적에 따라 브랜치를 분리했습니다. 새로운 기능은 feat/, 버그 수정은 fix/, 코드 개선은 refactor/, 문서 작업은 docs/, 테스트 작성은 test/ 등의 접두사를 사용했습니다. 예를 들어 다음과 같은 브랜치들을 만들어 작업했습니다:

  • feat/smart-search: 스마트 검색 기능 구현
  • fix/encoding-utf8: UTF-8 인코딩 문제 해결
  • refactor/extract-methods-main: main.dart 메소드 추출
  • docs/add-function-field-comments: 함수 및 필드 주석 추가

커밋 메시지도 일관성 있게 작성했습니다:

feat(main): Implement addToCart() with input validation
fix(mall): Fix calculation of total price update in addToCart()
refactor(mall): Format price in showProducts() as KRW using intl dependency

처음에는 이런 브랜치 관리 방식이 낯설어서 시간이 좀 걸렸지만 점차 익숙해지면서 작업 효율이 높아졌습니다. 브랜치 간 전환이 필요할 때나 Pull Request와 Merge Request의 제목과 설명을 작성할 때도 어떤 내용을 어떻게 표현해야 할지 고민이 많았습니다. 특히 한 브랜치에서 작업 중 다른 기능과 관련된 파일을 수정해야 할 때 브랜치를 어떻게 관리해야 하는지가 가장 헷갈렸습니다.

하지만 블로그와 공식 문서를 참고하면서 좋은 예시들을 찾아 적용해보며 점차 체계적인 방식으로 관리할 수 있게 되었습니다. 이 과정을 통해 작업 이력을 명확하게 관리할 수 있었고, 병합 과정도 훨씬 수월해졌습니다.

스마트 검색(Fuzzy Search) 구현 도전

문제 상황

사용자가 정확히 상품명을 입력하지 않더라도 유사한 이름의 상품을 찾을 수 있는 기능을 구현하고 싶었습니다 . 처음에는 단순히 대소문자를 ignore하고 문자열 포함 여부만 확인했지만, 퍼지 검색(Fuzzy Search) 기능이 필요했습니다.

고민

  1. Fuzzy Search을 직접 구현할지, 라이브러리를 사용할지
  2. 퍼지 Fuzzy Search 알고리즘 중 어떤 게 이 용도에 적합한지
  3. Dart에서 사용 가능한 퍼지 검색 라이브러리는 뭐가 있는지

해결 방법

Pub.dev의 fuzzy 패키지를 활용하여 스마트 검색 기능을 구현했습니다:

import 'package:fuzzy/fuzzy.dart';

// ...

Product? searchProduct(String productName) {
  final fuzzy = Fuzzy(_products.map((x) => x.name).toList());
  // Search for the best match
  final result = fuzzy.search(productName);
  if (result.isNotEmpty) {
    return _products.firstWhere((x) => x.name.toUpperCase() == result.first.item.toUpperCase());
  } else {
    return null;
  }
}

이 기능을 통해 사용자가 상품명을 모르더라도 부분 입력이나 유사한 이름으로 상품을 검색하고 장바구니에 담길 수 수게 되었습니다. 또한 오타가 있더라도 가장 유사한 상품을 추천해주는 UX를 제공할 수 있었습니다.

profile
안드로이드, Flutter, 머신러닝

0개의 댓글