Nested Class?
클래스 내부에 존재하는 클래스
static인 경우 static nested class, 그렇지 않은 경우 non-static nested class(또는 inner class)라고 함
⭐ inner class와 nested class의 의미를 헷갈리지 말 것. static inner class라는 개념은 존재할 수 없다.
Bean 등록 원리
두 타입의 nested class의 Bean 등록 가능 여부를 알기 전에, 먼저 Spring이 어떻게 Bean을 생성하고 IoC 컨테이너에 등록하는지 이해해야 함
Spring은
Reflection
을 통해 Bean으로 등록할 객체를 생성Reflection: 클래스의 인스턴스 없이 클래스 정보(이름)만을 가지고 클래스를 생성하고 내부 값에 접근하는 기술
Reflection을 통해 클래스 정보를 얻어 해당 클래스의 생성자를 호출하여 인스턴스를 얻을 수 있다.
따라서 생성자를 호출할 수 있어야 해당 클래스의 인스턴스를 Bean으로 등록할 수 있음 (중요)
Static Nested Class의 Bean 등록 가능 여부
static nested class는 사실상 별도 클래스로 만드는 것과 차이가 없음
외부 클래스의 생성 없이도 생성이 가능하고, 외부 클래스를 참조하지 않기 때문
외부 클래스의 필드/메소드 이용 불가
컴포넌트 어노테이션을 붙여주면, Bean으로 등록됨 (가능)
Non-Static Nested Class(Inner Class)의 Bean 등록 가능 여부
외부 클래스가 반드시 먼저 생성되어야 함
외부 클래스의 인스턴스로부터 new를 호출해서 생성할 수 있음
외부 클래스를 참조할 수 있음
외부 클래스의 필드/메소드 이용 가능
따라서 외부 클래스가 Bean일 때에만 Bean으로 등록 가능
외부 클래스가 Bean이 아니라면, 외부 클래스가 컴포넌트 스캔 대상에 들어가지 않게 되고 외부 클래스 인스턴스가 존재하지 않게 됨
리플렉션의 원리와 연결해보면, 외부 클래스 객체가 없으므로 내부 클래스의 생성자를 호출할 수 없게 되어 빈으로 등록할 수 없음
출처
Last updated