Home > Spring > πŸƒ[Spring] `@Qualifier` μ–΄λ…Έν…Œμ΄μ…˜.

πŸƒ[Spring] `@Qualifier` μ–΄λ…Έν…Œμ΄μ…˜.
Spring Framework

πŸƒ[Spring] @Qualifier μ–΄λ…Έν…Œμ΄μ…˜.

  • @Qualifier μ–΄λ…Έν…Œμ΄μ…˜μ€ Spring Frameworkμ—μ„œ 빈 μ£Όμž… μ‹œ λͺ¨ν˜Έμ„±μ„ ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ˜λŠ” μ–΄λ…Έν…Œμ΄μ…˜μž…λ‹ˆλ‹€.
  • Spring은 기본적으둜 νƒ€μž…μ„ κΈ°μ€€μœΌλ‘œ λΉˆμ„ μ£Όμž…ν•˜μ§€λ§Œ, λ™μΌν•œ νƒ€μž…μ˜ 빈이 μ—¬λŸ¬ 개 μ‘΄μž¬ν•  경우 μ–΄λŠ λΉˆμ„ μ£Όμž…ν• μ§€ λͺ¨ν˜Έμ„±μ΄ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ΄λ•Œ @Qualifier μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜μ—¬ νŠΉμ • λΉˆμ„ λͺ…μ‹œμ μœΌλ‘œ 지정할 수 μžˆμŠ΅λ‹ˆλ‹€.

1️⃣ @Qualifier의 μ£Όμš” κΈ°λŠ₯.

1. λͺ…μ‹œμ  빈 선택.

  • μ—¬λŸ¬ 개의 λ™μΌν•œ νƒ€μž…μ˜ 빈이 μ‘΄μž¬ν•  λ•Œ, @Qualifierλ₯Ό μ‚¬μš©ν•˜μ—¬ μ–΄λ–€ λΉˆμ„ μ£Όμž…ν• μ§€ λͺ…μ‹œμ μœΌλ‘œ 지정할 수 μžˆμŠ΅λ‹ˆλ‹€.
    • 이λ₯Ό 톡해 Spring이 μ£Όμž…ν•΄μ•Ό ν•  λΉˆμ„ λͺ…ν™•ν•˜κ²Œ ꡬ뢄할 수 μžˆμŠ΅λ‹ˆλ‹€.

2. 빈 이름 기반 μ£Όμž….

  • @QualifierλŠ” 빈의 이름을 κΈ°μ€€μœΌλ‘œ μ£Όμž…ν•  λΉˆμ„ μ„ νƒν•©λ‹ˆλ‹€.
    • @Autowired와 ν•¨κ»˜ μ‚¬μš©λ˜λ©°, 이λ₯Ό 톡해 Spring이 μ–΄λ–€ λΉˆμ„ μ£Όμž…ν• μ§€ κ²°μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

2️⃣ μ‚¬μš© μ˜ˆμ‹œ

1. λ™μΌν•œ νƒ€μž…μ˜ μ—¬λŸ¬ 빈이 μžˆμ„ λ•Œ.

@Component
public class FirstService implements MyService {
    // FirstService κ΅¬ν˜„
}

@Component
public class SecondService implements MyService {
    // SecondService κ΅¬ν˜„
}
  • μœ„ μ½”λ“œμ—μ„œ FirstService와 SecondServiceκ°€ λͺ¨λ‘ MyService νƒ€μž…μœΌλ‘œ μ •μ˜λœ λΉˆμž…λ‹ˆλ‹€.
    • 이 경우 MyService νƒ€μž…μ˜ λΉˆμ„ μ£Όμž…λ°›μœΌλ € ν•˜λ©΄ Spring이 μ–΄λŠ λΉˆμ„ μ£Όμž…ν•΄μ•Ό 할지 λͺ¨ν˜Έμ„±μ΄ λ°œμƒν•©λ‹ˆλ‹€.

2. @Qualifier둜 νŠΉμ • 빈 μ£Όμž…ν•˜κΈ°.

@Service
public class MyClient {
    
    private final MyService myService;
    
    @Autowired
    public MyClient(@Qualifier("secondService") MyService myService) {
        this.myService = myService;
    }
    
    public void execute() {
        myService.performAction();
    }
}
  • μ„€λͺ…
    • μœ„ μ½”λ“œμ—μ„œ @Qualifier("secondService")λŠ” SecondService λΉˆμ„ λͺ…μ‹œμ μœΌλ‘œ μ£Όμž…ν•˜λ„λ‘ μ§€μ •ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.
    • λ”°λΌμ„œ Spring은 SecondService λΉˆμ„ μ£Όμž…ν•˜κ²Œ λ©λ‹ˆλ‹€.
    • λ™μΌν•œ νƒ€μž…μ˜ μ—¬λŸ¬ 빈이 μžˆμ„ λ•Œ, 이와 같이 λͺ…μ‹œμ μœΌλ‘œ 선택할 수 μžˆμŠ΅λ‹ˆλ‹€.

3️⃣ μ‚¬μš© 상황.

  • λ™μΌν•œ νƒ€μž…μ˜ 빈이 μ—¬λŸ¬ 개 μžˆμ„ λ•Œ
    • QualifierλŠ” μ—¬λŸ¬ 개의 λ™μΌν•œ νƒ€μž…μ˜ 빈이 λ“±λ‘λ˜μ–΄ μžˆμ„ λ•Œ, μ–΄λŠ λΉˆμ„ μ£Όμž…ν•΄μ•Ό 할지 λͺ…ν™•νžˆ 지정해야 ν•˜λŠ” κ²½μš°μ— μ‚¬μš©λ©λ‹ˆλ‹€.
  • νŠΉμ • λΉˆμ„ μ£Όμž…ν•˜κ³  싢을 λ•Œ
    • 일반적인 μƒν™©μ—μ„œ κΈ°λ³Έ 빈이 μ•„λ‹Œ, νŠΉμ •ν•œ λΉˆμ„ μ£Όμž…ν•˜κ³ μž ν•  λ•Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

빈 이름 지정.

  • 빈 이름을 λͺ…μ‹œμ μœΌλ‘œ μ§€μ •ν•˜λ €λ©΄, @Component λ˜λŠ” @Bean μ–΄λ…Έν…Œμ΄μ…˜μ— 이름을 지정할 수 μžˆμŠ΅λ‹ˆλ‹€.
    ```java
    @Component(β€œfirstService”)
    public class FirstService implements MyService {
    // κ΅¬ν˜„ λ‚΄μš©
    }

@Component(β€œsecondService”)
public class SecondService implements MyService {
// κ΅¬ν˜„ λ‚΄μš©
}


- μ΄λ ‡κ²Œ 빈의 이름을 λͺ…μ‹œμ μœΌλ‘œ μ„€μ •ν•œ ν›„ `@Qualifier`둜 ν•΄λ‹Ή 이름을 μ§€μ •ν•˜μ—¬ μ£Όμž…ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

## 4️⃣ `@Qualifier`와 `@Primary`의 차이
- **`@Primary`** 
    - 기본적으둜 μ‚¬μš©λ  λΉˆμ„ μ§€μ •ν•©λ‹ˆλ‹€.
    - λ™μΌν•œ νƒ€μž…μ˜ μ—¬λŸ¬ 빈이 μ‘΄μž¬ν•  λ•Œ, `@Primary`κ°€ μ§€μ •λœ 빈이 μš°μ„ μ μœΌλ‘œ μ£Όμž…λ©λ‹ˆλ‹€.
    - λ‹€λ§Œ, λͺ…μ‹œμ μœΌλ‘œ `@Qualifier`κ°€ μ‚¬μš©λ˜λ©΄ `@Primary`λŠ” λ¬΄μ‹œλ©λ‹ˆλ‹€.
- **`@Qualifier`**
    - νŠΉμ • λΉˆμ„ λͺ…μ‹œμ μœΌλ‘œ μ£Όμž…ν•  λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.
    - `@Primary`κ°€ μ„€μ •λœ 빈이 μžˆλ”λΌλ„, `@Qualifier`둜 λͺ…μ‹œλœ 빈이 μš°μ„ λ©λ‹ˆλ‹€.

## 5️⃣ μ˜ˆμ‹œ: `@Primary`와 `@Qualifier` ν•¨κ»˜ μ‚¬μš©.
```java
@Component
@Primary
public class FirstService implements MyService {
    // FirstService κ΅¬ν˜„
}

@Component
public class SecondService implements MyService {
    // SecondService κ΅¬ν˜„
}
@Service
public class MyClient {
    
    private final MyService myService;
    
    @Autowired
    public MyClient(@Qualifier("secondService") MyService myService) {
        this.myService = myService;
    }
    
    public void execute() {
        myService.performAction();
    }
}
  • μ„€λͺ…
    • μ—¬κΈ°μ„œ FirstServiceλŠ” @Primary둜 κΈ°λ³Έ 빈으둜 μ„€μ •λ˜μ—ˆμ§€λ§Œ, @Qualifier("secondService")λ₯Ό μ‚¬μš©ν•΄ SecondService 빈이 λͺ…μ‹œμ μœΌλ‘œ μ£Όμž…λ©λ‹ˆλ‹€.
    • @PrimaryλŠ” κΈ°λ³Έ λΉˆμ„ μ„€μ •ν•  λ•Œ μœ μš©ν•˜κ³ , @QualifierλŠ” νŠΉμ • μƒν™©μ—μ„œ νŠΉμ • λΉˆμ„ μ£Όμž…ν•  λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.

6️⃣ κ²°λ‘ 

  • @Qualifier μ–΄λ…Έν…Œμ΄μ…˜μ€ Springμ—μ„œ λ™μΌν•œ νƒ€μž…μ˜ μ—¬λŸ¬ 빈 쀑 νŠΉμ • λΉˆμ„ λͺ…μ‹œμ μœΌλ‘œ μ£Όμž…ν•΄μ•Ό ν•  λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.
  • 이λ₯Ό 톡해 빈 μ£Όμž… κ³Όμ •μ—μ„œ λ°œμƒν•  수 μžˆλŠ” λͺ¨ν˜Έμ„±μ„ ν•΄κ²°ν•  수 있으며, κ°œλ°œμžκ°€ μ›ν•˜λŠ” λΉˆμ„ λͺ…ν™•νžˆ 지정할 수 μžˆμŠ΅λ‹ˆλ‹€.
  • @Primary와 ν•¨κ»˜ μ‚¬μš©ν•˜μ—¬ κΈ°λ³Έ 빈과 νŠΉμ • λΉˆμ„ 관리할 수 μžˆμŠ΅λ‹ˆλ‹€.