๐[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
์ ํจ๊ป ์ฌ์ฉํ์ฌ ๊ธฐ๋ณธ ๋น๊ณผ ํน์ ๋น์ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.