리플렉션(Reflection)과 Spring
JVM을 공부하다 보니 리플렉션이라는 개념이 등장했다. 리플렉션은 곧 Spring에 대한 이야기라고 하셨다. Java의 겉핧기 식 공부만 한 비전공자인 나에겐 생소한 개념이었기 때문에 리플렉션의 개념부터 공부하기 시작했다. 그렇다면 Spring과의 연관성은 어떻게 이루어지는 것일까?
리플렉션(Reflection)이란?
https://hyeri-dev.tistory.com/13
자바 리플렉션(Reflection)
리플렉션(Reflection)이란? 리플렉션의 어원 리플렉션의 어원은 반사, 비치다라는 뜻을 가진다. 즉, 리플랙션은 실질적인 주체(클래스)를 투영한 혹은 반사된 이미지, 클래스 로더에 의해 JVM 메모리
hyeri-dev.tistory.com
리플렉션은 클래스로더에 의해 JVM 메모리 영역에 저장된 클래스의 정보 중 필요한 정보들을 사용하는 기능을 말한다. Class라는 실행중인 자바 애플리케이션의 클래스, 인터페이스의 정보를 가진 클래스를 사용하여 클래스에 붙은 애너테이션을 조회하거나, 생성자, 필드, 메서드 등을 조회하고 조작할 수 있다.
따라서, 구체적인 클래스의 타입을 알지 못하더라고 그 클래스의 정보에 접근할 수 있게 해주는 것이다.
리플렉션을 사용하는 이유
리플렉션은 주로 객체의 타입을 알 수 없을 때 사용하기 때문에 개발자가 직접 코딩할 때에는 객체의 타입을 모르는 일이 거의 없어 리플렉션을 사용하는 일이 드물다.
하지만 프레임워크와 라이브러리는 사용자가 생성한 객체가 어떤 타입인지 컴파일 시점까지 알 수가 없어 문제가 발생한다. 이 문제를 동적으로 해결하기 위해 리플렉션을 사용하게 된다.
즉, Spring 프레임워크는 자바 리플렉션을 활용하여 다양한 기능을 제공하고, Spring의 핵심 기능 중 일부는 리플렉션을 기반으로 동작한다는 것이다.
리플렉션의 사용
JPA, Jackson, Mockito, JUnit 등 다양한 곳에서 리플렉션을 사용하며, IDE인 InteliJ의 자동 완성 기능 또한, 리플렉션을 사용한 것이다.
기본 생성자
프레임워크나 라이브러리에서 객체에 기본 생성자를 필요로 한다. 프로젝트를 하면서도 기본 생성자가 존재하지 않아 오류가 발생하는 경우가 발생한 적이 있었다.
리플렉션은 기본 생성자 외의 생성자가 존재한다 하더라도 기본 생성자를 필요로 한다. 그 이유는 기본 생성자로 객체를 생성하고 필드를 통해 값을 넣어 주는 것이 가장 간단한 방법이기 때문이다.
애너테이션
애너테이션이 작동하는 원리도 리플렉션이 사용된다. 리플렉션을 통해 클래스나 메서드, 파라미터 정보를 가져온 후 리플렌션의 getAnnotation(), getDeclaredAnnotaion()등의 메서드를 통해 원하는 애너테이션이 존재하는 지 확인한다.
원하는 애너테이션이 존재한다면 원하는 로직을 수행하는 방식으로 사용된다.
빈(Bean) 생성과 주입
Spring은 클래스 정보를 리플렉션을 통해 분석하고, 빈 객체를 생성한다.
Spring 컨테이너는 빈 클래스의 생성자를 찾아 객체를 생성하며 필드나 메서드에 주입해야 할 의존성 정보를 파악하기 위해 리플렉션을 활용한다.
의존성 주입(DI, Dependency Injection)
Spring은 DI를 사용하여 객체 간의 관계를 설정하고 제어한다. 이러한 DI를 구현하기 위해서는 리플렉션을 사용하여 클래스의 생성자, 메서드, 필드 등을 검사하고 이를 통해 의존성을 주입한다.
AOP(관점 지향 프로그래밍)
Spring AOP는 프록시 객체를 생성하고 메서드 호출을 가로채어 특정 기능을 추가하기 위해 리플렉션을 사용한다.
Reference.
https://youtu.be/67YdHbPZJn4?si=mGPyEhykOzFEhSdr
https://tecoble.techcourse.co.kr/post/2020-07-16-reflection-api/