2022. 5. 31. 12:07γBackend/πΏ Spring
μ΄μ ν¬μ€ν μμ ν νλ¦Ώ λ©μλ ν¨ν΄μ μμλ΄€κ³ , ν νλ¦Ώ λ©μλ ν¨ν΄μ μμμ΄λΌλ νκ³λ₯Ό ν΄κ²°νκΈ° μν΄ μ λ΅ ν¨ν΄μ νμ©νκΈ°λ‘ νλ€.
μ λ΅ ν¨ν΄
ν νλ¦Ώ ν¨ν΄μ λΆλͺ¨ ν΄λμ€μ λ³νμ§ μλ ν νλ¦Ώμ λκ³ , λ³νλ λΆλΆμ μμ ν΄λμ€μμ μμνμ¬ λ¬Έμ λ₯Ό ν΄κ²°νλ€.
μ λ΅ ν¨ν΄μ λ³νμ§ μλ λΆλΆμ Context λΌλ κ°λ
μ λκ³ , λ³νλ λΆλΆμ Strategy λΌλ μΈν°νμ΄μ€λ₯Ό λ§λ€μ΄ ꡬνν΄ λ¬Έμ λ₯Ό ν΄κ²°νλ€. μ¦ μμ
μ΄ μλλΌ μμ / ꡬν
μΌλ‘ λ¬Έμ λ₯Ό ν΄κ²°νλ κ²μ΄λ€.
μ λ΅ν¨ν΄μμ Context λ 무μμΌκΉ? λ°λ‘ ν
νλ¦Ώ λ©μλ ν¨ν΄μ ν
νλ¦Ώ
μ ν΄λΉλλ κ°λ
μΌλ‘, μ¬κΈ°μλ λ¬Έλ§₯
μ λλ‘ μ΄ν΄νλ©΄ λλ€. κ°λ³ λΉμ¦λμ€ λ‘μ§μ λ³ν μ μμ§λ§, κ·Έκ±Έ ꡬνν΄μΌνλ μ 체μ μΈ λ¬Έλ§₯
μ μ λ³νμ§ μκΈ° λλ¬Έμ, λ³νμ§ μλ λ‘μ§μ Context
μ ꡬννλ€.
Strategy μΈν°νμ΄μ€
μ¬κΈ°μ call() μΆμ λ©μλκ° λ°λ‘ ν΅μ¬ λ‘μ§, μ¦ λ³νλ λΆλΆμ ν΄λΉλλ€. (μ΄μ ν¬μ€ν - λ³νλ λΆλΆ/ λ³νμ§ μλ λΆλΆ μ λΆλ¦¬νλΌ)
Strategy λ₯Ό ꡬνν ν΄λμ€λ call() λ©μλλ₯Ό μ€λ²λΌμ΄λ© νμ¬ μμ λ§μ λΉμ¦λμ€ λ‘μ§μ ꡬννλ©΄ λλ€.
public interface Strategy {
void call();
}
μ λ΅μ ꡬνν StrategyLogic1, StrategyLogic2 ν΄λμ€
@Slf4j
public class StrategyLogic1 implements Strategy {
@Override
public void call() {
log.info("λΉμ¦λμ€ λ‘μ§ 1 μ€ν");
}
}
@Slf4j
public class StrategyLogic2 implements Strategy {
@Override
public void call() {
log.info("λΉμ¦λμ€ λ‘μ§ 2 μ€ν");
}
}
Context ν΄λμ€
Context ν΄λμ€ λ΄λΆμ Strategy strategy λΌλ νλλ₯Ό κ°μ§κ³ μλλ°, μ΄ λΆλΆμ Strategy μΈν°νμ΄μ€μ ꡬν체λ₯Ό μ£Όμ νλ©΄ λλ€.
μ¦ λ΄λΆ νλμ μ λ΅μ 보κ΄νλ λ°©μμΌλ‘, Context λ Strategy μΈν°νμ΄μ€μλ§ μμ‘΄νλ€. κ·Έλ§μ μ¦μ¨, Strategy μ ꡬν체λ₯Ό λ³κ²½νκ±°λ μλ‘ μμ±ν΄λ Context μ½λμλ μν₯μ μ£Όμ§ μλλ€. OCP λ₯Ό μ§ν¨ κ²μ΄λ€.
μ΄λ¬ν ννλ μ€νλ§μμ μμ‘΄κ΄κ³ μ£Όμ (DI)μμ μ¬μ©νλ λ°©μκ³Ό μν΅νλ€. μ¦ μ€νλ§μ μμ‘΄ κ΄κ³ μ£Όμ μ μ λ΅ ν¨ν΄μ μΌμ’ μΌλ‘ λ³Ό μ μλ€.
@Slf4j
public class ContextV1 {
final private Strategy strategy;
// μμ±μ μ£Όμ
public ContextV1(Strategy strategy) {
this.strategy = strategy;
}
public void execute() {
long startTime = System.currentTimeMillis();
strategy.call(); // μμ
long endTime = System.currentTimeMillis();
long resultTime = endTime - startTime;
log.info("resultTime = {}", resultTime);
}
}
Context1 μ΄λΌλ μΈμ€ν΄μ€μ strategyLogic1 μ΄λΌλ ꡬν체λ₯Ό μ£Όμ ν΄λ²λ¦°λ€. μμ‘΄μ±μ μ£Όμ νμ§λ§ ν νλ¦Ώ λ©μλ ν¨ν΄μ μμμ²λΌ, μμ ν΄λμ€μ λΆλͺ¨ ν΄λμ€κ°μ κ°λ ₯ν κ²°ν©μ κ°μ νμ§ μλλ€.
μ 쑰립, ν μ€ν
Context μ λ΄λΆ νλμ Strategy λ₯Ό λκ³ μ¬μ©νλ ννλ‘, Context μ Strategy λ₯Ό νλ² μ‘°λ¦½νκ³ λλ©΄ μ΄νλ‘λ Context λ₯Ό μ€ννκΈ°λ§ νλ©΄ λλ€. μ€νλ§ μ ν리μΌμ΄μ λ‘λ© μμ μ μμ‘΄κ΄κ³ μ£Όμ μ ν΅ν΄ νμν μμ‘΄κ΄κ³λ₯Ό λͺ¨λ λ§Ίμ΄λκ³ λ¨ νμ μ€μ μμ²μ μ²λ¦¬νλ κ²κ³Ό κ°μ μ리λ€.
λ€λ§ μ΄ λ°©μμ λ¨μ μ, νλ² μ‘°λ¦½ν νμλ μ λ΅μ λ°κΎΈκΈ° ν¨λ€λ€λ κ²μ΄λ€. context1 μ μ΄λ―Έ "λΉμ¦λμ€ λ‘μ§1 μ€ν" μ΄λΌλ μ λ΅μ΄ 쑰립λκΈ° λλ¬Έμ, μλ‘μ΄ μ λ΅μ μ¬μ©νλ €λ©΄ λ λ€λ₯Έ context λ₯Ό μμ±ν΄μΌ νλ€.
< λλ€μμ μ¬μ©νλ©΄ κ·Έλ¦Ό 1. 1 μ²λΌ λ²κ±°λ‘κ² ν΄λμ€λ₯Ό μμ±ν νμμμ΄ κ³§ λ°λ‘ μμ‘΄μ±μ μ£Όμ ν μ μμ λΏλλ¬, λΉμ¦λμ€ λ‘μ§μ΄ ν¬ν¨λ ν΄λμ€λ₯Ό λ§€λ² μμ±ν νμκ° μμ΄μ§λ€ >
νλΌλ―Έν° μ λ¬μ νμ©ν μ λ΅ ν¨ν΄
μ¦ "μ 쑰립 νμ€ν" ν¨ν΄μ λ²μ΄λ, μ΄μ μ μμ±μλ‘ μ£Όμ λ°μ μ λ΅μ λ©μλμ νλΌλ―Έν°λ‘ μ λ¬ λ°λ ννλ‘ λ³κ²½ν κ²μ΄λ€.
/*
μ λ΅μ νλλ‘ κ°μ§μ§ μλλ€.
*/
@Slf4j
public class ContextV2 {
// νλΌλ―Έν°λ‘ μ λ΅μ μ λ¬λ°λλ€.
public void execute(Strategy strategy) {
long startTime = System.currentTimeMillis();
strategy.call(); // μμ
long endTime = System.currentTimeMillis();
long resultTime = endTime - startTime;
log.info("resultTime = {}", resultTime);
}
}
μ λ΅ ν¨ν΄ μ μ© : νλΌλ―Έν° νμ©
μ΄ λ°©λ²μ μ₯μ μ execute() μμ , μ¦ λ¬Έλ§₯μ΄ μ€νλλ μμ μ νμν μ λ΅μ μ μ ν κ΅μ²΄ν μ μλ€. μ΄μ λ°©μκ³Ό λΉκ΅ν΄μ μνλ μ λ΅μ λμ± μ μ°νκ² λ³κ²½ν μ μλ μ₯μ μ΄ μλ€.
@Slf4j
public class ContextV2Test {
@Test
void strategyV1() {
ContextV2 contextV2 = new ContextV2(); // 쑰립νμ§ μμμ
contextV2.execute(new StrategyLogic1());
contextV2.execute(new StrategyLogic2());
} // Context, Strategy λ₯Ό μ 쑰립 ν μ€ν μ΄ μλ, Context λ₯Ό μ€νν λλ§λ€ μ λ΅μ μΈμλ‘ μ λ¬νλ€.
// execute μμ μ μ¬λ¬ μ λ΅μ μΈμλ‘ μ λ¬νμ¬ μ μ°νκ² μ€ν κ°λ₯.
@Test
@DisplayName("μ΅λͺ
ν΄λμ€ μ¬μ©")
void strategyV2() {
ContextV2 contextV2 = new ContextV2();
contextV2.execute(new Strategy() {
@Override
public void call() {
log.info("λΉμ¦λμ€ λ‘μ§ 1 μ€ν");
}
});
contextV2.execute(new Strategy() {
@Override
public void call() {
log.info("λΉμ¦λμ€ λ‘μ§ 2 μ€ν");
}
});
}
@Test
@DisplayName("λλ€μ μ¬μ©")
void strategyV3() {
ContextV2 contextV3 = new ContextV2();
contextV3.execute(() -> log.info("λΉμ¦λμ€ λ‘μ§ 1 μ€ν"));
contextV3.execute(() -> log.info("λΉμ¦λμ€ λ‘μ§ 2 μ€ν"));
}
}
μ 리
λκ°μ§ λ°©μμΌλ‘ μ λ΅ ν¨ν΄μ νμΈν΄λ΄€λ€. λ λ°©μ μ€ μ΄λ κ² νλκ° μ°μν μ’λ€λ 건 μλκ³ , κ°λ°μκ° μ²ν μν©μμ μ μ ν λ°©λ²μ μ±ννλ©΄ λλ€.
1) μμ±μ μ£Όμ μ ν΅ν μ λ΅ ν¨ν΄
- μ 쑰립, ν μ€ν λ°©μμΌλ‘ Context λ₯Ό μ€ννλ μμ μ μ΄λ―Έ μ‘°λ¦½μ΄ λλ¬κΈ°μ, μ λ΅μ μ κ²½μ°μ§ μκ³ λ¨μ μ€νλ§ νλ©΄ λλ€.
2) νλΌλ―Έν° μ£Όμ μ ν΅ν μ λ΅ ν¨ν΄.
- μ€νν λ λ§λ€ μ λ΅μ μ μ°νκ² λ³κ²¨ν μ μλ€.
- μ€νν λ λ§λ€ μ λ΅μ κ³μ μ§μ ν΄μ€μΌ νλ κ²μ΄ λ¨μ μΌ μλ μλ€ (λ²κ±°λ‘μ)
μ½λ λ° μλ£ μΆμ² :https://inf.run/5BUY
'Backend > πΏ Spring' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Spring] λμ νλ‘μ κΈ°μ (2) - JDK DynamicProxy (0) | 2022.06.02 |
---|---|
[Spring] λμ νλ‘μ κΈ°μ (1) - 리νλ μ (0) | 2022.06.02 |
[Spring] μμ λ‘ μμ보λ [ ν νλ¦Ώ λ©μλ ν¨ν΄ ] (0) | 2022.05.31 |
[Spring] μ€λ λ λ‘컬, ThreadLocal (2) | 2022.05.31 |
[JUnit5] java.lang.IllegalStateException: Failed to load ApplicationContext (0) | 2022.04.08 |