- @Component를 사용하면 @ComponentScan에 의해 자동으로 스캔되어 해당 클래스를 Bean으로 등록 해줍니다.
- 일반적으로 @Component를 사용하여 Bean을 자동으로 등록하는 것이 좋습니다.
- 프로젝트의 규모가 커질 수록 등록할 Bean들이 많아지기 때문에 자동등록을 사용하면 편리합니다.
- 비즈니스 로직과 관련된 클래스들은 그 수가 많기 때문에 @Controller, @Service와 같은 애너테이션들을 사용해서 Bean으로 등록하고 관리하면 개발 생산성에 유리합니다.
그렇다면 Bean 수동 등록은 언제 사용될까요?
- 기술적인 문제나 공통적인 관심사를 처리할 때 사용하는 객체들을 수동으로 등록하는 것이 좋습니다.
- 공통 로그 처리와 같은 비즈니스 로직을 지원하기 위한 부가적이고 공통적인 기능들을 기술 지원 Bean이라 부르고 수동 등록 합니다.
- 비즈니스 로직 Bean 보다는 그 수가 적기 때문에 수동으로 등록하기 부담스럽지 않습니다.
- 또한 수동 등록된 Bean에서 문제가 발생했을 때 해당 위치를 파악하기 쉽다는 장점이 있습니다.
Bean을 수동으로 등록하는 방법
@Configuration
public class PasswordConfig {
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
// 1. @Bean 설정된 메서드 호출
// PasswordEncoder passwordEncoder = passwordConfig.passwordEncoder();
// 2. Spring IoC 컨테이너에 빈(passwordEncoder) 저장
- 클래스 자체를 즉 객체를 빈으로 등록하고자 할 때는 클래스 위에 @Component을 설정합니다.
- Bean으로 등록하고자하는 객체를 메서드로 반환하여 Bean으로 설정할 때는 해당 메서드에 @Bean을 설정합니다.
- 이때 Bean을 등록하는 메서드가 속한 해당 클래스에 @Component을 설정해야 합니다.
- Spring 서버가 뜰 때 Spring IoC 컨테이너에 'Bean'으로 저장됩니다.
@Component
public @interface Configuration{
//...
}
같은 이름의 Bean이 두 개라면 오류가 발생합니다. 하지만 @Qualifier, @Primary과 같은 에노테이션으로 우선순위를 정할 수 있습니다.
@SpringBootTest
public class BeanTest {
@Autowired // Bean 의 타입으로 찾고, 없으면 이름으로 찾는다. (인터페이스 Food의 구현체가 둘) 같은 타입이 둘 있으니까 오류가 난다.
@Qualifier("pizza") // @Qualifier("pizza") 가 붙은 클래스를 찾아 빈 객체에 넣음
Food food;
@Autowired
Food pizza;
@Autowired
Food chicken;
@Test
@DisplayName("테스트")
void test1() {
pizza.eat();
chicken.eat();
food.eat(); // @Qualifier 와 @Primary 우선 순위 비교 -> 피자를 먹습니다
// Spring에선 일반적으로 좁은 범위(@Qualifier)가 넓은 범위(@Primary)보다 우선 순위가 높음
}
}
public interface Food {
void eat();
}
@Component
@Primary
public class Chicken implements Food {
@Override
public void eat() {
System.out.println("치킨을 먹습니다.");
}
}
@Component
@Qualifier("pizza")
public class Pizza implements Food {
@Override
public void eat() {
System.out.println("피자를 먹습니다.");
}
}
'Spring > 팀스파르타' 카테고리의 다른 글
26. 쿠키와 세션이란 무엇일까? (0) | 2024.11.13 |
---|---|
25. 인증과 인가란 무엇일까? (1) | 2024.11.12 |
23. Query Methods란 무엇일까? (1) | 2024.11.08 |
22. JPA Auditing (3) | 2024.11.07 |
21. Spring Data JPA란 무엇일까? (0) | 2024.11.06 |