@Component 🏷️
@Component는 클래스 레벨에 사용하는 어노테이션
주요 특징 ✨
- 자동 스캔: Spring이 컴포넌트 스캔을 통해 자동으로 빈으로 등록
- 클래스 단위: 클래스 자체를 Spring 컨테이너에 등록
- 타입 기반: 해당 클래스 타입의 빈을 생성
- 하위 어노테이션: @Controller, @Service, @Repository는 모두 @Component의 특수한 형태
@Component
public class UserService {
// 클래스 내용
}
작동 방식 ⚙️
- <context:component-scan> 설정이나 @ComponentScan 어노테이션을 통해 스캔 범위 지정
- Spring이 해당 범위 내의 @Component 클래스들을 찾아 자동으로 빈 등록
- 기본적으로 클래스명의 첫 글자를 소문자로 바꾼 이름을 빈 이름으로 사용 (userService)
@Bean 🌱
@Bean은 메소드 레벨에 사용하는 어노테이션
주요 특징 ✨
- 수동 등록: 개발자가 직접 빈 생성 로직을 작성합니다.
- 메소드 단위: 메소드가 반환하는 객체를 Spring 컨테이너에 등록합니다.
- 구성 기반: @Configuration 클래스 내에서 주로 사용됩니다.
- 세밀한 제어: 객체 생성과 설정을 세밀하게 제어할 수 있습니다.
@Configuration
public class AppConfig {
@Bean
public UserService userService() {
return new UserService(userRepository());
}
@Bean
public UserRepository userRepository() {
return new JpaUserRepository();
}
}
작동 방식 ⚙️
- @Configuration 클래스가 로드될 때 @Bean 메소드들이 실행됨
- 메소드가 반환하는 객체가 Spring 컨테이너에 등록됨
- 기본적으로 메소드명이 빈 이름이 됨 (userService)
주요 차이점 🔄
| 특성 | @Component | @Bean |
| 적용 대상 | 클래스 | 메소드 |
| 등록 방식 | 자동(컴포넌트 스캔) | 수동(명시적 선언) |
| 제어 수준 | 제한적 | 세밀함 |
| 주요 용도 | 직접 작성한 클래스 | 서드파티 라이브러리 클ㄹ래스 |
| 의존성 주입 | 자동 (@Autowired) | 명시적 (메소드 내에서) |
언제 무엇을 사용? 🤔
@Component 사용 상황 👍
- 직접 개발한 클래스를 빈으로 등록할 때
- 간단하게 빈을 등록하고 싶을 때
- 표준 스프링 스테레오타입을 사용하고 싶을 때 (@Service, @Repository 등)
@Bean 사용 상황 👍
- 서드파티 라이브러리 클래스를 빈으로 등록할 때 (직접 수정 불가)
- 조건부 빈 생성이 필요할 때 (if-else 로직)
- 빈 생성 과정에서 복잡한 로직이 필요할 때
- 동일한 타입의 여러 빈을 다른 설정으로 등록할 때
@Configuration 🔧
@Configuration은 스프링의 설정 클래스를 지정하는 어노테이션
주요 특징 ✨
- 빈 설정 전용 클래스: 스프링 IoC 컨테이너에게 "이 클래스는 빈 설정 정보를 포함하고 있어요"라고 알려줍니다.
- @Bean 메소드의 컨테이너: 주로 @Bean 어노테이션이 붙은 메소드들을 포함합니다.
- XML 설정의 대체재: 기존 XML 기반 설정을 자바 코드로 대체합니다.
- CGLIB 프록시: 스프링은 @Configuration 클래스를 CGLIB로 프록시화하여 특별하게 처리합니다.
@Configuration
public class AppConfig {
@Bean
public DataSource dataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("org.h2.Driver");
dataSource.setUrl("jdbc:h2:mem:testdb");
dataSource.setUsername("sa");
dataSource.setPassword("");
return dataSource;
}
@Bean
public JdbcTemplate jdbcTemplate() {
// 같은 클래스 내의 다른 @Bean 메소드 호출 - 싱글톤 보장!
return new JdbcTemplate(dataSource());
}
}
작동 방식 ⚙️
- 스프링이 @Configuration 클래스를 발견하면 CGLIB를 사용해 해당 클래스의 프록시를 생성
- 이 프록시는 @Bean 메소드가 여러 번 호출되더라도 항상 같은 인스턴스를 반환하도록 보장
- 이를 통해 스프링 빈의 싱글톤 특성을 유지
@Configuration vs @Component 🤔
| @Configuration | @Component |
| 주로 빈 설정 목적 | 일반 스프링 빈 등록 목적 |
| CGLIB 프록시 생성 | 일반 클래스로 등록 |
| @Bean 메소드 싱글톤 보장 | @Bean 사용 가능하나 싱글톤 보장 안됨 |
| 설정 정보 집중화 | 비즈니스 로직 구현 |
'Back-End' 카테고리의 다른 글
| [DDD] 도메인 주도 설계 애그리거트 (0) | 2025.05.22 |
|---|---|
| [Spring] Mybatis (1) | 2025.05.08 |
| [Spring] AOP (1) | 2025.04.23 |
| [Spring] 빈 생명주기 (1) | 2025.04.22 |
| [Spring] 내용 정리 (1) | 2025.04.21 |