Spring/팀스파르타

24. Bean을 수동으로 등록하기

열심히 해 2024. 11. 10. 13:16
  • @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) 저장

 

  1. 클래스 자체를 즉 객체를 빈으로 등록하고자 할 때는 클래스 위에 @Component을 설정합니다.
  2. Bean으로 등록하고자하는 객체를 메서드로 반환하여 Bean으로 설정할 때는 해당 메서드에 @Bean을 설정합니다.
  3. 이때 Bean을 등록하는 메서드가 속한 해당 클래스에 @Component을 설정해야 합니다.
  4. 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