디자인 패턴과 함수형 프로그래밍 그리고 상태 관리 설계
이번주는 디자인 패턴과 함수형 프로그래밍 그리고 상태 관리 설계에 대해 진행했다!
const getMaxApplicableDiscount = (item: CartItem): number => {
const { discounts } = item.product;
const { quantity } = item;
const baseDiscount = discounts.reduce((maxDiscount, discount) => {
return quantity >= discount.quantity && discount.rate > maxDiscount
? discount.rate
: maxDiscount;
}, 0);
const hasBulkPurchase = cart.some(cartItem => cartItem.quantity >= 10);
if (hasBulkPurchase) {
return Math.min(baseDiscount + 0.05, 0.5); // 대량 구매 시 추가 5% 할인
}
return baseDiscount;
};
getMaxApplicableDiscount 코드는 최대 가능 할인율을 계산하는 로직이다.hasBulkPurchase 함수 같은 경우 cart라는, 장바구니 내용을 보게 되는데, 이는 함수 내부에서 cart라는 외부 변수를 참조하며, 동일한 item을 인수로 전달하더라도 cart 변수의 내용이 변경되면 함수의 결과가 달라질 수 있게 된다. /**
* 상품의 기본 할인율 계산 (수량 기반)
* @param item - 장바구니 아이템
* @returns 기본 할인율 (0 ~ 1)
*/
getBaseDiscount: (item: CartItem): number => {
const { discounts } = item.product;
const { quantity } = item;
return discounts.reduce((maxDiscount, discount) => {
return quantity >= discount.quantity && discount.rate > maxDiscount
? discount.rate
: maxDiscount;
}, 0);
},
/**
* 대량 구매 보너스 할인율 계산
* @param cart - 전체 장바구니
* @returns 대량 구매 보너스 할인율 (0 또는 0.05)
*/
getBulkPurchaseBonus: (cart: CartItem[]): number => {
const hasBulkPurchase = cart.some((cartItem) => cartItem.quantity >= 10);
return hasBulkPurchase ? 0.05 : 0;
},
/**
* 적용 가능한 최대 할인율 계산
* @param item - 장바구니 아이템
* @param cart - 전체 장바구니 (대량 구매 체크용)
* @returns 최대 할인율 (0 ~ 0.5, 최대 50%)
*/
getMaxApplicableDiscount: (item: CartItem, cart: CartItem[]): number => {
const baseDiscount = cartModel.getBaseDiscount(item);
const bulkBonus = cartModel.getBulkPurchaseBonus(cart);
// 기본 할인 + 대량 구매 보너스, 최대 50% 제한
return Math.min(baseDiscount + bulkBonus, 0.5);
},
// atoms/cart.ts
export const cartAtom = atomWithStorage<CartItem[]>("cart", []);
export const totalItemCountAtom = atom((get) => {
const cart = get(cartAtom);
return cart.reduce((sum, item) => sum + item.quantity, 0);
});
// hooks/useCart.ts
export const useCart = () => {
const [cart, setCart] = useAtom(cartAtom);
const totalItemCount = useAtomValue(totalItemCountAtom);
...


- 볶음밥도 못참지..



시간이 어째 가는 지 모르게 어느새 7주차 끝나고 8주차 시작이다.. 언제 지나가나~ 해도 벌써 끝이 다와간다.. 남은 주차도 후회하지않게 화이팅하자!