Next-Squad / Interview-Question

주니어 백엔드 개발자 면접 시에 물어볼 수 있는 질문에 대해서 같이 공부하고, 공유하고자 합니다.
169 stars 11 forks source link

[Java] 20. Java Reflection에 대해 설명하시오. #68

Open CMSSKKK opened 2 years ago

CMSSKKK commented 2 years ago

Java Reflection에 대해 설명하시오.

키워드

default constructor, 직렬화, 역직렬화 , IoC

CMSSKKK commented 2 years ago

기본 개념

Reflection은 런타임시에 바이트코드를 활용해 동적 바인딩을 할 수 있게하는 API입니다. 객체 또는 Class의 base package만 알고 있다면 필드. 생성자, 어노테이션, 메서드 등에 접근할 수 있도록 하게합니다.

활용

  1. Spring IoC, DI 스프링을 동작할 때, reflection을 통해서 필요한 Bean들을 의존성을 주입하고 생성하는데 활용합니다.

  2. Junit @Test를 예시로 들면, 어노테이션을 reflection으로 읽어서 해당 메서드를 호출하는 형태로 활용합니다.

  3. JPA(Hibernate) @Entity의 경우 reflection을 활용해서 엔티티를 생성(deserialize)할때 필요로 합니다.

  4. Jackson ObjectMapper JPA와 동일하게 Deserialize할 때 사용합니다.

  5. JDK Dynamic Proxy Rutime weaving, 객체를 프록시화하여 사용할 때 method를 invoke하는 과정 속에서 reflection을 사용합니다.

Reflection의 문제점

  1. 성능 오버헤드 Reflection은 런타임시 동적으로 활용되기 때문에 JVM 최적화가 불가능합니다. 그래서 성능에 민감한 애플리케이션이라면 활용을 최소화해야합니다.

  2. 내부정보 노출 private, protected와 같이 외부에서 사용을 막고 정보를 은닉하도록 캡슐화를 했음에도, 리플렉션은 접근이 가능합니다. 그에 따라 사이드 이펙트가 발생할 수 있습니다.

참고 Deserialize는 기본적으로 Default Constructor 사용합니다. Request DTO의 경우 기본생성자를 Private으로 해두어도 상관없지만,
JPA의 엔티티는 Proxy 객체를 활용하는 경우가 있기 때문에 최소 Protected로 두어야합니다.

References

https://stackoverflow.com/questions/37628/what-is-reflection-and-why-is-it-useful https://jiwondev.tistory.com/151