Contents

Java Reflection Api에 대해

Java의 Reflection API는 무엇이고, 어떻게 사용되고 있을까?

https://www.baeldung.com/java-reflection

Reflection API

리플렉션을 사용하기 위해서는 별도의 jar 파일이나 의존성이 필요하지 않다. java.lang.reflect 패키지에 이미 번들되어 있다.

리플렉션 API는, 구체적인 클래스 타입을 알지 못해도 그 클래스의 정보에 접근할 수 있게 해준다.

이게 어떻게 가능한가?

리플렉션의 동작 방식은 자바의 동작 방식과 밀접하게 연관되어 있다.

https://tecoble.techcourse.co.kr/post/2020-07-16-reflection-api/

  1. 개발자가 작성한 자바 코드는 컴파일을 통해 .class 파일로 변환된다.
  2. class 파일에는 바이트 코드가 들어 있으며, 이 바이트 코드는 다시 JVM의 static 영역에 저장된다.
  3. 리플렉션 API는 이 영역을 뒤져서 정보를 가져온다.

장단점

https://docs.oracle.com/javase/tutorial/reflect/index.html

장점

  • 확장 기능: 어플리케이션이 외부의 사용자 정의된 클래스를, 확정 인스턴스를 생성하여 사용할 수 있다.
  • 클래스 탐색기와 개발 환경 플러그인: 개발자가 올바른 코드를 작성하는 것을 돕기 위한 플러그인의 개발 등에 타입 정보를 사용할 수 있다.
  • 디버거와 테스트 툴: 디버거는 클래스 내부의 private한 멤버에 접근할 수 있어야 한다. 테스트들은 리플렉션을 사용해서 클래스 안에 정의된 API들을 사용하여 보다 높은 테스트 커버리지를 달성하는데 도움을 준다.

단점

  • 성능 오버헤드: 타입 분석을 컴파일 타임이 아닌 런타임에 실행한다. JVM은 이 예외적인 동작을 최적화할 수 없다.
  • 추상화를 깨뜨린다: 직접 접근이 불가능한 private한 변수와 메서드에 접근하기 때문에 예기치 못한 부작용을 일으킬 수 있다.

그렇다면 언제 사용할까?

사용자가 직접 작성하는 비즈니스 로직이 들어가는 어플리케이션 레벨에서는 리플렉션을 사용하지 않게 된다. 부작용을 일일이 개발자가 컨트롤하기에는 위험성이 동반되기 때문이다.

스프링 프레임워크에서는..

https://stackoverflow.com/questions/20817425/why-reflection-is-used-in-this-situation

스프링에 빈으로 등록된 컴포넌트들은 내부적으로 리플렉션 API를 사용한다. (!)

  • 빈은 어플리케이션이 실행된 후 런타임에 객체가 호출될 때 동적으로 객체의 인스턴스를 생성한다.
  • 이 때 스프링 컨테이너의 BeanFactory에서 리플렉션 API를 사용한다.

Spring Data JPA에서 Entity에 기본 생성자가 필요한 이유 == 동적으로 객체를 생성할 떄 리플렉션 API를 사용한다.

리플렉션 API로 가져올 수 없는 정보 중 하나로는 생성자의 인자 정보가 있다.

따라서 기본 생성자가 반드시 있어야 객체를 생성할 수 있다.