์กฐํ ๋์์ ๋น์ด 2๊ฐ ์ด์์ผ ๋ ํด๊ฒฐ๋ฐฉ๋ฒ์ด 3๊ฐ์ง๊ฐ ์๋ค.
- @Autowired ํ๋ ๋ช ๋งค์นญ
- @Qualifier
- @Primary
[ @Autowired ํ๋ ๋ช ๋งค์นญ ]
@Autowired๋ ์ฒ์์ ํ์ ๋งค์นญ์ ์์ํ๋ค. ํ ํ์ ์ ์ฌ๋ฌ ๋น์ด ์กด์ฌํ ๊ฒฝ์ฐ์๋ ์ถฉ๋์ด ์ผ์ด๋์ ์๋ฌ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค. ์ด๋๋ ํ๋ ๋ช ์ ๋ณ๊ฒฝํ๋ฉด ๋๋ค.
@Autowired
private DiscountPolicy discountPolicy // DiscountPolicy ์ rateDiscountPolicy์ fixDiscountPolicy๊ฐ ์กด์ฌํจ
์ด๋ฐ ์ฝ๋์์ ์ ํํ ํ๋๋ช ์ผ๋ก ์ง์ ํด์ค์ผ ํ๋ค.
@Autowired
private DiscountPolicy rateDiscountPolicy
์ด๋ ๊ฒ ์ฃผ์ ํด์ฃผ๋ฉด rateDiscountPolicy๋ก ์์กด๊ด๊ณ ์ฃผ์ ์ด ๋๋ค.
[ @Qualifier ]
@Qualifier๋ ์ถ๊ฐ ๊ตฌ๋ถ์๋ฅผ ๋ถ์ฌ์ฃผ๋ ๋ฐฉ์์ด๋ค.
์ฃผ์ ์ ์ถ๊ฐ์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ ๊ฒ์ด์ง ๋น ์ด๋ฆ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ ์๋๋ค.
- @Qualifier๋ผ๋ฆฌ ๋งค์นญ
- ๋น ์ด๋ฆ ๋งค์นญ
- ์์ผ๋ฉด NoSuchBeanDefinitionException ๋ฐ์์ํจ๋ค.
@Component
@Qualifier("mainPolicy")
public class ExamplePolicy implements Policy{}
@Component
@Qualifier("secondPolicy")
public class ExamplePolicy2 implements Policy{}
์ด๋ฐ์์ผ๋ก @Qualifier๋ฅผ ์ง์ ํด์ฃผ๊ณ ์์ฑ์์์ ๋งค์นญ์์ผ์ฃผ๋ฉด ๋๋ค.
@Autowired
public Service(@Qualifier("mainPolicy") Policy policy){
this.policy = policy;}
@Qualifier๋ @Qualifier๋ฅผ ์ฐพ๋ ์ฉ๋๋ก๋ง ์ฌ์ฉํ๋๊ฒ ๋ช ํํ๋ค๊ณ ํ๋ค.
[ @Primary ]
@Primary๋ ์ฐ์ ์์๋ฅผ ์ ํ๋ ๋ฐฉ๋ฒ์ด๋ค. @Autowired์ ๋น์ด ์ฌ๋ฌ๊ฐ ๋งค์นญ๋๋ฉด @Primary๊ฐ ์ฐ์ ๊ถ์ ๊ฐ์ง๋ค.
@Component
@Primary //examplePolicy๊ฐ ์ฐ์ ๊ถ์ ๊ฐ์ง๋๋ก ํ๋ค.
public class ExamplePolicy implements Policy{}
@Component
public class ExamplePolicy2 implements Policy{}
์ด๋ ๊ฒ examplePolicy๋ฅผ ์ฐ์ ์์๋ก ๋๊ณ ์์กด๊ด๊ณ๋ฅผ ์ฃผ์ ํ๊ฒ ๋๋ฉด,
@Autowired
public Service(Policy policy){
this.policy = policy;
}
์๋์ ์ผ๋ก @Primary ์ ๋ ธํ ์ด์ ์ด ๋ถ์ examplePolicy๊ฐ ์ฃผ์ ๋๋ค.
@Primary์ @Qualifier๊ฐ ๊ฐ์ด ์กด์ฌํ๊ฒ ๋๋ค๋ฉด @Qualifier๊ฐ ์ฐ์ ์์๊ฐ ๋๋ค.
์คํ๋ง์์๋ ์๋๋ณด๋ค ์๋, ๋์ ๋ฒ์๋ณด๋ค๋ ์ข์ ๋ฒ์์ ์ ํ๊ถ์ด ์ฐ์ ์์๊ฐ ๋ ๋๊ธฐ ๋๋ฌธ์ด๋ค.
๋ฐ๋ผ์ @Primary๋ฅผ ์ฌ์ฉํ๋, ๊ตฌ์ฒด์ ์ ๊ฒ์ ์ง์ ํ๊ณ ์ถ๋ค๋ฉด @Qualifier๋ฅผ ์ฌ์ฉํ๋ค.
@Qualifier๋ฅผ ์ฌ์ฉํ๋ฉด ์ปดํ์ผํ ๋ ํ์ ์ฒดํฌ๊ฐ ๋ถ๊ฐ๋ฅํ๋ค.
๋ง์ฝ @Qualifier("mainPolicy") ๋ฅผ ์์ฑํ๊ณ , ์์ฑ์์ ๋ฃ์ด์ค๋ @Qualifier("mainnPolicy")๋ฅผ ์์ฑํ๋ค๊ณ ํด์ ์ปดํ์ผ์์ ์ค๋ฅ๊ฐ ๋์ง ์๋๋ค. ์ด๋ ๊ฒ ๋๋ฉด ์ ๋๋ก ๋ ๋น์ ์ฐพ์ง ๋ชปํ๊ณ ๊ฒฐ๊ตญ ์ค๋ฅ๊ฐ ๋๊ฒ ๋๋ค!
๊ทธ๋ผ ์ฐพ์ ์ ์๋ ์ค๋ฅ๊ฐ ์๊ธฐ๊ฒ ๋๋๋ฐ ์ด๋ด ๊ฒฝ์ฐ์๋ ์ง์ ์ ๋ ธํ ์ด์ ์ ๋ง๋๋ ๊ฒ๋ ๋ฐฉ๋ฒ์ด ๋๋ค.
[ ์ง์ ์ ๋ ธํ ์ด์ ์์ฑ ]
import org.springframework.beans.factory.annotation.Qualifier;
import java.lang.annotation.*;
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Qualifier("mainPolicy")
public @interface MainPolicy {}
์ด๋ ๊ฒ ์์ฑํด์ฃผ๊ณ ๋น์ผ๋ก ๋ฑ๋กํด์ค์ผ ํ๋ ๊ณณ์ MainPolicy์ ๋ ธํ ์ด์ ์ ๋ถ์ด๋ฉด ๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ์๋ชป ์์ฑํ์๋ ์ปดํ์ผ ์ค๋ฅ๊ฐ ๋์ ๋ฐ๋ก๋ฐ๋ก ์์ ํ ์ ์๋ค.
@Component
@MainPolicy
public class ExamplePolicy implements Policy{}
์ด ๊ธ์ ์ธํ๋ฐ ๊น์ํ ๊ฐ์ฌ๋์ ์คํ๋ง ํต์ฌ์๋ฆฌ-๊ธฐ๋ณธํธ์ ๋ณด๊ณ ์ ๋ฆฌํ ๊ฒ์ ๋๋ค.
'Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Spring ์๋ธ๋ฆฟ [HttpServletRequest/HttpServletResponse] (0) | 2021.08.01 |
---|---|
Spring ํต์ฌ์๋ฆฌ-๊ธฐ๋ณธ[ ๋น ์๋ช ์ฃผ๊ธฐ ์ฝ๋ฐฑ] (0) | 2021.07.17 |
Spring ํต์ฌ์๋ฆฌ-๊ธฐ๋ณธ [์ปดํฌ๋ํธ ์ค์บ] (0) | 2021.07.12 |
Spring ๊ธฐ๋ณธ [ ์ฑ๊ธํค/์คํ๋ง์ปจํ ์ด๋] (0) | 2021.07.11 |
Spring ๊ธฐ๋ณธ [์คํ๋ง๋น ์กฐํ] (0) | 2021.07.09 |