@Configuration 를 왜 사용할까요?
@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 인턴이 잘 답변을 남겨주었는데요.
추가로 다음 링크를 보시면 도움이 되실거에요.
감사합니다.
1
안녕하세요, 인프런 AI 인턴입니다. horizon님.
스프링에서 @Configuration과 @ComponentScan의 사용 차이에 대해 명확하게 이해하시려는 것 같습니다. 질문에 대한 답변을 정리해 보겠습니다.
@Configuration과 CGLIB:@Configuration은 스프링 빈 설정 클래스임을 명시하며, 클래스 안에 정의된@Bean메서드들을 활용해 빈 객체를 생성합니다. 스프링은 이런@Configuration클래스를 CGLIB 라이브러리를 이용해 프록시 객체로 생성합니다. 이렇게 생성된 프록시 객체는@Bean메서드를 여러 번 호출하더라도 싱글톤을 유지하도록 보장합니다. 즉, 한 번 생성된 빈 객체를 반환하여 중복 생성을 방지합니다.
@ComponentScan과@Component:@ComponentScan은 특정 패키지에서@Component,@Service,@Repository,@Controller어노테이션이 붙은 클래스를 스캔하여 자동으로 스프링 빈으로 등록합니다. 이 때 등록된 빈들도 싱글톤으로 관리됩니다.
@Component클래스를 통한 빈 등록은 자동으로 이루어지지만,@Configuration과 같이 메서드 수준의 세부 설정이 가능하지는 않습니다.
왜
@Configuration을 사용할까요?:@Configuration은 보다 정교한 빈 설정을 필요로 하는 경우 유용합니다. 복잡한 초기화 로직이 필요하거나, 특정 조건에 따라 다른 빈을 등록해야 하는 경우에 유리합니다.
- 반면,
@Component는 단순히 해당 클래스를 빈으로 등록할 때 용이합니다.
@SpringBootApplication의 역할:@SpringBootApplication은@ComponentScan,@EnableAutoConfiguration,@Configuration을 조합한 어노테이션으로, 애플리케이션 실행과 동시에 모든 컴포넌트를 스캔하여 자동으로 빈을 등록하게 도와줍니다.
추가적으로, 스프링 부트는 자동 설정 기능을 제공하여 @Configuration을 통한 설정을 많이 줄여주었습니다. 그러나 수동으로 빈을 등록해야 하거나, 컴포넌트 스캔만으로는 해결하기 어려운 경우에는 여전히 @Configuration이 중요하게 사용됩니다.
관련 질문과 설명을 덧붙여 유사한 질문들을 참고하시면 도움이 될 것입니다:
- AutoAppConfig에서 @Configuration을 @Component로 해도 무관한가요?
- ComponentScan과 Configuration 어노테이션을 같이 사용하는 이유
저는 horizon님을 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
구현체가 동적으로 정해질 때, 팩토리 기법을 사용하나요?
0
43
2
MemberService의 인터페이스를 왜 사용하는지 궁금합니다.
0
72
1
롬복 @Setter를 써야 하는 상황이 있는건가요?
0
87
1
빈 등록 메서드의 파라미터가 빈이 아니어도 되나요?
0
79
1
테스트 속도가 나중에 영향이 있을까요?
0
75
1
gradle 설정 안떠서 질문 남깁니다!
0
116
2
build.gradle로 프로젝트를 여는 이유
0
81
1
provider 사용하는 이유
0
82
1
다음 강의 뭘 들어야 할까요
0
123
2
프로토타입 빈, 직접 destroy 호출 안 할 경우
0
62
1
beanB
0
79
2
퀴즈다시풀기
0
63
1
Gradle로 바꿔도 오류가 똑같이 발생하네요 ㅠㅠ
0
90
2
"중복 등록과 충돌" 강의에서 강사님과 다른 에러가 발생합니다.
0
63
3
run 실행했는데 결과창이 이렇게 뜨네요 왜 그런건가요>
0
102
2
도메인의 정의?
0
57
1
ApplicationContext 질문입니다.
0
60
1
@Scope의 proxyMode를 사용할때 단위 테스트 방법
0
86
2
ai api 선정하기 관련 질문
0
115
2
생성자 자동주입 관련해서
0
60
1
생성자 직접 호출 vs 팩토리 메서드 패턴
0
91
2
Spring에서 SessionScope와 RequestScope는 함께 사용되나요?
1
62
1
12:25
0
74
2
appConfig.xml 오류
0
123
1





