본문 바로가기
프로그래밍/알아보자 시리즈

[Spring] JAVA Reflection API가 궁금하다!

by 노잼인간이라불립니다 2023. 2. 25.

얼마 전에 MapStruct, ModelMapper, ObjectMapper에 대하여 chatGPT에게 질문하였다.

 

ObjectMapper는 런타임 환경에서 JAVA의 Reflection API를 이용해서 작동한다는 것을 알게 되었고,

 

Reflection API가 무엇인지 찾아보기 시작하였다.

 

Reflection에 대해서 chatGPT에게 질문하였고, 답변을 받을 수 있었다.

 

스프링의 Reflection API는 자바의 리플렉션 기술을 이용하여 객체를 동적으로 생성하거나 객체의 속성 값을 조회하거나 수정 할 수 있도록 하며, 메서드를 호출할 수 있도록 지원한다고 한다.

 

또한,

 

스프링에서는 bean생성, 조회, 수정에 Reflection 기술을 이용한다는 것을 알 수 있었다.

 

즉,

 

BeanFactory에서 Bean을 동적으로 생성, 속성 값 조회, 수정, 그리고 메서드 호출 하는 과정에서 Reflection API를 사용한다는 것이다. 

 

우리가 평소에 자주 사용하는 DI도 Reflection API를 이용해서 구현되어 있음을 예상해 볼 수 있겠다.

 

하지만 Reflection API가 만능은 아니다. 단점도 존재한다.

 

Mapstruct는 @Retention의 값이 .class, Lombok은 @Retention의 값이 .java(source)로 되어 있다.

 

즉, 일반코드로 메서드를 작성하는 것과 성능이 다를 바 없다고 볼 수있다.

 

그러나 Reflection API를 사용하는 경우 Retention의 값이 Runtime 환경이기 때문에

 

위의 Mapstruct나 Lombok 보다는 자원의 소모가 크다. 즉, 성능이 떨어진다.

 

그러나 자바의 reflection 기술로 있기 때문에, Ioc라는 개념을 실제로 DI로 구현할 수 있게 되었고,

 

DI를 통해 개발자는 좀 더 쉽고 빠르게, 또한 아키텍처적으로도 결합,의존도를 낮추어 개발할 수 있게 되었다.

 

Mapstruct의 @Retention
Lombok Getter의 @Retention

 

 

참고자료

chatGPT