강신규
[우테코 프리코스/7기] 프리코스 4주 차 회고 본문
최종코드 :
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주 동안의 과제 수행을 통해 디버깅 습관부터 단위 테스트 구현에 이르기까지, 정말 많은 성장을 경험했습니다. 긴 시간 동안 몰입해 개발에 집중하면서 절대 후회하지 않을 선택을 했다고 확신합니다. 비록 결과는 아직 나오지 않았지만, 좋은 습관들을 갖추게 되어 큰 만족을 느끼며 프리코스를 마무리합니다. 앞으로 이처럼 좋은 발전 기회가 있다면은 바로바로 수용하는 개발자가 되고자 합니다!
'우아한테크코스' 카테고리의 다른 글
[우테코 프리코스/7기] 프리코스 3주 차 회고 (1) | 2024.11.12 |
---|---|
[우테코 프리코스/7기] 프리코스 2주 차 회고 (1) | 2024.11.12 |
[우테코 프리코스/7기] 프리코스 1주 차 회고 (1) | 2024.10.26 |