이번 포스팅 주제는 reflection이 어떻게 스프링의 강력한 기능들을 지원할 수 있게 해주는지 알아보는 것입니다.
진행 동기
스프링이 지원해주는 편리한 기능들에 감탄하는 경우가 종종 있습니다. 그런데 구체적으로 이런 기능들이 어떻게 가능한 것인지 궁금해져서 ChatGpt나 구글링하면서 찾아보던중 reflection이라는 Java API의 존재에 대해 알게 되었습니다.
Java Reflection Api
리플렉션이란 런타임 시 프로그램의 클래스, 메서드, 필드 및 기타 구성 요소를 검사하고 조작할 수 있는 기능입니다.
이 기능을 사용하게 되면 컴파일 시점에 정확한 타입이 결정되지 않아도 다양한 클래스 및 객체와 함께 동작할 수 있게 됩니다.
이렇게 되면 굉장히 유연하고 동적인 코드를 쉽게 작성하는 것이 가능해지는 것이고 많은 웹 개발자들이 스프링 같은 프레임워크를 사용하는 가장 큰 이유 중 하나라고 생각합니다.
Spring이 Reflection API를 사용하는 이유
- Java는 컴파일 시 유형을 결정해야 하는 정적 언어이므로 Spring은 개발자가 DI, Bean Instantiation 등의 기능을 사용할 수 있도록 리플렉션이라는 API를 사용합니다.
- Spring은 Java의 리플렉션 API를 활용해서 개발자가 보다 유연하고 추상적인 방식으로 코드를 작성하도록 유도합니다.
즉 Java 계열에서 Spring을 사용하는 이유는 Java만으로 객체지향 5원칙을 모두 지킬 수 없기 때문인데 Spring을 사용하면서 문제가 어느정도 해결되었고, Spring이 그렇게 해줄 수 있는 이유는 런타임에 타입을 결정할 수 있기 때문입니다.
Spring이 런타임에 타입을 결정할 수 있는 이유는 Java의 Reflection API라는 핵심 라이브러리가 있기 때문인 것이죠...
Reflection API를 사용하는 Spring의 핵심 기능
DI (Dependency Injection (DI)
- Spring에서 DI 메커니즘은 리플렉션에 의해 구동
- XML 구성이나 @Component, @Service 등과 같은 주석을 통해 Spring에서 빈(구성 요소)을 정의할 때 Spring은 리플렉션을 사용하여 클래스와 해당 종속성을 검사
- 런타임 중에 Spring은 리플렉션을 사용하여 이러한 클래스의 인스턴스를 생성하고 생성자를 식별하며 해당 유형을 분석하여 필요한 종속성을 주입
- 이를 통해 Spring은 구체적인 유형에 대한 직접적인 컴파일 시간 지식 없이도 종속성을 동적으로 충족할 수 있으므로 구성 요소 간의 느슨한 결합을 달성
Aspect-Oriented Programming (AOP)
- Spring의 AOP 기능은 리플렉션을 사용하는 동적 프록시에 의존
- Spring에서 aspect 와 pointcut 을 정의할 때 프레임워크는 리플렉션을 사용하여 프록시 객체를 생성
- 프록시 개체는 대상 개체에 대한 메서드 호출을 가로채서 로깅, 보안 및 트랜잭션 관리와 같은 cross-cutting 문제에 적용
- 리플렉션은 이러한 프록시를 생성하고 소스 코드를 수정하지 않고 애스펙트 동작을 원래 클래스에 동적으로 짜는 데 사용
Component Scanning
- Spring의 컴포넌트 스캐닝 기능은 지정된 패키지 내에서 특정 주석(예: @Component, @Service 등)으로 주석이 달린 클래스를 발견하기 위해 리플렉션을 활용
- 런타임 동안 Spring은 리플렉션을 사용하여 클래스 경로를 스캔하고 필요한 주석이 있는 클래스를 식별하며 애플리케이션 컨텍스트에서 빈으로 등록
- 이 자동화는 수동 bean 등록 및 구성의 필요성을 제거
Bean Instantiation and Lifecycle Management
- Spring이 빈을 초기화할 때 종종 리플렉션을 사용하여 빈을 인스턴스화하고 생성자를 식별하며 세터 메서드 또는 필드를 통해 속성 값을 설정
- Spring은 @PostConstruct 및 @PreDestroy와 같은 빈 수명 주기 콜백을 지원
- 리플렉션은 bean의 수명 주기 동안 적절한 시간에 이러한 메서드를 식별하고 호출하는 데 사용
정리
이번 포스팅에서는 Reflection API와 Spring에 Reflection API가 사용되는 이유 및 사례들을 살펴보았습니다.
긴 글 읽어주셔서 감사합니다.^^
'Programming Language > Java' 카테고리의 다른 글
Java Start (0) | 2024.06.18 |
---|---|
JVM Execution - 자바 코드가 기계어로 번역되기까지 (2) | 2023.08.27 |
Java의 동작 방식에 대하여 - JVM Architecture, ClassLoader (0) | 2023.07.19 |
Java의 람다식(Lambda expression)에 대해 알아보기 (0) | 2023.07.15 |