인프런 커뮤니티 질문&답변

권정익님의 프로필 이미지

작성한 질문수

스프링 핵심 원리 - 기본편

섹션 4

해결된 질문

작성

·

97

·

수정됨

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으로 선언했을 때와 그렇지 않을 때 발생하는 차이와 관련하여 귀하의 질문에 답변해 줄 것입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.