2022. 6. 2. 12:28γBackend/πΏ Spring
λ‘κΉ λ±μ λΆκ° μ²λ¦¬ κΈ°λ₯μ μν΄ νλ‘μ ν΄λμ€λ₯Ό λ§€λ² λ§λ€κΈ°μ, μ μ© λμ ν΄λμ€ μ λ§νΌ νλ‘μ ν΄λμ€λ₯Ό λ§λ€μ΄μΌ νλ λ¬Έμ κ° μλ€. λ‘κ·Έ μΆμ μ μν νλ‘μ ν΄λμ€μ μμ€μ½λλ κ±°μ κ°μ λͺ¨μμ νκ³ μλ€. κ°μ λͺ¨μμ ν΄λμ€λ₯Ό μ¬λ¬κ° λ§λλ κ²μ λΉν¨μ¨μ μΌ λΏλλ¬ SRP μμΉμ μλ°°νκΈ° λλ¬Έμ, λμ νλ‘μ κΈ°μ μ νμ©νμ¬ μ΄ λ¬Έμ λ₯Ό μ μ§μ μΌλ‘ ν΄κ²°ν΄λ³΄μ.
리νλ μ μ΄λ?
κ°μ²΄λ₯Ό ν΅ν΄ ν΄λμ€μ λ©νμ 보λ₯Ό λΆμνλ νλ‘κ·Έλ¨ κΈ°λ²μ μλ―Ένλ€. ν¬μ, λ°μ¬λΌλ μ¬μ μ μλ―Έλ₯Ό κ°μ§λλ°, ν΄λμ€μ λ©νμ 보λ₯Ό ν¬μνλ€κ³ μ΄ν΄νλ©΄ λλ€.
κ·ΈλΌ λνλ¬ κ΅³μ΄ κ°μ²΄λ₯Ό ν΅ν΄ ν΄λμ€μ μ 보λ₯Ό μμλ΄μΌν κΉ?
ꡬ체μ μΈ ν΄λμ€μ νμ μ μμ§ λͺ»ν΄λ, ν΄λΉ ν΄λμ€κ° κ°μ§κ³ μλ λ©μλ, νμ , λ³μ λ±μ μ κ·Όν΄μΌ ν κ²½μ°κ° μκΈ° λλ¬Έμ΄λ€.
μλ₯Ό λ€μ΄ μ½λλ₯Ό μμ±ν μμ μλ μ΄λ€ νμ μ ν΄λμ€λ₯Ό μ¬μ©ν μ§ λͺ°λΌλ λμ§λ§, μ ν리μΌμ΄μ μ΄ μ€νμ€μΈ λ°νμ μμ μλ μ€νμ€μΈ ν΄λμ€λ₯Ό κ°μ ΈμμΌ ν κ²½μ°κ° μλ€. μ΄λ΄ λ 리νλ μ κΈ°λ²μ μ¬μ©νλ©΄ λμ μΌλ‘ κ°μ²΄λ₯Ό κ°μ Έμ μ€νν μ μλ€. μλ μμλ₯Ό 보면μ λ μμΈν μμ보μ.
κ°μ λ‘κ·Έ κΈ°λ₯, μ€λ³΅λλ μ½λ
μ¬κΈ°μ 곡ν΅λλ κΈ°λ₯μ log.info("start")
μ resultμ λ‘κ·Έλ₯Ό μ°λ λΆλΆμ΄κ³ , κ°λ³ κΈ°λ₯μ κ°κ°μ κ°λ³ λ©μλλ₯Ό νΈμΆ( target.callA(), target.callB()
)νλ λΆλΆμ΄λ€.
@Slf4j
public class ReflectionTest {
@Test
@DisplayName("λ‘κ·Έ μ°λ κ³΅ν΅ λ‘μ§ μ¬μ΄μ κ°λ³ λ‘μ§ μ‘΄μ¬ν λ")
void reflection0() {
Hello target = new Hello();
//κ³΅ν΅ λ‘μ§1 μμ
log.info("start");
String result1 = target.callA(); // λ‘κΉ
μ μν΄ νΈμΆνλ λ©μλκ° λ€λ¦
log.info("result={}", result1);
//κ³΅ν΅ λ‘μ§1 μ’
λ£
//κ³΅ν΅ λ‘μ§2 μμ
log.info("start");
String result2 = target.callB(); // λ‘κΉ
μ μν΄ νΈμΆνλ λ©μλκ° λ€λ¦
log.info("result={}", result2);
//κ³΅ν΅ λ‘μ§2 μ’
λ£
}
@Slf4j
static class Hello {
public String callA() {
log.info("callA");
return "A";
}
public String callB() {
log.info("callB");
return "B";
}
}
}
μ§κΈμ callA(), callB() λ©μλκ° μ λΆμ΄μ§λ§, λ‘κ·Έμ λμμ΄ λλ λ©μλκ° μλ°±κ°λ‘ λμ΄λλ€λ©΄?
λ§€λ² log.info("start") λ₯Ό μ°μ μλ μλ λ
Έλ¦μ΄λ€. μΆμνλ₯Ό ν΅ν΄ κ³΅ν΅ λ‘μ§μ λ½μλ΄κ³ μΆμ§λ§, μ€κ°μ νΈμΆνλ κ°λ³ λ©μλκ° λ€λ₯΄κΈ° λλ¬Έμ μ½μ§ μλ€. κ·Έλ λ€λ©΄ νΈμΆνλ λ©μλμΈ target.callA(), target.callB() λΆλΆλ§ λμ μΌλ‘
μ²λ¦¬ν μ μλ€λ©΄ λ¬Έμ λ₯Ό ν΄κ²°ν μ μλ€.
package hello.proxy.jdkdynamic;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
@Slf4j
public class ReflectionTest {
@Test
@DisplayName("κ³΅ν΅ λ‘μ§ μ²λ¦¬νλ dynamicCall() λ‘ λ‘κ·Έ μ²λ¦¬")
void reflection2() throws Exception {
//ν΄λμ€ μ 보
Class classHello = Class.forName("hello.proxy.jdkdynamic.ReflectionTest$Hello");
Hello target = new Hello();
Method methodCallA = classHello.getMethod("callA");
dynamicCall(methodCallA, target); // λ©μλ μ 보μ target λ§ λκΈ°λ©΄ λλ€.
Method methodCallB = classHello.getMethod("callB");
dynamicCall(methodCallB, target);
}
// κ³΅ν΅ λ‘μ§ 1, 2 λ₯Ό νλ²μ μ²λ¦¬ν μ μλ ν΅ν©λ κ³΅ν΅ μ²λ¦¬ λ‘μ§.
// Method method μΈμ : νΈμΆν λ©μλμ μ λ³΄κ° λμ΄μ¨λ€. κΈ°μ‘΄μλ λ©μλ μ΄λ¦μ μ§μ νΈμΆνλ€.
private void dynamicCall(Method method, Object target) throws Exception {
log.info("start");
Object result = method.invoke(target);
log.info("result={}", result);
}
@Slf4j
static class Hello {
public String callA() {
log.info("callA");
return "A";
}
public String callB() {
log.info("callB");
return "B";
}
}
}
μ½λλ₯Ό λΌμΈ λ°μ΄ λΌμΈ μμ보μ.
method.invoke(target)
: target μΈμ€ν΄μ€μ μλ method λ₯Ό νΈμΆνλ€. ->invoke()
μ μΈμλ‘ μλ μΈμ€ν΄μ€μ method(λ©μλ λͺ ) λ₯Ό νΈμΆνλ€.Class.forName("ν΄λμ€λͺ ")
: ν΄λμ€μ λ©νμ 보λ₯Ό νλνλ€. μ°Έκ³ λ‘ λ΄λΆ ν΄λμ€λ ꡬλΆμ μν΄ $ λ₯Ό μ¬μ©νλ€.dynamicCall(Method method, Object target)
: κ³΅ν΅ λ‘μ§ 1, 2 λ₯Ό νλ²μ μ²λ¦¬ν μ μλ ν΅ν©λ κ³΅ν΅ μ²λ¦¬ λ‘μ§.- 첫 λ²μ§Έ νλΌλ―Έν°μΈ Method method λ νΈμΆν λ©μλ μ 보μ ν΄λΉλλ©°, μ μμμμλ Hello ν΄λμ€μ callA(), callB() λ©μλμ ν΄λΉλλ€.
- κΈ°μ‘΄μλ target.callB() ννλ‘ λ©μλ μ΄λ¦μ μ§μ νΈμΆνμ§λ§, μ΄μ λ Method λΌλ λ©νμ 보λ₯Ό ν΅ν΄ νΈμΆν λ©μλ μ 보λ₯Ό λμ μΌλ‘ νλΌλ―Έν°ν νλ€.
Object target
: μ€μ μ€νν μΈμ€ν΄μ€ μ λ³΄κ° λμ΄μ¨λ€. μ€μ μ€νν μΈμ€ν΄μ€λΌ ν¨μ, methodλ₯Ό μ μν μ€μ μΈμ€ν΄μ€λ₯Ό μλ―Ένλ€. κ·Έλ κΈ° λλ¬Έμinvoke()
λ©μλμ μΈμλ‘μ€μ μΈμ€ν΄μ€μΈ target
μ λ°λ κ²μ΄λ€. λ¬Όλ‘ method.invoke(target) μ μ¬μ©ν λ νΈμΆν ν΄λμ€μ λ©μλ μ λ³΄κ° λ€λ₯΄λ©΄ μμΈκ° λ°μνλ€.
μ 리
λ§€λ² κ°λ³λ‘ νΈμΆνλ target.callA(), target.callB() μ½λλ₯Ό 리νλ μ μ μ¬μ©νμ¬ Method λΌλ λ©νμ λ³΄λ‘ μΆμννλ€.
νμ§λ§ 리νλ μ μ νμ μμλ κ°κΈμ μ¬μ©μ μ§μν΄μΌνλ€. μλνλ©΄ 리νλ μ κΈ°μ μ λ°νμμ λμνκΈ° λλ¬Έμ μ»΄νμΌ μμ μ μ€λ₯λ₯Ό μ‘μ μ μκΈ° λλ¬Έμ΄λ€. getMethod()μ μΈμλ‘ λ€μ΄κ° λ©μλλͺ μ μ€νκ° μλλΌλ μ»΄νμΌ μμ μλ λ¬Έμ λ₯Ό μΈμ§ν μ μλ€. μ¦ λ°νμμ΄ λμμΌ, μ ν리μΌμ΄μ μ΄ μ€νλκ³ λμμΌ μλ¬κ° λ°μν μ μλ λ¬Έμ λ₯Ό κ°μ§κ³ μλ€.
μ½λ λ° μλ£ μΆμ²
'Backend > πΏ Spring' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Spring] λμ νλ‘μ κΈ°μ (3) - CGLIB (0) | 2022.06.02 |
---|---|
[Spring] λμ νλ‘μ κΈ°μ (2) - JDK DynamicProxy (0) | 2022.06.02 |
[Spring] μμ λ‘ μμ보λ [ μ λ΅ ν¨ν΄ ] (0) | 2022.05.31 |
[Spring] μμ λ‘ μμ보λ [ ν νλ¦Ώ λ©μλ ν¨ν΄ ] (0) | 2022.05.31 |
[Spring] μ€λ λ λ‘컬, ThreadLocal (2) | 2022.05.31 |