Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
CMSSKKK opened this issue Nov 15, 2022 · 1 comment
Open

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

CMSSKKK opened this issue Nov 15, 2022 · 1 comment
Labels
JAVA 자바 질문

Comments

@CMSSKKK
Copy link
Member

CMSSKKK commented Nov 15, 2022

Java Reflection에 대해 설명하시오.

키워드

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

@CMSSKKK CMSSKKK added the JAVA 자바 질문 label Nov 15, 2022
@CMSSKKK
Copy link
Member Author

CMSSKKK commented Nov 15, 2022

기본 개념

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
JAVA 자바 질문
Projects
None yet
Development

No branches or pull requests

1 participant