[SPRING] 같은 타입의 Bean 사용

야부엉·2023년 11월 8일
0

SPRING

목록 보기
4/45

1. 같은 타입의 Bean이 2개인 경우

1. 등록 예시

// Food Interface
public interface Food {
    void eat();
}

// chicken class
import org.springframework.stereotype.Component;

@Component
public class Chicken implements Food {
    @Override
    public void eat() {
        System.out.println("치킨을 먹습니다.");
    }
}

// Pizza class
import org.springframework.stereotype.Component;

@Component
public class Pizza implements Food {
    @Override
    public void eat() {
        System.out.println("피자를 먹습니다.");
    }
}
  • 인터페이스를 사용해 구현을 진행을 했습니다.
  • 등록에서는 문제가 없는 것을 볼 수 있다.

2. 사용 예시

  • 그냥 Food food로 선언시 위와 같이 오류 메세지가 뜬는 것을 볼 수 있는데, food에 등록되어있는 bean 객체가 하나 이상이기 때문에 어떤 bean을 등록해야할지 몰라 오류가 발생한것이다.해결 방법으로는 3가지가 있다.
  1. 등록된 @Bean 이름 명시
@SpringBootTest
public class BeanTest {

    @Autowired
    Food pizza;
    
    @Autowired
    Food chicken;
    
}
  • 위와 같이 bean으로 등록된 객체 이름으로 주입을 하면 사용이 가능해진다.
  • 즉, 기본적으로는 @Autowired는 해당 bean type으로 DI를 지원하며, 연결되지 않을 경우 bean name으로 찾는것을 볼 수 있다.
  1. @Primary
// chicken 클래스
@Component
@Primary
public class Chicken implements Food {
    @Override
    public void eat() {
        System.out.println("치킨을 먹습니다.");
    }
}
// BeanTest 클래스
@SpringBootTest
public class BeanTest {
    @Autowired
    Food food;
}
  • 같은 타입의 bean이 여러개 있더라도 @primary가 붙은것을 우선적으로 주입한다.
  1. @Qualifier
//pizza class
@Component
@Qualifier("pizza")
public class Pizza implements Food {
    @Override
    public void eat() {
        System.out.println("피자를 먹습니다.");
    }
}
// BeanTest class
@SpringBootTest
public class BeanTest {

    @Autowired
    @Qualifier("pizza")
    Food food;

    @Test
    @DisplayName("Primary 와 Qualifier 우선순위 확인")
    void test1() {
        // 현재 Chicken 은 Primary 가 적용된 상태
        // Pizza는 Qualifier 가 추가된 상태입니다.
        food.eat();
    }
}
  • 해당 bean 객체를 주입한다.

같은 타입의 bean 객체들에 @Primary와 @Qualifier가 동시에 적용될 경우

  • 우선순위 : Qualifer > Primary
    결론 : Qualifier같은 경우는 직접적으로 주입받고자 하는 위치에 추가해야한다. 같은 타입의 bean이 여러개 있을 때 범용적으로 사용되는 bean은 @Primary로 설정해서 사용하고, 지협적으로 사용되는 bean은 qualifier를 사용하자

출처

내일배움캠프 Spring Master

profile
밤낮없는개발자

0개의 댓글