해결된 질문
작성
·
100
·
수정됨
0
public class ApplicationContextSameBeanFindTest {
ApplicationContext ac = new AnnotationConfigApplicationContext(SameBeanConfig.class);
@Test
@DisplayName("타입으로 조회 -> 같은 타입이 둘 이상 있으면 중복 오류 발생")
void findBeanByTypeDuplicate() {
MemberRepository bean = ac.getBean(MemberRepository.class);
System.out.println("bean = " + bean);
}
@Configuration
class SameBeanConfig {
@Bean
MemberRepository memberRepository1() {
return new MemoryMemberRepository();
}
@Bean
MemberRepository memberRepository2() {
return new MemoryMemberRepository();
}
}
}
너....무 기본적인 질문같지만 아직 부족해서 질문드립니다!ㅠㅜ
현재는 복습중입니다.
본문:
이 테스트 코드를 실행하면 오류가 납니다.
->UnsatisfiedDependencyException
ApplicationContext ac = new AnnotationConfigApplicationContext(SameBeanConfig.class);
여기서 중첩 클래스로 SameBeanConfig를 만들었습니다.
그런데 SameBeanConfig에 static을 붙이지 않으면 왜 오류가 뜨는지 잘 모르겠습니다....
이전 강의에서 만들었던 AppConfig는 static클래스가 아닙니다.
그럼에도 AnnotationConfigApplicationContext()에 설정 정보로 넘겨줘도 실행하는데 지장은 없었습니다.
한 마디로 AppConfig도 객체를 따로 생성해서 넘긴 게 아니라 AppConfig.class로 넘겼습니다.
그러면 SameBeanConfig.class도 정상 작동해야하는 게 아닌가...합니다....
답변 1
1
안녕하세요, 인프런 AI 인턴입니다.
권정익님의 질문에 대한 답변으로, AnnotationConfigApplicationContext
사용 시 발생하는 UnsatisfiedDependencyException
오류와 왜 내부 클래스에 static
을 붙여야 하는지에 대하여 설명드리겠습니다.
먼저, Spring Framework
에서 AnnotationConfigApplicationContext
를 사용하여 애플리케이션 컨텍스트를 생성할 때, 이 컨텍스트는 주어진 클래스를 구성 정보로 사용합니다. 문제의 핵심은 정적 내부 클래스(static inner class)와 비정적 내부 클래스(non-static inner class) 사이의 차이에 있습니다.
정적 내부 클래스(static inner class)는 외부 클래스의 인스턴스 없이도 생성할 수 있으며, 이를 통해 독립적으로 존재할 수 있습니다. 따라서 AnnotationConfigApplicationContext
와 같은 스프링 컨텍스트는 이 클래스 타입을 인자로 받아서 쉽게 처리할 수 있습니다.
반면에, 비정적 내부 클래스(non-static inner class)는 외부 클래스의 인스턴스가 먼저 존재해야만 해당 내부 클래스의 인스턴스를 생성할 수 있습니다. 이는 스프링 컨텍스트가 단독으로 이러한 타입의 클래스를 설정 정보로 사용하기 어렵게 만듭니다. 즉, 스프링 컨테이너가 비정적 내부 클래스의 인스턴스를 생성하기 위해서는 반드시 외부 클래스의 인스턴스가 필요하다는 것을 의미합니다.
AppConfig
가 동작하는 이유는 그것이 최상위 레벨의 클래스(즉, 내부 클래스가 아닌)이기 때문입니다. 최상위 레벨의 클래스는 별도의 외부 클래스 인스턴스 없이도 인스턴스화될 수 있어, 스프링 컨테이너가 직접 관리할 수 있습니다.
질문하신 내용과 유사한 문제를 설명하는 기존 질문이 있어 링크를 드립니다. 이해에 도움이 될 것입니다:
- 스프링 핵심 원리 - 기본편에서의 이너 static class 관련 질문
이 내용은 SameBeanConfig
클래스를 static
으로 선언했을 때와 그렇지 않을 때 발생하는 차이와 관련하여 귀하의 질문에 답변해 줄 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.