강신규

[우테코 프리코스/7기] 프리코스 4주 차 회고 본문

우아한테크코스

[우테코 프리코스/7기] 프리코스 4주 차 회고

kangnew 2024. 11. 13. 16:40

 

최종코드 : 

https://github.com/singyuKang/javascript-convenience-store-7-singyuKang

 

GitHub - singyuKang/javascript-convenience-store-7-singyuKang

Contribute to singyuKang/javascript-convenience-store-7-singyuKang development by creating an account on GitHub.

github.com

 

목표설정

[설계] README.md 작성

 

[개발] 메서드의 길이가 10라인 넘어가지 않도록. 한 메서드는 하나의 기능을 수행하도록 개발

 

[테스트] TDD 및 Unit Test 확인(전체적인 구현을 먼저 진행하다보니 테스트 코드 작성할 시간 부족)

# javascript-convenience-store-precourse

## ✏️ 과제 진행 요구 사항 - 구현할 기능 목록

## 입력 함수 구현

- [x] 파일 입출력을 통해 상품 정보와 행사 할인 정보를 저장 및 처리합니다.
- [x] 구매할 상품과 수량을 입력 받습니다.상품명, 수량은 하이픈(-)으로, 개별 상품은 대괄호([])로 묶어 쉼표(,)로 구분
- [x] 프로모션 적용이 가능한 상품에 대해 고객이 해당 수량보다 적게 가져온 경우, 그 수량만큼 추가 여부를 입력받는다.
- [x] 프로모션 재고가 부족하여 일부 수량을 프로모션 혜택 없이 결제해야 하는 경우, 일부 수량에 대해 정가로 결제할지 여부를 입력받는다.
- [x] 멤버십 할인 적용 여부를 입력 받는다.
- [x] 추가 구매 여부를 입력 받는다.

## 출력 함수 구현

- [x] 환영 인사와 함께 상품명, 가격, 프로모션 이름, 재고를 안내한다. 만약 재고가 0개라면 재고 없음을 출력한다.
- [x] 프로모션 적용이 가능한 상품에 대해 고객이 해당 수량만큼 가져오지 않았을 경우, 혜택에 대한 안내 메시지를 출력한다.
- [x] 프로모션 재고가 부족하여 일부 수량을 프로모션 혜택 없이 결제해야 하는 경우, 일부 수량에 대해 정가로 결제할지 여부에 대한 안내 메시지를 출력한다.
- [x] 멤버십 할인 적용 여부를 확인하기 위해 안내 문구를 출력한다.
- [x] 구매 상품 내역, 증정 상품 내역, 금액 정보를 출력한다.
- [x] 추가 구매 여부를 확인하기 위해 안내 문구를 출력한다
- [x] 사용자가 잘못된 값을 입력했을 때, "[ERROR]"로 시작하는 오류 메시지와 함께 상황에 맞는 안내를 출력한다

## 에러처리

- [x] 구매할 상품과 수량 형식이 올바르지 않은 경우: [ERROR] 올바르지 않은 형식으로 입력했습니다. 다시 입력해 주세요.
- [x] 존재하지 않는 상품을 입력한 경우: [ERROR] 존재하지 않는 상품입니다. 다시 입력해 주세요.
- [x] 구매 수량이 재고 수량을 초과한 경우: [ERROR] 재고 수량을 초과하여 구매할 수 없습니다. 다시 입력해 주세요.
- [x] 기타 잘못된 입력의 경우: [ERROR] 잘못된 입력입니다. 다시 입력해 주세요.

## 상품정보 데이터 저장 구현

- [x] 현재 편의점에서 보유하고있는 상품과 그 상품에 대한 정보를 담는 데이터 저장 구현

## 할인정보 데이터 저장 구현

- [x] 할인 정보에 대한 데이터 저장 구현

## 구매 상품 처리

- [x] 구매할 상품, 수량 처리 (재고확인, 할인정보 확인)
- [x] 프로모션 적용이 가능한 상품 판단 후 안내 및 계산
- [x] 멤버십 적용 여부 확인 및 멤버십 계산
- [x] 구매 내역, 증정 상품 내역, 금액 정보 계산

 


class 배열을 통한 재고 관리

재고 처리를 할 때, 사용자의 구매 수량을 지속적으로 업데이트하기 위해 Product 배열에서 객체를 참조 방식으로 관리했습니다. 이를 통해 특정 제품의 속성을 수정하면 해당 객체를 참조하는 모든 곳에서 즉시 변경된 상태를 공유할 수 있었습니다. 참조 타입의 이 같은 특성은 여러 영역에서 동일한 객체의 상태 변화를 동시에 반영하고자 할 때 유용하게 활용될 수 있습니다.

 

class Product {
  #name;
  #price;
  #quantity;
  #promotion;

  constructor(name, price, quantity, promotion) {
    this.#name = name;
    this.#price = price;
    this.#quantity = quantity;
    this.#promotion = promotion;
  }

  get name() {
    return this.#name;
  }

  get price() {
    return this.#price;
  }

  get quantity() {
    return this.#quantity;
  }

  set quantity(value) {
    this.#quantity = value;
  }

  get promotion() {
    return this.#promotion;
  }
}

export default Product;

class ConvenienceController {
  #products; //[Prodcut]

  //참조 형식이기 때문에 filter후에 값을 수정하여도 전체 변경
  getPromotionList(readItem) {
    const filterPromotionList = this.#products.productList.filter((product) => product.name == readItem.name && product.promotion);
    return filterPromotionList;
  }
}

 


 

reduce 함수 사용

reduce는 누적되어있는 값을 다시 사용하고 싶을때 사용하면 좋은 고차함수 입니다. acc에 이전 상태에 대한 정보가 저장되어 있어 이를 편리하게 사용이 가능했습니다.

	//reduce활용
  getReceiptProducts() {
    return this.#boughtProductsInfo.reduce((acc, boughtProduct) => {
      const existingProduct = acc.find((item) => item.name === boughtProduct.name);
      if (existingProduct) {
        existingProduct.quantity += boughtProduct.quantity;
        existingProduct.price += boughtProduct.price;
      } else {
        acc.push({ name: boughtProduct.name, quantity: boughtProduct.quantity, price: boughtProduct.price * boughtProduct.quantity });
      }
      return acc;
    }, []);
  }

 


 

느낀점

 

4주 동안의 과제 수행을 통해 디버깅 습관부터 단위 테스트 구현에 이르기까지, 정말 많은 성장을 경험했습니다. 긴 시간 동안 몰입해 개발에 집중하면서 절대 후회하지 않을 선택을 했다고 확신합니다. 비록 결과는 아직 나오지 않았지만, 좋은 습관들을 갖추게 되어 큰 만족을 느끼며 프리코스를 마무리합니다. 앞으로 이처럼 좋은 발전 기회가 있다면은 바로바로 수용하는 개발자가 되고자 합니다!