Java Spring에서 “reflection(리플렉션)“은 Java의 런타임 시점에 클래스, 메서드, 필드 등에 접근하고 조작할 수 있는 기능을 의미합니다. 일반적인 컴파일 시점이 아닌, 실행 중인 애플리케이션의 구조를 동적으로 분석하거나 변경하는 데 활용됩니다.
💡 리플렉션이란?
Java 리플렉션 API는 java.lang.reflect 패키지를 통해 제공되며, 다음과 같은 기능을 제공합니다:
- 클래스 이름으로
Class객체를 얻기 - 클래스의 생성자, 메서드, 필드 정보 조회
- 메서드 호출, 필드 값 읽기/쓰기 등 동적 조작
- 접근 제한자(private 등) 무시하고 접근 (
setAccessible(true))
🛠 Spring에서 리플렉션이 쓰이는 주요 예
Spring 프레임워크는 내부적으로 리플렉션을 매우 광범위하게 사용합니다:
1. DI(의존성 주입)
@Autowired
private UserService userService;
Spring은 런타임에 userService 필드에 객체를 주입해야 하므로, 리플렉션으로 해당 필드를 찾아 주입합니다.
2. AOP (Aspect-Oriented Programming)
AOP는 메서드 실행 전후에 로직을 끼워 넣는데, 이 과정에서 메서드 시그니처를 분석하거나 프록시 객체를 생성하기 위해 리플렉션을 사용합니다.
3. Bean 등록 및 초기화
@Component, @Service, @Configuration 등의 어노테이션이 붙은 클래스를 스캔하고 빈으로 등록할 때, 클래스 정보를 분석하고 인스턴스를 만들기 위해 리플렉션을 사용합니다.
4. 어노테이션 처리
Spring은 @RequestMapping, @Transactional, @Entity 등 수많은 어노테이션 기반 기능을 제공합니다. 이 어노테이션 정보를 런타임에 읽기 위해 리플렉션을 활용합니다.
🔍 간단한 예제
Class<?> clazz = Class.forName("com.example.MyClass");
Method method = clazz.getMethod("sayHello");
Object instance = clazz.getConstructor().newInstance();
method.invoke(instance);
이 코드는 문자열로 전달된 클래스 이름으로부터 객체를 생성하고, 해당 클래스의 sayHello 메서드를 실행합니다.
⚠️ 리플렉션의 단점
- 성능 저하: 리플렉션은 일반적인 코드 실행보다 느림
- 안전성 감소: 컴파일 시점에 타입 검사가 불가능
- 보안 이슈: 접근 제한자를 무시할 수 있어 잠재적인 보안 위험
✅ 요약
| 항목 | 설명 |
|---|---|
| 정의 | 런타임에 클래스/메서드/필드 구조를 조회하거나 조작하는 기능 |
| 위치 | java.lang.reflect |
| Spring 활용 | DI, AOP, 어노테이션 처리, 빈 등록 등 |
| 장점 | 유연성, 프레임워크 설계에 유리 |
| 단점 | 성능/안정성 저하 가능성 |