
์คํด ์๋ ์ํต์ ์ํ ๋ช ํํ ์ธํฐํ์ด์ค ๋ง๋ค๊ธฐ

- #typescript
- #interface
๋ค์ด๊ฐ๋ฉฐ
์๋ ํ์ธ์. ๋ ธ๋จธ์ค์์ ๋ฐฑ์๋ ์๋น์ค๋ฅผ ๊ฐ๋ฐํ๊ณ ์๋ ์ ๊ทผ์๋ผ๊ณ ํฉ๋๋ค.
ํ๋กฌ์คํ ์ด๊ฐ ์คํ ๋์ง๋ ๊ฝค ์ค๋ ์๊ฐ์ด ์ง๋ฌ์ต๋๋ค.
ํ๋กฌ์คํ ์ด๋ ์ฌํ ๋ค๋ฅธ ์ปค๋จธ์ค์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ค์ํ ์ ํ๋ค์ ํ๋งคํ๋ฉฐ, ๊ทธ ์ค ๋ฐฐ์ก์ด ํ์ํ ์ ํ๋ค์ ๊ตญ๊ฐ๋ณ/์ ํ๋ณ๋ก ๋ค์ํ ๋ฐฐ์ก๋น ์ ์ฑ ์ ์ ์ฉํด์ผ ํ์ต๋๋ค.
์ฃผ์ ์ ์ฑ ์ผ๋ก๋ ๊ณ ์ ๋ฐฐ์ก๋น ์ ์ฑ / ๋ฌด๊ฒ๋ณ ๋ฐฐ์ก๋น ์ ์ฑ / ์๋๋ณ ๋ฐฐ์ก๋น ์ ์ฑ ๋ฑ์ด ์๊ณ , ๋ฐฐ์ก๋น ๊ณ์ฐ ๋ชจ๋์ ์ ๋ต ํจํด์ ์ ์ฉํ์ฌ ๊ฐ๋ฐ์ ํ์ต๋๋ค.
๊ธฐ์กด ๋ฐฐ์ก๋น ๊ณ์ฐ interface
๋ฐฐ์ก๋น ๊ณ์ฐ์ ์ํ interface๋ ๋๋ต ์๋์ ๊ฐ์ต๋๋ค.
๋ฐฐ์ก๋น ๊ณ์ฐ์ด ํ์ํ ์ํ๋ค์ ๊ฐ์ง๊ณ ์๋ items, ๋ฐฐ์กํ ๊ตญ๊ฐ ์ ๋ณด์ ํจ๊ป, ํด๋น ์ํ๋ค์ ์ ์ฉํ ๋ฐฐ์ก ์ ์ฑ
strategy๋ฅผ ๋๊ฒจ์ ๋ฐฐ์ก๋น๋ฅผ ๊ณ์ฐํ๊ฒ ๋ฉ๋๋ค.
interface DeliveryItemType {
id: number;
weight: number;
amount: number;
deliveryPolicyId: number;
}
interface DeliveryFeeType {
items: DeliveryItemType[];
countryCode: Country;
}
class DeliveryFeeCalculator {
calculateDeliveryFee(deliveryItems: DeliveryFeeType, strategy: Strategy<UnionDeliveryPolicy>) {
return strategy.calculate(deliveryItems);
}
}
๊ฐ ์ ๋ต ๊ฐ์ฒด๋ค์ ํด๋น ์ ์ฑ ์ ๋ง๊ฒ ๋ฐฐ์ก๋น ๊ณ์ฐ์ ํ๊ฒ ๋ฉ๋๋ค.
// ์๋๋ณ ๋ฐฐ์ก๋น ์ ์ฑ
class DiffAmountRangeStrategy implements Strategy<DiffAmountRangePolicy> {
calculate(deliveryItems: DeliveryFeeType) {
...
}
}
// ๋ฌด๊ฒ๋ณ ๋ฐฐ์ก๋น ์ ์ฑ
class DiffWeightRangeStrategy implements Strategy<DiffWeightRangePolicy> {
calculate(deliveryItems: DeliveryFeeType) {
...
}
}
์คํด์ ์์
๊ทธ๋ ๊ฒ ์๊ฐ์ด ์ง๋๊ณ , ๋ฌด๊ฒ๋ณ ๋ฐฐ์ก๋น ์ ์ฑ ๊ณ์ฐ์ ์ถ๊ฐ ๋ฐฐ์ก๋น๋ฅผ ๋ถ๊ณผํด์ผ ํ๋ ์๊ตฌ์ฌํญ์ด ์๊ฒผ์ต๋๋ค.
์ ๋ต ๊ฐ์ฒด๋ก ๊ตฌํํ๊ธฐ ๋๋ฌธ์, ๋ฌด๊ฒ๋ณ ๋ฐฐ์ก๋น ์ ์ฑ
class๋ง ์์ ํ๋ฉด ๋ฌธ์ ์์ด ์๊ตฌ์ฌํญ์ ๊ตฌํํ ์ ์์๊ฑฐ๋ผ ์๊ฐํ๊ณ ,
๊ณตํต์ผ๋ก ์ฌ์ฉํ๊ณ ์๋ DeliveryItemType ์ ์ถ๊ฐ ๋ฐฐ์ก๋น ๊ณ์ฐ์ ํ์ํ extraDeliveryPolicyId๋ฅผ ์ถ๊ฐํ์ต๋๋ค.
export interface DeliveryItemType {
id: number;
weight: number; // ๋ฌด๊ฒ
amount: number; // ์๋
deliveryPolicyId: number; // ๋ฐฐ์ก๋น ์ ์ฑ
extraDeliveryPolicyId?: number; // ์ถ๊ฐ ๋ฐฐ์ก๋น ์ ์ฑ
}
๊ทธ๋ ๊ฒ ๊ตฌํ์ ํ๋ ์ค์, ๊ธฐ์กด ์ฝ๋์์ ์ํ๋ค์ ์ด ๋ฌด๊ฒ๋ฅผ ๊ณ์ฐํ๋ ๋ถ๋ถ์ ๋ฒ๊ทธ๊ฐ ์๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ต๋๋ค.
interface๋ฅผ ๋ณด๋ฉด, ๊ฐ ์ํ ๋ณ๋ก weight ์ amount๋ฅผ ์ ๋ฌํ๊ณ ์๋๋ฐ, ์ํ๋ณ ์๋์ ๋ฌด์ํ๊ณ ๋ฌด๊ฒ๋ง ๋ํด์ ๊ณ์ฐ์ ํ๊ณ ์์์ต๋๋ค. 500g ์ง๋ฆฌ ์ํ 5๊ฐ, 300g ์ง๋ฆฌ ์ํ 3๊ฐ๋ฅผ ์ฌ๋ฉด, 3400g์ด ๋์ด์ผ ํ๋๋ฐ, 800g ์ผ๋ก ๊ณ์ฐํ๊ณ ์์๋ ๊ฒ์ด์์ต๋๋ค.
// ๋ฌด๊ฒ๋ณ ๋ฐฐ์ก๋น ์ ์ฑ
class DiffWeightRangeStrategy implements Strategy<DiffWeightRangePolicy> {
calculate(deliveryItems: DeliveryFeeType) {
const totalWeight = deliveryItems.items.reduce(
(prev, cur) => prev + cur.weight,
0
)
}
}
๊ทธ๋์ ๋น ์ง ๋ถ๋ถ์ ์์ ํ๊ณ ํ ์คํธ๋ฅผ ํด๋ณด๋ ๋ฐฐ์ก๋น๊ฐ ์ด์ํ๊ฒ ๋ง์ด ๋์์ต๋๋ค.
์๊ณ ๋ณด๋, deliveryItems๋ก ๋๊ธฐ๋ weight ๋ ์ด๋ฏธ ํด๋น ์ํ์ weight * amount ๋ก ๊ณ์ฐ์ด ๋๋ ์ํ๋ก ๋๊ธฐ๊ณ ์์์ต๋๋ค.
๋ฒ๊ทธ์ธ์ค ์์๋ ๋ถ๋ถ์ด ๋ฒ๊ทธ๊ฐ ์๋๊ณ ๊ตฌํ์ ๋ฌธ์ ์์ด ์๋์ด ์์์ต๋๋ค.
๊ฐ๋ฐํ๋ ๋น์์๋ ํด๋น interface์ weight ์ ์ด๋ฏธ amount๊ฐ ๊ณฑํด์ ธ ์๋ค๋ ๊ฒ๊ณผ, DiffAmountRangeStrategy ์์๋ interface์ ์๋ amount๋ ์ฌ์ฉํ์ง ์๋๋ค๋ ์ฌ์ค์ ์ ์ธ์งํ๊ณ ์์์ง๋ง,
์๊ฐ์ด ํ๋ฅด๊ณ ์ฝ๋์ ์ผ๋ถ๋ง ๋ณด๋ฉด์ interface๋ฅผ ๋ดค์๋๋ ๊ทธ ๊ธฐ์ต์ ์์ด๋ฒ๋ฆฐ ์ํ์์ต๋๋ค.
์๋ก์ด ๋ฐฐ์ก๋น ๊ณ์ฐ interface
์คํด์ ์์ง๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ํด ํ๋๋ก ์ ์ํ๋ interface๋ฅผ ๊ฐ ์ ์ฑ
์ type๋ณ๋ก ๋ถ๋ฆฌํ๊ณ ,
weight ๋์ weightSum ์ด๋ผ๋ ๋ช
์นญ์ผ๋ก ๋ณ๊ฒฝํ์ต๋๋ค.
interface DeliveryFeeDiffAmountType {
id: number;
amount: number;
deliveryPolicyId: number;
}
interface DeliveryFeeDiffWeightType {
id: number;
weightSum: number; // weight * amount
deliveryPolicyId: number;
extraDeliveryPolicyId: number;
}
interface UnionDeliveryFeeType {
items: Array<DeliveryFeeDiffAmountType | DeliveryFeeDiffWeightType>;
countryCode: Country;
}
๋ณ๊ฒฝ๋ interface๋ฅผ ์ ์ฉํ ์ฝ๋๋ ์๋์ ๊ฐ์ต๋๋ค.
// deliveryItems๋ฅผ UnionDeliveryFeeType์ผ๋ก ๋ณ๊ฒฝ
class DeliveryFeeCalculator {
calculateDeliveryFee(deliveryItems: UnionDeliveryFeeType, strategy: Strategy<UnionDeliveryPolicy>) {
return strategy.calculate(deliveryItems);
}
}
// ๋ฌด๊ฒ๋ณ ๋ฐฐ์ก๋น ์ ์ฑ
class DiffWeightRangeStrategy implements Strategy<DiffWeightRangePolicy> {
calculate(deliveryItems: {items: DeliveryFeeDiffWeightType[]; countryCode: Country}) {
const totalWeight = deliveryItems.items.reduce(
(prev, cur) => prev + cur.weightSum,
0
)
}
}
๊ฒฐ๋ก
๊ฐ๋ฐ ๋น์์๋ ์ ์ดํดํ๊ณ ์์๋ ์ฝ๋๋ ์๊ฐ์ด ์ง๋๋ฉด ๊ธฐ์ต์ด ํฌ๋ฏธํด์ง๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ ๋น์์๋ ๋๋ฌด๋ ๋น์ฐํด๋ณด์๋ ๋ก์ง์ด๋ ์ฝ๋๋ ๊ทธ๋ ์ง ์์ ๊ฒฝ์ฐ๋ ๋ง๊ณ ๋์น๋ ๋ถ๋ถ๋ค๋ ์๊ธฐ๋ ๊ฒ ๊ฐ์ต๋๋ค.
ํนํ interface๋ฅผ ์ ์ํ ๋๋ ์๊ฐ์ด ํ๋ฌ๋ ๋ฐ๋ก ์ดํดํ ์ ์๋๋ก ์ ํํ๊ฒ ํํํด์ฃผ๋ ๊ฒ ์ค์ํ ๊ฒ ๊ฐ์ต๋๋ค.
์ด์ฉ ์ ์์ด ์ฝ๋๋ง์ผ๋ก ๋ช ํํ๊ฒ ํํํ๊ธฐ ์ด๋ ค์ด ๊ฒฝ์ฐ์๋, ์ฃผ์์ด๋ผ๋ ์ ๋จ๊ฒจ๋๋ ๊ฒ ํ์ํ ๊ฒ ๊ฐ์ต๋๋ค.
๋๊น์ง ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค~ ๐