Pink Spider/Java Spring에서 "reflection(리플렉션)"

Created Tue, 29 Jul 2025 14:07:45 +0900 Modified Mon, 08 Dec 2025 08:41:47 +0900
779 Words 4 min

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, 어노테이션 처리, 빈 등록 등
장점 유연성, 프레임워크 설계에 유리
단점 성능/안정성 저하 가능성