반응형
DI 컨테이너에서 리플렉션의 실제 동작
(1) 클래스 정보를 로드
- DI 컨테이너는 애플리케이션 시작 시, 관리할 클래스(스프링에서는 @Component, @Service 같은 어노테이션이 붙은 클래스)를 탐색합니다.
- 리플렉션을 사용해 클래스의 정보를 읽어들입니다.
(2) 의존성 정보 추출
- 리플렉션으로 클래스의 필드, 생성자, 메서드 등을 탐색하여 의존성을 추출합니다.
- 예를 들어, 특정 필드에 @Inject 어노테이션이 붙어 있다면, DI 컨테이너는 해당 필드가 주입 대상임을 알게 됩니다.
(3) 객체 생성
- 클래스의 생성자를 리플렉션으로 호출하여 객체를 생성합니다.
- 예를 들어, UserRepository가 필요하면 DI 컨테이너는 UserRepository의 Class 객체를 이용해 런타임에 인스턴스를 만듭니다.
(4) 의존성 주입
- 생성된 객체를 주입해야 할 대상 클래스의 필드나 생성자에 동적으로 삽입합니다.
- 리플렉션은 setAccessible(true)를 통해 private 필드에도 접근할 수 있기 때문에, 코드의 변경 없이도 의존성을 삽입할 수 있습니다.
(5) 객체 관리
- 주입된 객체들은 DI 컨테이너가 관리하며, 필요할 때마다 주입된 상태로 제공됩니다.
리플렉션은 자바 프로그램의 Runtime 시점에 특정 클래스의 메타 데이터를 추출할 수 있는 기법이다.
결론적으로 말하자면 Spring의 DI Container는 런타임 시점에 @Service @Component와 같은 어노테이션이 붙은
클래스를 탐색하여 런타임 시점에 정보를 읽어야 하므로 '리플렉션'을 사용하고
의존성 주입을 해야할 객체를 탐색할때도 런타임 시점에 정보를 읽어햐 하므로 '리플렉션'을 사용한다고 이해했다.
반응형
'Programming > For interview' 카테고리의 다른 글
[Java] 컴파일 시점과 런타임 시점의 차이 (0) | 2025.01.19 |
---|---|
[Servlet/Spring] Filter, Interceptor, AOP의 차이 (0) | 2025.01.18 |
[Java] Java 버전에 따른 핵심 변경 사항 (Java8) (0) | 2024.12.18 |
[JavaScript] JS 기초 중에서 기초, DOM 구조에 대해서 알아보자 (0) | 2024.12.18 |
[Git] Git의 3가지 영역 (0) | 2024.12.17 |