스프링에서 리플렉션(Reflection)은 주로 런타임 시점에 동적으로 수행하기 위해 사용된다.
리플렉션으로 얻을 수 있는 정보
- 클래스의 메타 데이터 : 클래스 이름, 접근제어자, 부모클래스, 구현된 인터페이스 등
- 필드 정보 (접근 및 수정)
- 메서드 정보 (정보확인, 동적 호출)
- 생성자 정보 : 생성자를 활용해 동적으로 객체 생성 가능
리플렉션의 사용처(in Spring)
private final...
필드, @Autowired
등등 해당@Autowired
, @Transactional
, @RequestMapping
등 애노테이션을 통해 메타데이터를 읽고 동작을 수행합니다.예시 : 서블릿
중요한 것은 컴파일 시간에 모든 것을 결정하지 않는다 는 것이다.
"나는 이 객체에서 특정 서비스를 사용할거야" 정도의 계획만 세우고, 실제로 어떤 서비스를 주입할지는 '런타임'시점에 결정된다.
이러한 방식에서 우리는 장점과 단점을 함께 유추할 수 있다.
장점 : 유연하다. 개발자는 주입을 직접 신경쓰지 않기 때문에 비지니스 로직에 집중할 수 있게 된다.
단점 : 개발자가 신경쓰지 않는다는 것. 런타임에 주입된다는 것은 즉 컴파일 시점에는 오류를 발견하지 못할수도 있다는 뜻이 된다. 또, 스프링의 할일이 늘어나 무거워질 수 있다.
그렇다면 리플렉션은 의존성 주입을 실제로 어떻게 실행하고 있을까?
findAutowiringMetadata()
: 빈(Bean) 이름이나 클래스 이름을 키(key)로 사용해서 캐시에서 메타데이터를 조회한다.자세한 정보는 아래 게시글에서 깊게 이해할 수 있었다.
https://curiousjinan.tistory.com/entry/spring-constructor-injection-reflection