빈(bean) 등록이란?
SpringBoot 에서 객체를 스프링컨테이너에 등록하여 관리하는 방식
1. @Bean - 수동등록방식
@Bean은 메서드에 붙이는 annotation이다. 일반적으로 @Configuragtion으로 선언된 설정 클래스 내부에 사용되며 메서드가 반환되는 객체를 스프링 빈으로 등록한다.
@Configuration
public class AppConfig {
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
이 방식은 다음과 같은 경우에 주로 사용된다.
- 외부 라이브러리를 사용할 때 → 우리가 직접 클래스에 @Component를 붙일 수 없기 때문에
- 객체 생성 로직이 복잡한 경우 → 생성자에 여러 파라미터가 필요하거나 커스터마이징된 설정이 필요한 경우
- 조건부 등록이 필요한 경우 → @Conditional, @Profile 등과 조합하여 유연하게 빈을 등록할 수 있음
쉽게 말해, 우리가 직접 객체 생성 과정을 세밀하게 제어하고 싶은 경우 @Bean을 사용하면 된다.
2. @Component - 자동 등록 방식
@Component는 클래스 위에 붙이는 애너테이션으로, Spring이 클래스 자체를 스캔하여 자동으로 빈으로 등록한다. 개발자가 만든 일반적인 비즈니스 로직 클래스에는 대부분 @Component가 붙는다.
@Component
public class EmailService {
public void sendMail(String to, String body) {
// 메일 전송 로직
}
}
@Component는 사실 3개의 자식 애너테이션을 가지고 있다. 각각 특정 역할을 의미한다.
- @Service : 비즈니스 로직을 수행하는 클래스
- @Repository : DAO 클래스, DB와의 직접적인 통신 담당
- @Controller : 클라이언트 요청을 처리하는 컨트롤러 클래스
이 애너테이션들은 기능적으로는 모두 @Component와 동일하지만, 역할을 명확히 구분하여 개발자와 스프링이 더 잘 협업할 수 있게 도와주는 역할을 한다.
3. @ComponentScan과의 관계
자동 등록이 가능한 이유는 바로 @ComponentScan 때문이다. 이 애너테이션은 지정된 패키지를 스캔하여 @Component 계열 애너테이션이 붙은 클래스를 자동으로 찾아서 빈으로 등록한다. 보통 @SpringBootApplication 안에 이미 포함되어 있어 별도로 선언하지 않아도 된다.
@SpringBootApplication // 내부적으로 @ComponentScan 포함
public class KoreaSleepTechApplication {
public static void main(String[] args) {
SpringApplication.run(KoreaSleepTechApplication.class, args);
}
}
4. @Autowired와의 연결
이렇게 등록된 빈을 어떻게 사용할 것인가가 중요하다. @Autowired 를 통해 다른 클래스에 자동으로 주입할 수 있다.
@Service
public class NotificationService {
private final EmailService emailService;
@Autowired
public NotificationService(EmailService emailService) {
this.emailService = emailService;
}
}
스프링은 EmailService가 빈으로 등록되어 있는지 확인하고, 자동으로 주입해준다. 이게 바로 DI(Dependency Injection) 즉, 의존성 주입의 핵심 개념이다.
'웹개발 > SpringBoot' 카테고리의 다른 글
| Rest API (1) | 2025.05.26 |
|---|---|
| Response/Request &Validation (0) | 2025.05.25 |
| Controller Mapping Annotation (0) | 2025.05.23 |
| Jpa Repository (0) | 2025.05.22 |
| ORM (Object-Relational Mapping) (4) | 2025.05.21 |