[프로그래밍 기록] Spring - Bean 수동 등록하는 방법

김엄지·2024년 3월 24일
0

Spring

목록 보기
17/21

Bean을 수동으로 등록하는 방법

@Component 사용

@ComponentScan에 의해 자동으로 스캔되어 해당 클래스를 Bean으로 등록 해준다.

  • 일반적으로 @Component를 사용하여 Bean을 자동으로 등록하는 것이 좋다.

    비즈니스 로직과 관련된 클래스들은 그 수가 많기 때문에 @Controller, @Service와 같은 애너테이션들을 사용해서 Bean으로 등록하고 관리하면 개발 생산성에 유리하다.

  • 기술적인 문제나 공통적인 관심사를 처리할 때 사용하는 객체들을 수동으로 등록하는 것이 좋다.

    비즈니스 로직 Bean 보다는 그 수가 적기 때문에 수동으로 등록하기 부담스럽지 않고, 수동등록된 Bean에서 문제가 발생했을 때 해당 위치를 파악하기 쉽다는 장점이 있다.

Bean을 수동으로 등록하는 방법

@Configuration
public class PasswordConfig {

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}
  • Bean으로 등록하고자하는 객체를 반환하는 메서드를 선언하고 @Bean을 설정
  • Bean을 등록하는 메서드가 속한 해당 클래스에 @Configuration을 설정
  • Spring 서버가 뜰 때 Spring IoC 컨테이너에 'Bean'으로 저장된다.
// 1. @Bean 설정된 메서드 호출
PasswordEncoder passwordEncoder = passwordConfig.passwordEncoder();

// 2. Spring IoC 컨테이너에 빈 (passwordEncoder) 저장
// passwordEncoder -> Spring IoC 컨테이너

같은 타입의 Bean이 2개라면?

1) 등록된 Bean 이름 명시하기

@SpringBootTest
public class BeanTest {

    @Autowired
    Food pizza;
    
    @Autowired
    Food chicken;
    
}
  • 등록된 Bean 이름 pizza, chicken을 정확하게 명시
  • @Autowired가 기본적으로는 Bean Type(Food)으로 DI를 지원하며 연결이 되지않을 경우 Bean Name(pizza, chicken)으로 찾는다.

2) @Primary 사용하기

  • Chicken 클래스에 @Primary 추가
@Component
@Primary
public class Chicken implements Food {
    @Override
    public void eat() {
        System.out.println("치킨을 먹습니다.");
    }
}
  • @Primary가 설정된 Bean 객체를 주입해준다.
@SpringBootTest
public class BeanTest {
    @Autowired
    Food food;
}

3) @Qualifier 사용하기

  • Pizza 클래스에 @Qualifier("pizza") 추가
@Component
@Qualifier("pizza")
public class Pizza implements Food {
    @Override
    public void eat() {
        System.out.println("피자를 먹습니다.");
    }
}
  • @Qualifier("pizza") 를 추가해주면 해당 Bean 객체가 주입된다.
@SpringBootTest
public class BeanTest {

    @Autowired
    @Qualifier("pizza")
    Food food;
}
  • 같은 타입의 Bean들에 Qualifier와 Primary가 동시에 적용되어있다면 Qualifier의 우선순위가 더 높다.
  • Qualifier는 적용하기 위해서 주입 받고자하는 곳에 해당 Qualifier를 반드시 추가해야한다.
  • 범용적으로 사용되는 Bean 객체에는 Primary를 설정
  • 지엽적으로 사용되는 Bean 객체에는 Qualifier를 사용
profile
나만의 무언가를 가진 프로그래머가 되자

0개의 댓글