@Component
public class MyComponent { }
@Component는 Spring이 해당 클래스를 Bean으로 등록하도록 지정하는 annotation입니다.
Spring Boot의 컴포넌트 스캔 대상 패키지에 포함되어 있다면 애플리케이션 시작 시 Bean으로 등록됩니다.
@Service, @Repository, @Controller
@Service
public class MemberService {
}
@Repository
public class MemberRepository {
}
@RestController
public class MemberController {
}
Spring에서는 역할에 따라 @Service, @Repository, @Controller와 같은 stereotype annotation을 제공합니다.
@Component 기반의 컴포넌트 스캔을 통해 Bean으로 등록됩니다.
@Configuration
public class AppConfig {
@Bean
public MyComponent myComponent() {
return new MyComponent();
}
}
@Bean은 메서드가 반환하는 객체를 Spring Bean으로 등록하는 annotation입니다.
일반적으로 @Configuration 클래스 내부에서 사용합니다.
직접 수정할 수 없는 외부 라이브러리의 객체를 등록할 때 특히 유용합니다.
@Configuration
@ComponentScan("com.example")
public class AppConfig { }
@ComponentScan은 지정된 패키지를 탐색하여 @Component, @Service, @Repository, @Controller 등이 붙은 클래스를 Bean으로 등록하도록 합니다.
일반적인 Spring Boot 프로젝트에서는 별도로 @ComponentScan을 선언하지 않아도 애플리케이션 클래스의 패키지를 기준으로 컴포넌트 스캔이 이루어집니다.
@Component
public class MyComponent {
}
////////////////////////////////////////
@Configuration
@Import(MyComponent.class)
public class AppConfig {
}
@Import는 특정 설정 클래스나 컴포넌트를 Spring 컨테이너에 등록할 때 사용하는 annotation입니다.
public class MyImportSelector implements ImportSelector {
@Override
public String[] selectImports( AnnotationMetadata importingClassMetadata ) {
return new String[] { "com.example.MyComponent" };
}
}
ImportSelector는 조건이나 설정에 따라 Import할 클래스를 동적으로 선택할 수 있습니다.
public class MyRegistrar
implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(
AnnotationMetadata metadata,
BeanDefinitionRegistry registry) {
}
}
ImportBeanDefinitionRegistrar는 BeanDefinition을 직접 등록할 수 있는 확장 기능입니다.
BeanDefinition은 Spring 컨테이너가 Bean을 생성하고 관리하기 위해 사용하는 메타데이터입니다.
이 기능은 Spring Boot 자동 설정이나 프레임워크 수준의 기능을 구현할 때 활용할 수 있습니다.
| 등록 방법 | 적합한 상황 | 장점 | 단점 |
|---|---|---|---|
@Component | 직접 작성한 일반 컴포넌트 | 간결하고 직관적 | 스캔 범위에 의존 |
@Service 등 | 역할이 명확한 애플리케이션 계층 | 의미가 명확함 | 외부 클래스에는 적용 어려움 |
@Bean | 외부 라이브러리, 커스텀 객체 생성 | 생성 과정 제어 가능 | 설정 코드 필요 |
@ComponentScan | 패키지 단위 자동 등록 | 반복 작업 감소 | 스캔 범위 관리 필요 |
@Import | 특정 설정 또는 컴포넌트 명시적 등록 | 명시적이고 모듈화 가능 | Import 구조 복잡 가능 |
ImportSelector | 동적 설정 선택 | 조건부 등록 가능 | 구현 난도 높음 |
ImportBeanDefinitionRegistrar | 프레임워크 수준 BeanDefinition 등록 | 고급 확장 가능 | 유지보수 난도 높음 |