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

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

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

@Primary μ–΄λ…Έν…Œμ΄μ…˜μ€ Spring Frameworkμ—μ„œ 빈의 μš°μ„  μˆœμœ„λ₯Ό 지정할 λ•Œ μ‚¬μš©ν•˜λŠ” μ–΄λ…Έν…Œμ΄μ…˜μž…λ‹ˆλ‹€.

λ§Œμ•½ μ—¬λŸ¬ 개의 빈이 λ™μΌν•œ νƒ€μž…μœΌλ‘œ λ“±λ‘λ˜μ–΄ μžˆμ„ λ•Œ, μ–΄λ–€ λΉˆμ„ μ£Όμž…ν• μ§€ λͺ…μ‹œμ μœΌλ‘œ μ§€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ Spring은 μžλ™μœΌλ‘œ @Primaryκ°€ 뢙은 λΉˆμ„ μš°μ„ μ μœΌλ‘œ μ£Όμž…ν•˜κ²Œ λ©λ‹ˆλ‹€.

이λ₯Ό 톡해 λ‹€μˆ˜μ˜ κ΅¬ν˜„μ²΄κ°€ μžˆμ„ 경우 기본적으둜 μ‚¬μš©λ  λΉˆμ„ μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

1️⃣ @Primary의 λ™μž‘ 방식.

  • Spring 은 같은 νƒ€μž…μ˜ 빈이 μ—¬λŸ¬ 개 μ‘΄μž¬ν•  λ•Œ μ˜μ‘΄μ„± μ£Όμž… μ‹œ μ–΄λŠ λΉˆμ„ μ‚¬μš©ν• μ§€ κ²°μ •ν•΄μ•Ό ν•©λ‹ˆλ‹€.
  • 기본적으둜 νƒ€μž…μ— λ§žλŠ” λΉˆμ„ μžλ™μœΌλ‘œ μ£Όμž…ν•˜λ € ν•˜μ§€λ§Œ, 같은 νƒ€μž…μ˜ 빈이 두 개 이상 λ“±λ‘λ˜μ–΄ μžˆλ‹€λ©΄ λͺ¨ν˜Έμ„±μ΄ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ΄λ•Œ @Primaryλ₯Ό μ‚¬μš©ν•˜λ©΄ ν•΄λ‹Ή λΉˆμ„ 기본적으둜 μ£Όμž…ν•  빈으둜 μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ˜ˆμ‹œ

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

@Component
@Primary
public class SecondService implements MyService {
    // SecondService κ΅¬ν˜„
}
  • μœ„ μ˜ˆμ‹œμ—μ„œ FirstService와 SecondServiceκ°€ λͺ¨λ‘ MyService νƒ€μž…μ˜ 빈으둜 λ“±λ‘λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.
  • SecondServiceμ—λŠ” @Primary μ–΄λ…Έν…Œμ΄μ…˜μ΄ λΆ™μ–΄ μžˆμœΌλ―€λ‘œ, MyService νƒ€μž…μ˜ 빈이 ν•„μš”ν•  λ•Œ Spring은 μžλ™μœΌλ‘œ SecondServiceλ₯Ό μ£Όμž…ν•˜κ²Œ λ©λ‹ˆλ‹€.
@Service
public class MyClient {
    private final MyService myService;
    
    @Autowired
    public MyClient(MyService myService) {
        this.myService = myService;
    }
    
    // MyClientλŠ” SecondService λΉˆμ„ μ£Όμž…λ°›κ²Œ λ©λ‹ˆλ‹€.
}

2️⃣ @Primary 와 @Qualifier의 차이.

  • @PriamryλŠ” κΈ°λ³Έ λΉˆμ„ 지정할 λ•Œ μ‚¬μš©λ˜μ§€λ§Œ, 더 ꡬ체적인 λΉˆμ„ μ£Όμž…ν•΄μ•Ό ν•  λ•ŒλŠ” @Qualifier μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • @QualifierλŠ” νŠΉμ • 이름을 가진 λΉˆμ„ λͺ…μ‹œμ μœΌλ‘œ μ§€μ •ν•˜μ—¬ μ£Όμž…ν•  수 μžˆλ„λ‘ λ„μ™€μ€λ‹ˆλ‹€.

@Qualifier μ˜ˆμ‹œ

@Component
@Qualifier("firstService")
public class FirstService implement MyService {
    // FirstService κ΅¬ν˜„
}

@Component
@Qualifier("secondService")
@Primary
public class SecondService implement MyService {
    // SecondService κ΅¬ν˜„
}
@Service
public class MyClient {
    
    private final MyService myService;
    
    @Autowired
    public MyClient(@Qualifier("firstService") MyService myService) {
        this.myService = myService;
    }
    
    // MyClientλŠ” FirstService λΉˆμ„ μ£Όμž…λ°›κ²Œ λ©λ‹ˆλ‹€.
}
  • 이 경우, @Primary κ°€ SecondService에 μ§€μ •λ˜μ–΄ μžˆμ–΄λ„ @Qualifier("firstService")κ°€ μ§€μ •λœ κ²½μš°μ—λŠ” FirstServiceκ°€ μ£Όμž…λ©λ‹ˆλ‹€.

3️⃣ κ²°λ‘ .

  • @PrimaryλŠ” λ™μΌν•œ νƒ€μž…μ˜ 빈이 μ—¬λŸ¬ 개 λ“±λ‘λœ 경우, 기본적으둜 μ‚¬μš©λ  λΉˆμ„ μ§€μ •ν•˜λŠ” μ–΄λ…Έν…Œμ΄μ…˜μž…λ‹ˆλ‹€.
  • 이 μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜λ©΄ 같은 νƒ€μž…μ˜ 빈이 μ—¬λŸ¬ 개 μžˆμ„ λ•Œ, λͺ…μ‹œμ μœΌλ‘œ μ§€μ •ν•˜μ§€ μ•ŠμœΌλ©΄ Spring은 @Primaryκ°€ 뢙은 λΉˆμ„ μš°μ„ μ μœΌλ‘œ 선택해 μ£Όμž…ν•©λ‹ˆλ‹€.
  • 보닀 ꡬ체적으둜 μ–΄λ–€ λΉˆμ„ μ£Όμž…ν• μ§€ λͺ…μ‹œν•  ν•„μš”ν•˜ μžˆμ„ λ•ŒλŠ” @Qualifierλ₯Ό ν•¨κ»˜ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.