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

11 1님의 프로필 이미지
11 1

작성한 질문수

스프링 핵심 원리 - 기본편

스프링 빈 조회 - 상속 관계

static inner class 관련 과거 질문 글을 보고 추가적으로 질문드립니다.

해결된 질문

작성

·

209

0

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)

[질문 내용]

https://www.inflearn.com/questions/257297/testconfig-%ED%81%B4%EB%9E%98%EC%8A%A4%EC%97%90%EC%84%9C-static%EC%9D%84-%EB%96%BC%EB%B2%84%EB%A6%AC%EB%A9%B4

 

이 질문 글의 답변을 보고 저도 궁금한 점이 있습니다. 아마 이 질문과 관련된 코드는 아래 코드인 것 같습니다.

 

public class ApplicationContextExtendsFindTest {
    AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class);

.
.
.
(생략)
.
.
.
    @Configuration
    static class TestConfig {

        @Bean
        public DiscountPolicy rateDiscountPolicy() {
            return new RateDiscountPolicy();
        }

        @Bean
        public DiscountPolicy FixDiscountPolicy() {
            return new FixDiscountPolicy();
        }
    }
}

 

답변 내용 중에 다음과 같은 내용이 있습니다.

 

"Test 클래스 내 TestConfig 클래스에 static 키워드를 뺀다면 Test 클래스가 생성되어야 TestConfig를 사용할 수 있습니다. 그러나 Test 클래스 내에서는 이미 TestConfig가 생성되기도 전에 스프링 컨테이너에서 TestConfig 빈이 있는지 찾아오려고 합니다. 당연히 스프링에서는 그런 빈이 없다고 합니다."

 

여기서 스프링 컨테이너에서 TestConfig 빈이 있는지 찾아오려고 한다는 부분이 잘 이해가 안 됩니다.

 

AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(TestConfig.class);

 

이 코드는 TestConfig를 빈으로 등록하는 거로 알고 있습니다. 그러면 TestConfig 빈이 있는지 찾는 거랑은 다르지 않나요?

답변 2

1

안녕하세요. 11 1님, 공식 서포터즈 David입니다.

그러나 Test 클래스 내에서는 이미 TestConfig가 생성되기도 전에 스프링 컨테이너에서 TestConfig 빈이 있는지 찾아오려고 합니다. 당연히 스프링에서는 그런 빈이 없다고 합니다.

이 부분의 의도는 컨테이너가 TestConfig 빈을 생성하려고 할 때 컨테이너 내부적으로 외부클래스인 Test 클래스의 생성이 필요함을 말하고 싶었습니다. 잘못 적어두어 혼란을 드려 죄송합니다.

감사합니다.

11 1님의 프로필 이미지
11 1
질문자

이제 이해가 되었습니다. 답변 감사합니다!

0

안녕하세요, 인프런 AI 인턴입니다.

님의 궁금증은 “왜 TestConfig 클래스에 static이 붙어야 하며, static이 없을 경우 왜 스프링 컨테이너에서 TestConfig 빈을 찾는 데 문제가 있는지”에 대한 것으로 보입니다. 이와 관련하여 제공된 링크 TestConfig 클래스에서 static을 떼버리면…에서의 답변을 바탕으로 더 세세한 해명을 도와드리겠습니다.

TestConfig 클래스를 스프링 컨테이너에 등록할 때 사용하는 AnnotationConfigApplicationContext(TestConfig.class); 코드에 대한 님의 이해는 올바릅니다. 이 코드는 명시적으로 TestConfig 클래스를 스프링 컨테이너에 빈(bean)으로 등록하는 역할을 합니다.

그러나, TestConfig 클래스에 static 키워드가 없는 경우, 이 클래스는 외부 클래스(여기서는 ApplicationContextExtendsFindTest 클래스)의 인스턴스에 종속적인 내부 클래스가 됩니다. 즉, TestConfig 인스턴스를 생성하기 위해서는 ApplicationContextExtendsFindTest의 인스턴스가 먼저 존재해야 한다는 의미입니다. 이러한 종속성 때문에, 스프링 컨테이너에서는 단순히 TestConfig.class를 인자로 받아 해당 클래스를 빈으로 등록하려 할 때, 외부 클래스의 인스턴스 없이는 TestConfig 클래스의 인스턴스를 생성할 수 없게 되므로 문제가 발생합니다.

static을 사용함으로써 TestConfig 클래스는 ApplicationContextExtendsFindTest 클래스와 독립적으로 존재할 수 있게 됩니다. 따라서 스프링 컨테이너는 TestConfig 클래스의 인스턴스를 생성하고 빈으로 등록하는 데 필요한 외부 인스턴스 없이 TestConfig 클래스에 직접 접근할 수 있습니다.

따라서, “스프링 컨테이너에서 TestConfig 빈이 있는지 찾아오려고 한다”는 표현은 TestConfig를 빈으로 등록하려는 행위 자체를 말하며, static이 없을 경우 이 과정에서 문제가 발생한다는 것을 의미합니다.

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

11 1님의 프로필 이미지
11 1

작성한 질문수

질문하기