νλ, μν€μ 리νλ μ λ°νλ₯Ό λ³΄κ³ μ 리ν λ΄μ©μ λλ€.
리νλ μ μ κ°λ λΆν° DI ꡬνκΉμ§ μ€λ¬΄ νμ©μ νμν ν΅μ¬ λ΄μ© μμ£Όλ‘ λ€λ£Ήλλ€.
리νλ μ (Reflection):
"κ±°μΈμ λΉμΉ λͺ¨μ΅μ²λΌ" κ°μ²΄λ₯Ό μ§μ λ€λ£¨λ κ²μ΄ μλλΌ JVM λ©λͺ¨λ¦¬μμ λ°μ¬λ ν΄λμ€ μ 보λ₯Ό ν΅ν΄ κ°μ²΄, νλ, λ©μλλ₯Ό μ‘°μνλ κΈ°μ μ λλ€.

classλ JVMμ μν΄ μλ μμ±| κΈ°λ₯ | μ€λͺ |
|---|---|
| μ΄λ Έν μ΄μ μ‘°ν | getAnnotation(s), isAnnotationPresent() |
| μμ±μ μ‘°ν λ° νΈμΆ | getDeclaredConstructor() + newInstance() |
| νλ μ‘°ν λ° μ‘°μ | getDeclaredFields() + setAccessible() |
| λ©μλ μ‘°ν λ° μ€ν | getDeclaredMethods() + invoke() |
| ν΄λμ€ μ 보 μ‘°ν | μμ μ 보, μΈν°νμ΄μ€ μ 보 λ± |
Class<?> clazz = Dog.class;
Dog hodo = new Dog("hodo");
Class<?> clazz = hodo.getClass();
Class<?> clazz = Class.forName("org.example.Dog");
| getMethods | getDeclaredMethods |
|---|---|
| μμ ν΄λμ€μ μμ μΈν°νμ΄μ€μμ μμν λ©μλλ₯Ό ν¬ν¨νμ¬ publicμΈ λ©μλλ€μ λͺ¨λ κ°μ Έμ¨λ€. | μ κ·Ό μ μ΄μμ κ΄κ³ μμ΄ μμν λ©μλλ₯Ό μ μΈνκ³ μ§μ ν΄λμ€μμ μ μΈν λ©μλλ€μ λͺ¨λ κ°μ Έμ¨λ€. |
getxxxμ getDeclaredxxxλ₯Ό μ ꡬλΆν΄μ μ¬μ©ν΄μΌ ν¨
public class Dog {
private static final String CATEGORY = "λλ¬Ό";
private String name;
public int age;
private Dog() {
this.name = "λλ μ΄";
this.age = 0;
}
public Dog(final String name) {
this.name = name
this.age = 0;
}
public Dog(final String name, final int age) {
this.name = name;
this.age = age;
}
}
java
Class<?> class = Class.forName("org.example.Dog");
Constructor<?> constructor1 = clazz.getDeclaredConstructor();
Constructor<?> constructor2 = clazz.getDeclaredConstructor(String.class);
Constructor<?> constructor3 = clazz.getDeclaredConstructor(String.class, int.class);
java
Object dog1 = constructor1.newInstance();
newInstance() λ©μλλ₯Ό νΈμΆν κ²½μ° μμ±μμ μ κ·Όμ μ΄μκ° privateμ΄λΌ μ κ·Ό λΆκ°νλ€λ μμΈκ° λ°μ νλλ° μ κ·Όμ μ΄μκ° publicμ΄ μλ κ²½μ° setAccessible λ©μλλ₯Ό μ΄μ©νλ©΄ μ κ·Όν μ μλ€.Constructor<?> constructor = clazz.getDeclaredConstructor(String.class, int.class);
constructor.setAccessible(true);
Object dog = constructor.newInstance("νΈλ", 5);
Object dog = constructor.newInstance("νΈλ", 5);
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
System.out.println(field);
System.out.println("value: " + field.get(dog));
System.out.println("------------------");
}

Field field = clazz.getDeclaredField("name");
field.setAccessible(true);
field.set(dog, "λ
콩");

public class Dog {
...
private void speak(final String sound, final int count) {
System.out.println(sound.repeat(count));
public void eats() {
System.out.println("μ¬λ£λ₯Ό λ¨Ήμ΅λλ€.");
}
public int getAge() {
return age;
}
}
Method[] methods = clazz.getDeclaredMethods();
for (Method method : methods) {
method.setAccessible(true);
System.out.println(methods);
System.out.println("\n------------------");
}

Method method = clazz.getDeclaredMethod("speak", String.class, int.class);
method.setAccessible(true);
method.invoke(dog, "λ©λ©!", 5);

| μμ | μ€λͺ |
|---|---|
| JPA | κΈ°λ³Έ μμ±μ μ¬μ© μ΄μ |
| Spring Framework | μμ‘΄μ± μ£Όμ , AOP λ± |
| Jackson, Gson | JSON <-> Object λ§€ν |
| Mockito, JUnit | ν μ€νΈ κ°μ²΄ μ‘°μ |
| IDE μλμμ± | λμ μ 보 μ κ·Ό |
π νλ μμν¬λ κ°μ²΄μ νμ μ μ»΄νμΌ μμ μ μ μ μκΈ° λλ¬Έμ β 리νλ μ μΌλ‘ λμ μ²λ¦¬
λ§μ νλ μμν¬λ λΌμ΄λΈλ¬λ¦¬μμλ κ°μ²΄μ κΈ°λ³Έ μμ±μκ° μ νμν κΉ?
entity, requestDto, responseDtoμμλ κΈ°λ³Έ μμ±μκ° κΌ νμνλ€.
κΈ°λ³Έ μμ±μλ‘ κ°μ²΄λ₯Ό μμ±νκ³ νλλ₯Ό ν΅ν΄ κ°μ λ£μ΄μ£Όλ κ²μ΄ κ°μ₯ κ°λ¨ν λ°©λ²μ΄κΈ° λλ¬Έμ
κΈ°λ³Έ μμ±μλ₯Ό μ¬μ©ν κ²½μ° μ΄ λͺ¨λ κ²½μ°μ μλ€μ κ³ λ €νμ§ μμλ λλ€.

리νλ μ μ μκ°λ³΄λ€ μ°λ¦¬ κ°κΉμ΄μ μλ€!!
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Autowired {}


λ°νμμμ νΈμΆνλ μ΄λ
Έν
μ΄μ
μ΄κΈ° λλ¬Έμ @Retentionμ runtimeμΌλ‘ μ€μ

ApplicationContextλ μμ‘΄ κ΄κ³ μ£Όμ μ λ΄λΉνλ ν΅μ¬μ μΈ λΆλΆ
getInstance() λ©μλλ νΉμ νμ μ ν΄λμ€λ₯Ό μΈμλ‘ λ°μΌλ©΄ κ·Έ νμ μ 리ν΄νλ λ©μλ
createInstance()λ₯Ό ν΅ν΄μ ν΄λμ€ νμ μ λ§λ μΈμ€ν΄μ€λ₯Ό μμ±
createInstance() λ©μλ λ΄μ 리νλ μ APIκ° μ¬μ©λμμ μ μ μλ€
κ·Έλ¦¬κ³ κ·Έ ν΄λμ€μ νλλ€μ μννλ©΄μ AutowiredλΌλ μ΄λ Έν μ΄μ μ΄ λΆμ΄μλμ§ κ²μ¬
Autowired μ΄λ Έν μ΄μ μ΄ λΆμ΄ μλ€λ©΄ κ·Έ νλμ νμ μ λ§λ μΈμ€ν΄μ€λ₯Ό μμ±
setAccessibleμ tureλ‘ μ€μ
λ§μ§λ§μΌλ‘ νλ μΈμ€ν΄μ€λ₯Ό ν΄λΉ νλμ μ£Όμ


| λ¬Έμ μ | μ€λͺ |
|---|---|
| μ±λ₯ μ ν | JVM μ΅μ ν λΆκ°, λ°νμμ λμ |
| μΆμν νκ΄΄ | private, final μ κ·Ό νμ©λ¨ |
| μ½λ 볡μ‘λ μ¦κ° | μ§μ λΆνκ³ μμΈμ²λ¦¬ μ΄λ €μ |
| νμ μμ μ±β | μ»΄νμΌ νμ νμΈ μ΄λ €μ |
λ°λΌμ 리νλ μ μ νμν κ³³μ νμ ν΄ μ μ€νκ² μ¬μ©ν΄μΌ ν©λλ€.