Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Tags more
Archives
Today
Total
관리 메뉴

요리사에서 IT개발자로

스파르타 부트캠프 Spring Master 3강 같은 타입의 Bean이 2개일 경우 본문

Spring

스파르타 부트캠프 Spring Master 3강 같은 타입의 Bean이 2개일 경우

H.S-Backend 2024. 5. 24. 15:09

초기설정

Food Interface

public interface Food {
    void eat();
}

Chicken 

@Component
public class Pizza implements Food {
    @Override
    public void eat() {
        System.out.println("피자를 먹습니다.");
    }
}

Pizza

@Component
public class Pizza implements Food {
    @Override
    public void eat() {
        System.out.println("피자를 먹습니다.");
    }
}

테스트 코드

@SpringBootTest
public class BeanTest {

    @Autowired
    Food food;
    
}

출처 : 스파르타 코딩클럽

위와 같은 오류가 발생한다.

해석 : Food타입의 Bean객체 하나 이상있어서 그렇다. 결국 우선순위를 정해달라


@SpringBootTest
public class BeanTest {

    @Autowired
    Food pizza;

    @Autowired
    Food chicken;

}

등록된 이름을 정확하게 명시해주면 해결할 수 있다.

 

@Autowired는 기본적으로

Bean Type(Food)로 DI를 지원하며

 

연결이 되지 않을 경우 Bean Name(pizza, chicken)으로 찾는다.


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

Chicken 클래스에 @Primary 키를 추가하여 

 

Bean이 여러개가 있더라도

@Primary가 설정된 Bean객체를 우선 주입해준다.


@Component
@Qualifier("pizza")
public class Pizza implements Food {
    @Override
    public void eat() {
        System.out.println("피자를 먹습니다.");
    }
}
@SpringBootTest
public class BeanTest {

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

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

@Primary와 @Qualifier가 동시 적용되있다면

 

Qualifier의 우선순위가 더 높으며

반드시 @Qualifier("")를 선언해야한다.

 

Bean이 여러개 있을 경우

범용적으로 사용되는 Bean객체Primary

지엽적 사용되는 Bean객체에는 Qualifier

반응형