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์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋ณธ ๋นˆ๊ณผ ํŠน์ • ๋นˆ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.