π SOLID μμΉμ λ§κ² μ»΄ν¬λνΈ λ¦¬ν©ν λ§
νμμ λ΄ μ½λλ μ κ°λ μ±μ΄ μ’μ§ λͺ»ν κΉ?
μ λ΄ μ½λλ μ΄λ κ² κΈΈμ§?
λΌλ μκ°μ νμλλ° μ»΄ν¬λνΈ μ€κ³ λ°©μμ λ°κΎΈλ μ’ λ μ½κΈ° μ½κ³ μ± μ λΆν λ μ’μ μ½λλ₯Ό μ€κ³ν μ μκ² λμ΄μ μ°λ νκΈ°μ λλ€.
λ§μ½ μ μ κ°μ΄ μκ°νμλ λΆλ€μ΄ μλ€λ©΄ νλ² λ΄μ£Όμλ©΄ μ’μ κ±° κ°μ΅λλ€.
- SRP (Single Responsibility Principle) λ¨μΌ μ± μ μμΉ
λ¨μΌ μ± μ μμΉμ΄λ μ½κ² λ§ν΄μ μ½λλ νλμ μμ μ ν΄μΌ νλ€λΌκ³ λ³Ό μ μμ΅λλ€.
νμ§λ§ κ·Έμ μ μ κ° μ§λ μ½λλ₯Ό 보면 μ»΄ν¬λνΈ μ체μμ μ¬λ¬ κ°μ§ λ‘μ§μ λλ©΄μ UIλ‘μ§κΉμ§ ννκ³ μλ€λ κ²μ μ μ μμ΅λλ€.
λ°μ μμκ° μ± μ λΆν λκΈ° μ μ½λμ λλ€.
μ½λλ₯Ό 보면 CouponList μ»΄ν¬λνΈλ μλ²μμ λ°μ΄ν°λ ν¨μΉ νκ³ , κ·Έ ν¨μΉ λ λ°μ΄ν°λ‘ νλ©΄μ λ λλ§ νλ κ²μ νμΈν μ μμ΅λλ€.
μ½κ² λ§ν΄μ μ΄ μ»΄ν¬λνΈλ 2κ°μ§ μν μ νκ³ μμ΅λλ€.
1. μλ²μμ μΏ ν° λ°μ΄ν°λ₯Ό κ°μ Έμ¨λ€.
2. κ°μ Έμ¨ λ°μ΄ν°λ‘ νλ©΄μ λ λλ§ νλ€.
function CouponList({ handleSelectCoupon }: Props) {
const [coupons, setCoupons] = useState<Coupon[]>([]);
useEffect(() => {
getCoupons().then((res) => setCoupons(res));
}, []);
return (
<Block>
{coupons.map((coupon, i) => (
<CouponItem
key={i}
title={coupon.title}
onClick={() => handleSelectCoupon(coupon)}
/>
))}
<CouponItem title="μ·¨μνκΈ°" onClick={() => handleSelectCoupon(null)} />
</Block>
);
}
νμ§λ§ useEffect, useStateκ° μλ λΆλΆμ hookμΌλ‘ λΊ μ μμ΅λλ€.
κ·Έλμ hookμΌλ‘ λΆλ¦¬λ₯Ό νλ©΄ μλμ κ°μ μ½λκ° λ©λλ€.
μ¦ μλ²μμ λ°μ΄ν°λ₯Ό ν¨μΉ νλ μν μ useGetCoupons ν μκ² μμνκ³ Listλ λ°μ΄ν°λ₯Ό κ°μ§κ³ νλ©΄μ 그리λλ° μ§μ€ν μ μλλ‘ μν λΆλ¦¬λ₯Ό ν΄μ€ κ²μ λλ€.
μ΄λ κ² νμ μ± μ λΆλ¦¬λ‘ μΈν κ°λ μ±μ΄ μ¬λΌκ°κ³ μν λ³ ν μ€ν νκΈ°λ μ©μ΄ν΄μ§λλ€.
function CouponList({ handleSelectCoupon }: Props) {
const { coupons } = useGetCoupons();
return (
<Block>
{coupons.map((coupon, i) => (
<CouponItem
key={i}
title={coupon.title}
onClick={() => handleSelectCoupon(coupon)}
/>
))}
<CouponItem title="μ·¨μνκΈ°" onClick={() => handleSelectCoupon(null)} />
</Block>
);
}
function useGetCoupons() {
const [coupons, setCoupons] = useState<Coupon[]>([]);
useEffect(() => {
getCoupons().then((res) => setCoupons(res));
}, []);
return {
coupons,
};
}
- OCP (Open Closed Principle) κ°λ°© νμ μμΉ
κ°λ°© νμ μμΉμ΄λ νμ₯μλ μ΄λ €μμ΄μΌ νμ§λ§ λ³κ²½μλ λ«νμμ΄μΌ νλ€ λΌλ μμΉμΈλ°μ
μ½λλ‘ λ΄λ³΄κ² μ΅λλ€.
function QuantityButton({ mode, onClick }: Props) {
return (
<CountButton onClick={onClick}>
{mode === 'plus' ? <AiOutlinePlus /> : <AiOutlineMinus />}
</CountButton>
);
}
μ μ½λλ μμ΄μ½μ΄ Plus, Minusμμ΄μ½μΌλ‘ νμ λμ΄ μμ΅λλ€.
μ¦ νμ₯μ λ«νμλ€λ λ»μ΄μ£
μ μ½λμ νμ₯μ±μ μ¬λ¦¬λ €λ©΄ μ΄λ»κ² ν΄μΌ ν κΉμ??
μμ΄μ½μ λ²νΌ μμμ μ μνλ κ² μλλΌ λ°κΉ₯μμ μ£Όμ λ°μΌλ©΄ λ©λλ€.
μ¦ μλμ κ°μ μ½λκ° λλ κ²μ΄μ£ .
function QuantityButton({ icon, onClick }: Props) {
return <CountButton onClick={onClick}>{icon}</CountButton>;
}
μ¦ μ΄μ μμ΄μ½μ΄ λ κ°λ‘ νμ λμ΄ μλκ² μλλΌ, λ°κΉ₯μμ νλ‘μ€λ‘ λ겨λ°κΈ° λλ¬Έμ λκ°λ‘ νμ λ κ² μλλΌ μ¬λ¬ κ°μ§ μμ΄μ½μ μ μ©ν μ μμ΅λλ€.
λν μ΄ μ»΄ν¬λνΈ λ΄λΆμμ μμ΄μ½μ λ°κΏ νμκ° μμΌλ―λ‘ νμ₯μλ μ©μ΄νκ³ λ³κ²½μλ λ«νμλ μμΉμ΄ μ μ©λ κ²μ λλ€!
- ISP (Interface Segregation Principle) μΈν°νμ΄μ€ λΆλ¦¬ μμΉ
μΈν°νμ΄μ€ λΆλ¦¬ μμΉμ΄λ μ¬μ©νμ§ μλ μΈν°νμ΄μ€μ μμ‘΄νλ©΄ μ λλ€λ λ΄μ©μΈλ°μ.
λ°μ μ½λλ₯Ό μμλ‘ λ΄λ³΄κ² μ΅λλ€.
λ°μ 체ν¬λ°μ€ μ»΄ν¬λνΈλ 8κ°μ product νμ μ λ°μμ κ·Έμ€ product.item_no, product.checked μμ± λ κ°λ§ μ¬μ©νκ³ μμ΅λλ€.
interface CartProduct {
item_no: number;
item_name: string;
detail_image_url: string;
price: number;
score: number;
availableCoupon?: boolean;
quantity: number;
checked: boolean;
}
interface Props {
product: CartProduct;
onClick: () => void;
}
function CheckBox({ product, onClick }: Props) {
const uniqueID = `checkbox-${product.item_no}`;
return (
<Block>
<input
id={uniqueID}
type={'checkbox'}
defaultChecked={product.checked}
onClick={onClick}
></input>
<label htmlFor={uniqueID}></label>
</Block>
);
}
μ¦ μ¬μ©νμ§ μλ μΈν°νμ΄μ€κ° λ무 λ§μ κ²μ΄μ£ .
κ·Έλ¬λ©΄ μ΄λ»κ² ν΄μΌ ν κΉμ?
κΌ νμν μΈν°νμ΄μ€λ§ λ겨λ°μΌλ©΄ λ©λλ€.
interface Props {
item_no: number;
checked: boolean;
onClick: () => void;
}
function CheckBox({ item_no, onClick, checked }: Props) {
const uniqueID = `checkbox-${item_no}`;
return (
<Block>
<input
id={uniqueID}
type={'checkbox'}
defaultChecked={checked}
onClick={onClick}
></input>
<label htmlFor={uniqueID}></label>
</Block>
);
}
μ΄μ μμ 체ν¬λ°μ€λ μ μ°λ μΈν°νμ΄μ€ μμ΄ νμν μΈν°νμ΄μ€λ§ μμ‘΄ν΄μ μ¬μ©λκ³ μμ΅λλ€.
μ΄λ² ν¬μ€ν μμλ μ κ° SOLID μμΉμ 곡λΆν΄ κ°λ©΄μ μ μ©ν λ΄μ©μ λΈλ‘κΉ νλλ°μ.
μ΄λ²μ 곡λΆνλ©΄μ μ΄λ»κ² μ»΄ν¬λνΈλ₯Ό μ€κ³ν΄μΌ νλμ§ κ²¬λ¬Έμ λν μ μλ μ’μ κ³΅λΆ κΈ°νμμ΅λλ€.
κ·Έλμ μ μ²λΌ μ»΄ν¬λνΈ μ€κ³μ λν΄μ κ³ λ―Ό μ€μ΄μ λΆλ€μ΄λΌλ©΄ νλ² SOLIDμμΉμ 곡λΆν΄κ°λ©΄μ μ μ©ν΄ λ΄λ μ’μ κ±° κ°μ΅λλ€.