강의

멘토링

로드맵

Inflearn brand logo image

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

horizon님의 프로필 이미지
horizon

작성한 질문수

스프링 핵심 원리 - 기본편

탐색 위치와 기본 스캔 대상

@Configuration 를 왜 사용할까요?

해결된 질문

작성

·

66

0

@SpringBootApplication 이 루트 위치에 있고 이 애노테이션 설정안에

@ComponentScan이 있고 따라서

@Component 애노테이션이 붙은 클래스들을

스프링 컨테이너에 싱글톤 으로 빈 등록을 하고

@AutoWired로 의존관계를 주입해준다 라고 이해했습니다

 

@ComponentScan을 배우기 전에는

AppConfig에서 @Configuration 과 @Bean으로 클래스들을 수동으로 빈 등록을 하고 의존관계도 주입해줬죠. 그리고 이 과정에서 여러 객체가 발생하는 하여 싱글톤이 깨지는 것을

@Configuration 을 통해 CGLIB 라이브러리로 싱글톤을 보장해준다 라고 이해했습니다.

 

@SpringBootApplication -> @ComponentScan 으로 @Component 클래스들을

스프링이 싱글톤을 보장하면서 컨테이너에 빈으로 등록하는것의 대한 과정에 대한 구체적인 과정이 있나요?

(@Configuration 에선 CGLIB 라이브러리로 new가 여러개 있어도 싱글톤을 보장하는데.. 이런 구체적인 과정이 있는지?)

아니면 그냥 간단하게 저렇게 하면 싱글톤을 보장한다. 라고 이해하면 될까요?

 

그리고 @ComponentScan과 @Component로 클래스들을 사용함으로 AutoAppConfig는 아무런 코드 가 없었죠,

Configuration 과 Bean으로 수동 등록하고, 싱글톤이 깨져서, CGLIB 라이브러리를 사용했던것이 대체되었다는건데,

@Configuration 과 CGLIB 라이브러리를 왜 사용했던건지요?

 

그냥 @ComponentScan과 @Component로 클래스들을 사용하면 되잖아요.

답변 2

1

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. horizon님

AI 인턴이 잘 답변을 남겨주었는데요.

추가로 다음 링크를 보시면 도움이 되실거에요.

https://inf.run/oHfYM

감사합니다.

horizon님의 프로필 이미지
horizon
질문자

영한님 답변 감사합니다! 질문글을 작성했을 때는 이해가 안갔으나, 뒤에 강의들을 본 후로는 이해가 됐습니다.

1

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

스프링에서 @Configuration@ComponentScan의 사용 차이에 대해 명확하게 이해하시려는 것 같습니다. 질문에 대한 답변을 정리해 보겠습니다.

  1. @Configuration과 CGLIB:

    • @Configuration은 스프링 빈 설정 클래스임을 명시하며, 클래스 안에 정의된 @Bean 메서드들을 활용해 빈 객체를 생성합니다. 스프링은 이런 @Configuration 클래스를 CGLIB 라이브러리를 이용해 프록시 객체로 생성합니다. 이렇게 생성된 프록시 객체는 @Bean 메서드를 여러 번 호출하더라도 싱글톤을 유지하도록 보장합니다. 즉, 한 번 생성된 빈 객체를 반환하여 중복 생성을 방지합니다.
  2. @ComponentScan@Component:

    • @ComponentScan은 특정 패키지에서 @Component, @Service, @Repository, @Controller 어노테이션이 붙은 클래스를 스캔하여 자동으로 스프링 빈으로 등록합니다. 이 때 등록된 빈들도 싱글톤으로 관리됩니다.
    • @Component 클래스를 통한 빈 등록은 자동으로 이루어지지만, @Configuration과 같이 메서드 수준의 세부 설정이 가능하지는 않습니다.
  3. @Configuration을 사용할까요?:

    • @Configuration은 보다 정교한 빈 설정을 필요로 하는 경우 유용합니다. 복잡한 초기화 로직이 필요하거나, 특정 조건에 따라 다른 빈을 등록해야 하는 경우에 유리합니다.
    • 반면, @Component는 단순히 해당 클래스를 빈으로 등록할 때 용이합니다.
  4. @SpringBootApplication의 역할:

    • @SpringBootApplication@ComponentScan, @EnableAutoConfiguration, @Configuration을 조합한 어노테이션으로, 애플리케이션 실행과 동시에 모든 컴포넌트를 스캔하여 자동으로 빈을 등록하게 도와줍니다.

추가적으로, 스프링 부트는 자동 설정 기능을 제공하여 @Configuration을 통한 설정을 많이 줄여주었습니다. 그러나 수동으로 빈을 등록해야 하거나, 컴포넌트 스캔만으로는 해결하기 어려운 경우에는 여전히 @Configuration이 중요하게 사용됩니다.

관련 질문과 설명을 덧붙여 유사한 질문들을 참고하시면 도움이 될 것입니다:
- AutoAppConfig에서 @Configuration을 @Component로 해도 무관한가요?
- ComponentScan과 Configuration 어노테이션을 같이 사용하는 이유

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

horizon님의 프로필 이미지
horizon

작성한 질문수

질문하기