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

nahyeon.lee님의 프로필 이미지

작성한 질문수

스프링 핵심 원리 - 기본편

@Configuration과 new AnnotationConfigApplicationContext()의 기능

작성

·

246

·

수정됨

0

스프링으로 전환하면서 AppConfig.class에 @Configuration을 붙이고 테스트에서 AnnotatoinConficApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class)를 해주는데요. 두 가지 각각의 기능이 무엇인지 궁금합니다.

후자의 경우 ApplicationContext가 스프링 컨테이너가 되고 그 위로 AppConfig.class파일을 올려주는 것 같은데.. @Configuration은 싱글톤 보장을 위해 붙이는 것인지..

물론 스프링부트를 사용할 때는 뒤의 스프링컨테이너생성코드를 따로 적어주지 않으니까 더 헷갈려서요.

@ComponentScan의 경우 스프링컨테이너가 훑을 범위를 지정해주는게 맞는건가요? @Configuration에도 @Component가 되어있어서 @ComponentScan의 대상이 되는거구요..

뭔가 수업을 따라갈때는 물흐르듯 이해가 되는데 개념을 확실히 잡으려고 하면 잘 안 되네요ㅠㅠ

답변 2

0

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

  1. new AnnotationConfigApplicationContext(AppConfig.class)

    이 코드를 한 문장으로 설명하기엔 내부적으로 하는 일이 엄청 많습니다. 쉽게 요약하면 스프링 컨테이너를 생성하고 이와 관련된 작업들을 수행합니다.

  2. @Configuration의 역할은 다음 링크를 참고해 주세요.

    https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/annotation/Configuration.html

Indicates that a class declares one or more @Bean methods and may be processed by the Spring container to generate bean definitions and service requests for those beans at runtime

  1. @ComponentScan은 컴포넌트 스캔을 수행하기 위해 선언되어져야 하는 애노테이션입니다. 해당 애노테이션의 옵션으로 컴포넌트 스캔 범위도 지정할 수 있습니다.

     

아울러, 강의를 들을 때 이해되시지만 혼자서 정리해 볼 때 이해가 잘 안되신다면 강의 내용을 그대로 받아적은 다음에 그 내용을 곱씹으며 직접 정리해 보시는 것도 추천드립니다:)

감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다. nahyeon.lee님의 질문에 대해 안내드립니다.

먼저, @Configuration과 new AnnotationConfigApplicationContext()의 기능과 관련하여 궁금증을 해결할 수 있는 자료가 있어 제공해 드립니다.

@Configuration 어노테이션 지정하는 이유“에서는 @Configuration 어노테이션을 지정하는 이유에 대해 설명하고 있습니다. 이 어노테이션은 클래스에 붙여 해당 클래스가 하나 이상의 @Bean 메소드를 제공하고, 스프링 컨테이너가 Bean 정의를 생성할 때 이를 고려해야 함을 나타냅니다. 또한, @Configuration을 사용하면 @Bean으로 정의된 객체의 싱글톤이 보장되는데, 이는 스프링이 CGLIB를 통해 @Configuration이 붙은 클래스의 바이트코드를 조작하여 @Bean으로 등록된 객체들이 싱글톤으로 유지되도록 하는 메커니즘 때문입니다.

@Configuration과 @ComponentScan 같이 사용“에서는 @Configuration@ComponentScan을 같이 사용하는 경우에 대한 질문에 답변하고 있습니다. 이 글에서는 @Configuration의 목적과 @ComponentScan이 스캔하는 범위 지정 방법에 대해 설명하며, @Configuration이 @ComponentScan의 대상이 되는 이유도 함께 설명합니다.

@ComponentScan에 의해 @Configuration이 붙은 클래스 스캔“에서는 @ComponentScan에 의해서 @Configuration이 붙은 클래스를 스캔했을 때의 동작 방식에 대해 설명하고 있습니다. 이 글은 @ComponentScan과 @Configuration의 상호작용에 대해 좀 더 깊이 이해하는 데 도움이 될 것입니다.

new AnnotationConfigApplicationContext()은 스프링 컨테이너를 생성하고, 인자로 전달된 클래스를 기반으로 스프링 빈들을 등록하는 역할을 합니다. 이 과정에서 @Configuration이 붙은 클래스 내부의 @Bean 어노테이션이 붙은 메소드를 호출하여 반환된 객체들을 스프링 컨테이너에 빈으로 등록합니다. 스프링부트를 사용할 경우에는 이러한 과정이 자동으로 이루어지므로 별도로 컨테이너 생성 코드를 작성할 필요가 없습니다.

”@ComponentScan의 경우 스프링컨테이너가 훑을 범위를 지정해주는게 맞는건가요?“라는 궁금증에 대해서는, 예, 맞습니다. @ComponentScan은 스프링이 컴포넌트들(@Component, @Service, @Repository, @Controller 등)을 자동으로 찾아 스프링 빈으로 등록하게 하는 범위를 지정합니다.

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

nahyeon.lee님의 프로필 이미지
nahyeon.lee
질문자

각각의 기능에 대해 좀 더 명확하게 알고 싶어요. 스프링 컨테이너를 생성하는 것은 new AnnotationConfigApplicationContext(AppConfig.class)이고, 이걸 통해 스프링 빈 등록이 가능해지는거고, 그럼 그때 @Configuration의 기능은 싱글톤 보장, @ComponentScan의 기능은 @Component 스캔 범위 지정 이렇게만 되는 것인지.... 근데 이건 아닐 것 같아서요.