μΌ | μ | ν | μ | λͺ© | κΈ | ν |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- μμ± ν¨ν΄
- νν
- λ°μ΄ν° 쿼리
- νν λ°±μλ
- νν νκΈ°
- νν΄ λ°±μλ
- νΌλ ꡬν
- λμμΈ ν¨ν΄
- νν΄νλ¬μ€
- fanout on write
- νν΄ νλ¬μ€ νκΈ°
- pull model
- νν΄ νκΈ°
- νν΄
- μ±κΈν€ λΉ
- νν΄νλ¬μ€ λ°±μλ
- νν΄νλ¬μ€ νκΈ°
- TDD
- λΉ μ€μ½ν
- νν΄νλ¬μ€ νκ³
- push model
- νν΄νλ¬μ€νκΈ°
- OOP
- API Aggregation
- fanout on read
- νν΄+
- μμ°¨μ§ν₯
- κΈ°λ₯ ν μ€νΈ
- νλ‘ν νμ λΉ
- νν΄νλ¬μ€λ°±μλ
- Today
- Total
deVlog
[λμμΈ ν¨ν΄] νμ ν¨ν΄ - Template Method Pattern (ν νλ¦Ώ λ©μλ ν¨ν΄) λ³Έλ¬Έ
[λμμΈ ν¨ν΄] νμ ν¨ν΄ - Template Method Pattern (ν νλ¦Ώ λ©μλ ν¨ν΄)
μλ£¨λ° 2025. 2. 12. 15:42λͺ©μ°¨
π κ°μ
ν νλ¦Ώ λ©μλ ν¨ν΄μ μμ ν΄λμ€(μΆμ ν΄λμ€)μμ μκ³ λ¦¬μ¦μ ꡬ쑰λ₯Ό μ μνκ³ , νμ ν΄λμ€μμ μΈλΆ ꡬνμ λ΄λΉνλ λμμΈ ν¨ν΄μ΄λ€.
μ¦, μκ³ λ¦¬μ¦μ λΌλλ ν νλ¦Ώ λ©μλκ° μ μνκ³ , ꡬ체μ μΈ λμμ νμ ν΄λμ€κ° μ€λ²λΌμ΄λ©νμ¬ κ΅¬ννλ λ°©μμ΄λ€.
νΉμ§
- μκ³ λ¦¬μ¦ κ΅¬μ‘°λ₯Ό μ¬μ¬μ©ν μ μλ€.
- μΌκ΄λ μ€ν νλ¦μ 보μ₯νλ©΄μλ μΈλΆ ꡬνμ λ³κ²½ν μ μλ€.
- μ½λ μ€λ³΅μ μ€μ΄κ³ μ μ§λ³΄μλ₯Ό μ½κ² λ§λ λ€.
π©π»π» μ½λλ‘ μμ보μ
컀νΌμ μ°¨λ₯Ό λ§λλ κ³Όμ μ ν νλ¦Ώ λ©μλ ν¨ν΄μΌλ‘ ꡬνν΄λ³΄μ
// 1. ν
νλ¦Ώ λ©μλλ₯Ό μ 곡νλ μΆμ ν΄λμ€
abstract class Beverage {
// ν
νλ¦Ώ λ©μλ (μ΅μ’
μ€ν νλ¦μ μ μ)
public final void prepareRecipe() {
boilWater();
brew();
pourInCup();
if (customerWantsCondiments()) { // νν¬(Hook) λ©μλ μ¬μ©
addCondiments();
}
}
// κ³΅ν΅ κ΅¬ν (λͺ¨λ μλ£κ° 곡μ νλ λ‘μ§)
private void boilWater() {
System.out.println("λ¬Όμ λμ΄λ μ€...");
}
private void pourInCup() {
System.out.println("μ»΅μ λ°λ₯΄λ μ€...");
}
// νμ ν΄λμ€κ° ꡬνν΄μΌ νλ μΆμ λ©μλ
abstract void brew();
abstract void addCondiments();
// νν¬ λ©μλ (μ νμ μΌλ‘ μ€λ²λΌμ΄λ© κ°λ₯)
boolean customerWantsCondiments() {
return true;
}
}
// 2. νμ ν΄λμ€ - μ»€νΌ λ§λ€κΈ°
class Coffee extends Beverage {
@Override
void brew() {
System.out.println("컀νΌλ₯Ό λ΄λ¦¬λ μ€...");
}
@Override
void addCondiments() {
System.out.println("μ€νκ³Ό μ°μ λ₯Ό μΆκ°νλ μ€...");
}
}
// 3. νμ ν΄λμ€ - μ°¨ λ§λ€κΈ°
class Tea extends Beverage {
@Override
void brew() {
System.out.println("μ°¨λ₯Ό μ°λ €λ΄λ μ€...");
}
@Override
void addCondiments() {
System.out.println("λ λͺ¬μ μΆκ°νλ μ€...");
}
}
// μ€ν μ½λ
public class TemplateMethodExample {
public static void main(String[] args) {
System.out.println("β μ»€νΌ μ€λΉ");
Beverage coffee = new Coffee();
coffee.prepareRecipe();
System.out.println("\nπ΅ μ°¨ μ€λΉ");
Beverage tea = new Tea();
tea.prepareRecipe();
}
}
- prepareRecipe() λ©μλκ° μκ³ λ¦¬μ¦μ ꡬ쑰λ₯Ό μ μνλ ν νλ¦Ώ λ©μλμ΄λ€.
- brew() μ addCondiments() λ νμ ν΄λμ€κ° ꡬννλ μΆμ λ©μλμ΄λ€.
- customerWantsCondiments() νν¬(Hook) λ©μλλ₯Ό μ¬μ©νλ©΄, νμ ν΄λμ€μμ μ νμ μΌλ‘ κΈ°λ₯μ λ³κ²½ν μ μλ€.
- λλΆμ μλ‘μ΄ μλ£κ° μΆκ°λ λ μ½λ μμ μμ΄ νμ₯ν μ μλ€.
βοΈ μ₯/λ¨μ
β μ₯μ
1. μ½λ μ€λ³΅ κ°μ
- μκ³ λ¦¬μ¦μ 곡ν΅μ μΈ νλ¦μ μμ ν΄λμ€μμ μ μνκ³ , μΈλΆ ꡬνλ§ νμ ν΄λμ€μμ λ€λ₯΄κ² μμ±νλ©΄ λλ―λ‘ μ½λλ₯Ό μ¬μ¬μ©ν μ μλ€.
- λμΌν λ‘μ§μ μ¬λ¬ κ³³μμ μ€λ³΅ ꡬνν νμκ° μλ€.
2. μΌκ΄λ μκ³ λ¦¬μ¦ κ΅¬μ‘° μ μ§
- μκ³ λ¦¬μ¦μ μ€ν μμλ₯Ό λ³κ²½νμ§ μκ³ μ μ§ν μ μλ€.
- νΉμ λ¨κ³μ λμλ§ λ³κ²½νκ³ μΆμ λ νμ ν΄λμ€μμ νμν λΆλΆλ§ μ€λ²λΌμ΄λ©νλ©΄ λλ€.
3. νμ₯μ±μ΄ λ°μ΄λ¨ (OCP μμΉ μ€μ)
- μλ‘μ΄ κΈ°λ₯μ΄ νμν κ²½μ°, κΈ°μ‘΄ μ½λλ₯Ό μμ νμ§ μκ³ μλ‘μ΄ νμ ν΄λμ€λ₯Ό μΆκ°νλ λ°©μμΌλ‘ νμ₯ν μ μλ€.
- μ΄λ κ°λ°©-νμ μμΉ(Open-Closed Principle, OCP)μ λ°λ₯΄λ μ€κ³ λ°©μμ΄λ€.
4. νν¬(Hook) λ©μλλ₯Ό νμ©ν μ μ°ν ꡬν κ°λ₯
- νν¬(Hook) λ©μλλ₯Ό νμ©νλ©΄ νμ ν΄λμ€κ° μ νμ μΌλ‘ λμμ λ³κ²½ν μ μλ€.
- μλ₯Ό λ€μ΄, customerWantsCondiments() κ°μ νν¬ λ©μλλ₯Ό μ¬μ©νμ¬ μ‘°κ±΄μ λ°λΌ κΈ°λ₯μ νμ±νν μ μλ€.
β λ¨μ
1. νμ ν΄λμ€κ° λ§μμ§ κ²½μ° λ³΅μ‘ν΄μ§ μ μμ
- ν νλ¦Ώ λ©μλλ₯Ό μ¬μ©ν μλ‘ νμ ν΄λμ€μμ μΈλΆ ꡬνμ λ΄λΉν΄μΌ νλ―λ‘, λ무 λ§μ νμ ν΄λμ€κ° μκΈΈ μ μλ€.
- μ΄λ μ½λμ 볡μ‘μ±μ μ¦κ°μν€κ³ μ μ§λ³΄μλ₯Ό μ΄λ ΅κ² λ§λ€ μ μλ€.
2. μ€κ³κ° μλͺ»λλ©΄ μ μ°μ±μ΄ λ¨μ΄μ§ μ μμ
- μκ³ λ¦¬μ¦μ νλ¦μ΄ μμ ν΄λμ€μμ μ ν΄μ Έ μκΈ° λλ¬Έμ, νΉμ λ¨κ³μμ λ³νλ₯Ό μ£Όκ³ μΆμ΄λ ꡬ쑰μ μΌλ‘ μ΄λ ΅κ±°λ μ νμ΄ μμ μ μλ€.
- λͺ¨λ κ²½μ°λ₯Ό λ€ λ°μνλ €κ³ νλ©΄ ν νλ¦Ώ λ©μλ μμ²΄κ° λ무 볡μ‘ν΄μ§ μ μλ€.
3. λ¨μΌ μ± μ μμΉ(SRP) μλ° κ°λ₯μ±
- μμ ν΄λμ€μμ μκ³ λ¦¬μ¦μ μ 체μ μΈ νλ¦μ μ μνλ©΄μ λ무 λ§μ μ± μμ κ°μ§κ² λ κ°λ₯μ±μ΄ μλ€.
- μ΄λ μ μ§λ³΄μμ±κ³Ό κ°λ μ±μ μ νμν¬ μ μλ€.
4. λλ²κΉ μ΄ μ΄λ €μΈ μ μμ
- ν νλ¦Ώ λ©μλλ₯Ό μ¬μ©νλ©΄ λ©μλ νΈμΆμ΄ μμ ν΄λμ€μ νμ ν΄λμ€ μ¬μ΄μμ μ΄λ£¨μ΄μ§λ―λ‘, λλ²κΉ μ΄ μ΄λ €μΈ μ μλ€.
- νΉν, νν¬ λ©μλκ° μμμΉ λͺ»ν λμμ νκ±°λ, νμ ν΄λμ€μμ μ€λ²λΌμ΄λ©μ΄ μλͺ»λ κ²½μ° μμΈμ μ°ΎκΈ° μ΄λ ΅λ€.
π μ 리
ν νλ¦Ώ λ©μλ ν¨ν΄μ μκ³ λ¦¬μ¦μ κ³΅ν΅ λΆλΆμ μμ ν΄λμ€μμ μ μνκ³ , μΈλΆ μ¬νμ νμ ν΄λμ€μμ ꡬννλλ‘ κ°μ νλ ν¨ν΄μ΄λ€.
μκ³ λ¦¬μ¦μ ꡬ쑰λ₯Ό μ¬μ¬μ©νλ©΄μλ μ μ°ν νμ₯μ κ°λ₯νκ² ν΄μ£Όλ κ°λ ₯ν ν¨ν΄μ΄λΌλ μ₯μ μ κ°μ§μ§λ§,
λ무 λ§μ νμ ν΄λμ€κ° νμνκ±°λ μ§λμΉκ² 볡μ‘ν ꡬ쑰λ₯Ό λ§λ€ κ²½μ° μ€νλ € μ μ§λ³΄μκ° μ΄λ €μμ§ μ μλ€.
λ°λΌμ, ν¨ν΄μ μ μ©ν λλ μ μ ν κ²½μ°μλ§ μ¬μ©νλ κ²μ΄ μ€μνλ€.
β μΈμ μ¬μ©νλ©΄ μ’μκΉ?
- 곡ν΅λ μκ³ λ¦¬μ¦ νλ¦μ΄ μμΌλ©°, μΌλΆλ§ λ€λ₯΄κ² ꡬνν΄μΌ ν λ.
- μ½λ μ€λ³΅μ μ€μ΄κ³ , νμ₯μ±μ λμ΄κ³ μΆμ λ.
- μκ³ λ¦¬μ¦μ λ³κ²½ μμ΄ μλ‘μ΄ κΈ°λ₯μ μ½κ² μΆκ°νκ³ μΆμ λ.
β μΈμ νΌν΄μΌ ν κΉ?
- νμ ν΄λμ€κ° λ무 λ§μμ Έμ 볡μ‘λκ° μ¦κ°ν λ.
- μ μ°ν νμ₯μ΄ νμνλ° ν νλ¦Ώ λ©μλμ μ νμ΄ λ§μ λ.
- μκ³ λ¦¬μ¦μ΄ λ무 λ€μν΄μ μμ ν΄λμ€μμ μ μνκΈ° μ΄λ €μΈ λ.