1. @CompoentScan + @Component
스프링이 정해진 패키지를 스캔하며 @Component 어노테이션이 붙은 클래스를 찾아 자동으로 Bean으로 등록하는 방식입니다.
1-1. 작동 방식
@SpringBootApplication 어노테이션 안에 포함된 @ComponentScan이 실행되면서, 해당 패키지 하위의 모든 @Component 계열(@Service, @Repository, @Controller 등) 클래스를 찾아 Bean인스턴스를 생성합니다.
이 때 @ComponentScan이 @Component를 찾는 패키지의 기준은 @SpringBootApplication가 붙어있는 메인 클래스가 있는 패키지가 기준이된다.
1-2.주요 사용처
우리가 직접 작성하는 대부분의 비즈니스 로직 클래스(Service, Controller 등)에 사용합니다.
1-3. 장단점
장점 (효율성)
- 어노테이션 하나만 붙이면 되므로 생산성이 매우 높습니다.
- 새로운 클래스를 만들 때마다 설정 파일을 수정할 필요가 없습니다.
단점 (제어권)
- 외부 라이브러리(수정 불가능한 소스 코드)에는 어노테이션을 붙일 수 없어 사용이 불가능합니다.
- 클래스 내부 로직에 따라 빈 생성 과정을 세밀하게 제어하기 어렵습니다.
2. @Configuration + @Bean
설정(Configuration) 클래스를 따로 만들고, 메서드 위에 @Bean을 붙여 직접 객체를 반환하여 등록하는 방식입니다.
2-1. 작동 방식
@Configuration이 붙은 클래스 내의 메서드에 @Bean을 선언하면, 스프링 컨테이너가 해당 메서드를 호출하여 반환된 객체를 Bean으로 관리합니다.
싱글톤 보장을 위해 CGLIB(Code Generation Library) 기술을 사용하여 프록시 객체를 생성합니다.
2-2. 주요 사용처
- 외부 라이브러리: RestTemplate, ObjectMapper 등 내가 고칠 수 없는 클래스를 빈으로 만들 때.
- 조건부 빈 등록: 상황에 따라 다른 객체를 빈으로 등록해야 할 때.
2-3. 장단점
장점 (객관적 타당성):
- 빈 생성 로직(객체 생성 및 초기화 과정)을 완전히 제어할 수 있습니다.
- 설정 정보가 한곳에 모여 있어 전체적인 빈 구성 현황을 파악하기 좋습니다.
단점 (유지보수 비용):
- 새로운 빈을 추가할 때마다 설정 클래스를 매번 수정해야 하므로 번거롭습니다.
- 관리 포인트가 늘어납니다.
3. 차이
| 비교 항목 | @Component 스캔 | @Configuration + @Bean |
| 등록 주체 | 스프링 (자동) | 개발자 (수동) |
| 적용 대상 | 직접 작성한 클래스 | 외부 라이브러리, 공통 설정 |
| 설정 위치 | 해당 클래스 상단 | 별도의 @Configuration 클래스 |
| 추천 상황 | 일반적인 계층별 개발 시 | 외부 연동 및 정밀 제어 필요 시 |
'Java' 카테고리의 다른 글
| [Java] @Controller 와 @RestController (0) | 2025.12.26 |
|---|---|
| [Java] AOP (0) | 2025.12.24 |
| [Java] 웹 서버와 WAS (0) | 2025.12.19 |
| [Java] CORS와 CSRF의 차이 (0) | 2025.12.14 |
| [Java] String, StringBuffer, StringBuilder (0) | 2025.12.12 |