Dependency Injection


Dependency Injection, DI ๋Š” ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์œผ๋กœ Spring ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์ œ๊ณตํ•˜๋Š” IoC ์˜ ํ˜•ํƒœ์ด๋‹ค. ํด๋ž˜์Šค ์‚ฌ์ด์˜ ์˜์กด๊ด€๊ณ„๋ฅผ ๋นˆ ์„ค์ • ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ž๋™์œผ๋กœ ์—ฐ๊ฒฐํ•ด์ค€๋‹ค.

DI ๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๋ฉด ๋ชจ๋“ˆ ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋‚ฎ์•„์ง€๊ณ  ์œ ์—ฐ์„ฑ์ด ๋†’์•„์ง€๋Š” ์žฅ์ ์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์Šคํ”„๋ง์—์„  ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ ApplicationContext ๋ฅผ ํ†ตํ•ด ์„ค์ • ์ •๋ณด๋ฅผ ์ƒ์„ฑ ๋ฐ ๋“ฑ๋กํ•˜๊ณ  ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ์ž ํ˜น์€ setter ๋ฅผ ํ†ตํ•ด ์ฃผ์ž…ํ•œ๋‹ค.

DI ์ข…๋ฅ˜


์ƒ์„ฑ์ž ์ฃผ์ž…

@Service
public class Service {
 
    private final Repository repository;
 
    public Service(Repository repository) {
        this.repository = repository;
    }
}

์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ์˜์กด ๊ด€๊ณ„๋ฅผ ๋ชจ๋‘ ์ฃผ์ž…ํ•ด์•ผ ๊ฐ์ฒด ์ƒ์„ฑ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— NPE ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜์กด ๊ด€๊ณ„๊ฐ€ ๋งŽ์•„์งˆ ๊ฒฝ์šฐ ์ƒ์„ฑ์ž๊ฐ€ ๊ธธ์–ด์ ธ SRP ์›์น™์„ ์ƒ๊ธฐ์‹œ์ผœ์ฃผ๊ธฐ๋„ ํ•œ๋‹ค.

์ถ”๊ฐ€์ ์ธ ์„ค์ •์ด ํ•„์š”ํ•˜์ง€ ์•Š๊ณ  ๋œปํ•˜์ง€ ์•Š๊ฒŒ ์˜์กด์„ฑ๊ณผ ์„ค์ •๊ฐ’์„ ๋น ๋œจ๋ฆฌ๋Š” ์ผ์ด ์—†์œผ๋ฉฐ, ํ…Œ์ŠคํŠธํ•˜๊ธฐ์—๋„ ์šฉ์ดํ•˜๊ธฐ์— ๊ฐ€์žฅ ๊ถŒ์žฅ๋˜๋Š” ์ฃผ์ž… ๋ฐฉ์‹์ด๋‹ค.

ํŠน์ง•

  • ์ƒ์„ฑ์ž ํ˜ธ์ถœ์‹œ์ ์— ๋”ฑ 1๋ฒˆ๋งŒ ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์ด ๋ณด์žฅ๋จ
  • ๋ถˆ๋ณ€, ํ•„์ˆ˜ ์˜์กด๊ด€๊ณ„์— ์‚ฌ์šฉ
  • ์ƒ์„ฑ์ž๊ฐ€ 1๊ฐœ๋งŒ ์žˆ์œผ๋ฉด @Autowired ์ƒ๋žต ๊ฐ€๋Šฅ

Setter ์ฃผ์ž…

@Service
public class Service {
 
    private Repository repository;
 
    public void setRepository(Repository repository) {
        this.repository = repository;
    }
}

setter ๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•œ๋‹ค. ์„ ํƒ์ ์œผ๋กœ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ์˜์กด์„ฑ์„ ์ฃผ์ž… ๋ฐ›์ง€ ์•Š๊ณ ๋„ ๊ฐ์ฒด ์ƒ์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋•Œ๋ฌธ์— NPE ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค.

ํŠน์ง•

  • ์„ ํƒ, ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ์˜์กด๊ด€๊ณ„์—์„œ ์‚ฌ์šฉ
  • Java Bean Property ๊ทœ์•ฝ์˜ ์ˆ˜์ •์ž ๋ฉ”์„œ๋“œ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•
  • @Autowired ์˜ ๊ธฐ๋ณธ ๋™์ž‘์€ ์ฃผ์ž…ํ•  ๋Œ€์ƒ์ด ์—†์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ฃผ์ž…ํ•  ๋Œ€์ƒ์ด ์—†์–ด๋„ ๋™์ž‘ํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด @Autowired(required = false) ๋กœ ์ง€์ •ํ•˜๋ฉด ๋œ๋‹ค.

ํ•„๋“œ ์ฃผ์ž…

@Service
public class Service {
 
    @Autowired
    private Repository repository;
}

@Autowired ์• ๋„ˆํ…Œ์ด์…˜์„ ํ†ตํ•ด ์˜์กด์„ฑ ์ฃผ์ž…ํ•œ๋‹ค. ์˜์กด์„ฑ ์ฃผ์ž…์ด ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์— SRP ์›์น™์„ ์œ„๋ฐฐํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค. ์‚ฌ์šฉํ•˜๊ธฐ ํŽธ๋ฆฌํ•œ ๋งŒํผ ๋‹จ์ ๋„ ๋งŽ์€ ๋ฐฉ์‹์ด๋‹ค.

DI ํ”„๋ ˆ์ž„์›Œํฌ ์—†์ด๋Š” ์ž‘๋™ํ•˜๊ธฐ ํž˜๋“ค๋ฉฐ, ์™ธ๋ถ€์—์„œ ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ…Œ์ŠคํŠธํ•˜๊ธฐ ํž˜๋“ค๋‹ค.

์ฃผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๊ด€๊ณ„์—†๋Š” ํ…Œ์ŠคํŠธ์ฝ”๋“œ๋‚˜ @Configuration ๊ณผ ๊ฐ™์€ ์Šคํ”„๋ง ์„ค์ • ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

ํŠน์ง•

  • ์™ธ๋ถ€์—์„œ ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ˆœ์ˆ˜ํ•œ ์ž๋ฐ” ์ฝ”๋“œ๋กœ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์–ด๋ ค์›€
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹ค์ œ ์ฝ”๋“œ์™€ ๊ด€๊ณ„ ์—†๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์— ์‚ฌ์šฉ
  • ์Šคํ”„๋ง ์„ค์ •์„ ๋ชฉ์ ์œผ๋กœ ํ•˜๋Š” @Configuration ๊ฐ™์€ ๊ณณ์—์„œ ํŠน๋ณ„ํ•œ ์šฉ๋„๋กœ ์‚ฌ์šฉ

์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ ์ฃผ์ž…

  • ์ผ๋ฐ˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ฃผ์ž…ํ•˜๋Š” ๋ฐฉ๋ฒ•
  • ํŠน์ง•
    • ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ํ•„๋“œ๋ฅผ ์ฃผ์ž…๋ฐ›์„ ์ˆ˜ ์žˆ์Œ
    • ์ผ๋ฐ˜์ ์œผ๋กœ ์ž˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ

์˜ต์…˜ ์ฒ˜๋ฆฌ


์ฃผ์ž…ํ•  ์Šคํ”„๋ง ๋นˆ์ด ์—†์–ด๋„ ๋™์ž‘ํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ @Autowired ๋งŒ ์‚ฌ์šฉํ•˜๋ฉด required = true ๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์— ์ž๋™ ์ฃผ์ž… ๋Œ€์ƒ์ด ์—†์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ์ž๋™ ์ฃผ์ž… ๋Œ€์ƒ์„ ์˜ต์…˜์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • @Autowired(required=false)
    • ์ž๋™ ์ฃผ์ž… ๋Œ€์ƒ์ด ์—†์œผ๋ฉด ์ˆ˜์ •์ž ๋ฉ”์„œ๋“œ ์ž์ฒด๊ฐ€ ํ˜ธ์ถœ ์•ˆ๋จ
  • @Nullable
    • ์ž๋™ ์ฃผ์ž… ๋Œ€์ƒ์ด ์—†์œผ๋ฉด null ์ด ์ž…๋ ฅ๋จ
  • Optional<>
    • ์ž๋™ ์ฃผ์ž… ๋Œ€์ƒ์ด ์—†์œผ๋ฉด Optional.empty ๊ฐ€ ์ž…๋ ฅ๋จ

์ƒ์„ฑ์ž ์ฃผ์ž…์„ ์„ ํƒํ•ด๋ผ!


๊ณผ๊ฑฐ์—๋Š” ์ˆ˜์ •์ž ์ฃผ์ž…๊ณผ ํ•„๋“œ ์ฃผ์ž…์„ ๋งŽ์ด ์‚ฌ์šฉํ–ˆ์ง€๋งŒ, ์ตœ๊ทผ์—๋Š” ์Šคํ”„๋ง์„ ํฌํ•จํ•œ DI ํ”„๋ ˆ์ž„์›Œํฌ ๋Œ€๋ถ€๋ถ„์ด ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ๊ถŒ์žฅํ•œ๋‹ค. ๊ทธ ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

๋ถˆ๋ณ€

  • ๋Œ€๋ถ€๋ถ„์˜ ์˜์กด๊ด€๊ณ„ ์ฃผ์ž…์€ ํ•œ ๋ฒˆ ์ผ์–ด๋‚˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ข…๋ฃŒ๋  ๋•Œ ๊นŒ์ง€ ์˜์กด๊ด€๊ณ„๋ฅผ ๋ณ€๊ฒฝํ•  ์ผ์ด ์—†๋‹ค. ์˜คํžˆ๋ ค ๋Œ€๋ถ€๋ถ„์˜ ์˜์กด๊ด€๊ณ„๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ข…๋ฃŒ ์ „๊นŒ์ง€ ๋ณ€ํ•˜๋ฉด ์•ˆ๋œ๋‹ค.
  • ์ˆ˜์ •์ž ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด setter ๋ฅผ public ์œผ๋กœ ์—ด์–ด๋‘์–ด์•ผ ํ•œ๋‹ค.
  • ๋ˆ„๊ตฐ๊ฐ€ ์‹ค์ˆ˜๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ๋„ ์žˆ๊ณ , ๋ณ€๊ฒฝํ•˜๋ฉด ์•ˆ๋˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์—ด์–ด๋‘๋Š” ๊ฒƒ์€ ์ข‹์€ ์„ค๊ณ„๊ฐ€ ์•„๋‹ˆ๋‹ค.
  • ์ƒ์„ฑ์ž ์ฃผ์ž…์€ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๋”ฑ 1๋ฒˆ๋งŒ ํ˜ธ์ถœ๋˜๋ฏ€๋กœ ์ดํ›„์— ํ˜ธ์ถœ๋˜๋Š” ์ผ์ด ์—†๋‹ค. ๋”ฐ๋ผ์„œ ๋ถˆ๋ณ€ํ•˜๊ฒŒ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ˆ„๋ฝ

  • ์ˆ˜์ •์ž ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ์Šคํ”„๋ง์˜ @Autowired ์—†์ด ์ˆœ์ˆ˜ํ•œ ์ž๋ฐ” ์ฝ”๋“œ์—์„œ ์˜์กด๊ด€๊ณ„๋ฅผ ๋ˆ„๋ฝํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์ƒ๊ธด๋‹ค.
  • ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํŒŒ์ผ ์˜ค๋ฅ˜๋กœ ๋ฏธ๋ฆฌ ์žก์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

final ํ‚ค์›Œ๋“œ

  • ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜๋ฉด final ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ฐ’์ด ์„ค์ •๋˜์ง€ ์•Š๋Š” ์˜ค๋ฅ˜๋ฅผ ์ปดํŒŒ์ผ ์‹œ์ ์— ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹ค๋ฅธ ์ฃผ์ž… ๋ฐฉ์‹์€ ๋ชจ๋‘ ์ƒ์„ฑ์ž ์ดํ›„์— ํ˜ธ์ถœ๋˜๊ธฐ ๋•Œ๋ฌธ์— final ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

์ •๋ฆฌ

  • ์ƒ์„ฑ์ž ์ฃผ์ž… ๋ฐฉ์‹์„ ์„ ํƒํ•˜๋Š” ์ด์œ ๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€๊ฐ€ ์žˆ์ง€๋งŒ, ํ”„๋ ˆ์ž„์›Œํฌ์— ์˜์กดํ•˜์ง€ ์•Š๊ณ , ์ˆœ์ˆ˜ํ•œ ์ž๋ฐ” ์–ธ์–ด์˜ ํŠน์ง•์„ ์ž˜ ์‚ด๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์ด๊ธฐ๋„ ํ•˜๋‹ค.
  • ๊ธฐ๋ณธ์œผ๋กœ ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜๊ณ , ํ•„์ˆ˜ ๊ฐ’์ด ์•„๋‹Œ ๊ฒฝ์šฐ์—๋Š” ์ˆ˜์ •์ž ์ฃผ์ž… ๋ฐฉ์‹์„ ์˜ต์…˜์œผ๋กœ ๋ถ€์—ฌํ•˜๋ฉด ๋œ๋‹ค. ์ƒ์„ฑ์ž ์ฃผ์ž…๊ณผ ์ˆ˜์ •์ž ์ฃผ์ž…์„ ๋™์‹œ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋กฌ๋ณต๊ณผ ์ตœ์‹  ํŠธ๋ Œ๋“œ


๋ง‰์ƒ ๊ฐœ๋ฐœ์„ ํ•ด๋ณด๋ฉด, ๋Œ€๋ถ€๋ถ„์ด ๋‹ค ๋ถˆ๋ณ€์ด๊ณ , ๊ทธ๋ž˜์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ƒ์„ฑ์ž์— final ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ƒ์„ฑ์ž๋„ ๋งŒ๋“ค์–ด์•ผ ํ•˜๊ณ , ์ฃผ์ž… ๋ฐ›์€ ๊ฐ’์„ ๋Œ€์ž…ํ•˜๋Š” ์ฝ”๋“œ๋„ ๋งŒ๋“ค์–ด์•ผ ํ•˜๊ณ โ€ฆ ํ•„๋“œ ์ฃผ์ž…์ฒ˜๋Ÿผ ์ข€ ํŽธ๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์—†์„๊นŒ?

  • ๋กฌ๋ณต ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์ œ๊ณตํ•˜๋Š” @RequiredArgsConstructor ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด final ์ด ๋ถ™์€ ํ•„๋“œ๋ฅผ ๋ชจ์•„์„œ ์ƒ์„ฑ์ž๋ฅผ ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์ค€๋‹ค.
  • ๋กฌ๋ณต์ด ์ž๋ฐ”์˜ ์• ๋…ธํ…Œ์ด์…˜ ํ”„๋กœ์„ธ์„œ๋ผ๋Š” ๊ธฐ๋Šฅ์„ ์ด์šฉํ•ด์„œ ์ปดํŒŒ์ผ ์‹œ์ ์— ์ƒ์„ฑ์ž ์ฝ”๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•ด์ค€๋‹ค. ์‹ค์ œ class ๋ฅผ ์—ด์–ด๋ณด๋ฉด ๋‹ค์Œ ์ฝ”๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ตœ๊ทผ์—๋Š” DI ๋ฅผ ํ•  ๋•Œ ์ƒ์„ฑ์ž๋ฅผ ๋”ฑ 1๊ฐœ ๋‘๊ณ , @Autowired ๋ฅผ ์ƒ๋žตํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฃผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ์—ฌ๊ธฐ์— Lombok ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ @RequiredArgsConstructor ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๊ธฐ๋Šฅ์€ ๋‹ค ์ œ๊ณตํ•˜๋ฉด์„œ, ์ฝ”๋“œ๋Š” ๊น”๋”ํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋กฌ๋ณต ์ ์šฉ

plugins {
    id 'org.springframework.boot' version '2.7.1'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}
group = 'hello'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
// lombok
configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}
// lombok
repositories {
    mavenCentral()
}
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter'
    // lombok
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    testCompileOnly 'org.projectlombok:lombok'
    testAnnotationProcessor 'org.projectlombok:lombok'
    // lombok
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
tasks.named('test') {
    useJUnitPlatform()
}
  1. Preferences โ†’ plugin โ†’ lombok ์„ค์น˜ ํ›„ ์žฌ์‹œ์ž‘
  2. Preferences โ†’ Annotation Processors ๊ฒ€์ƒ‰ โ†’ Enable annotation processing ์ฒดํฌ

์กฐํšŒ ๋นˆ์ด 2๊ฐœ ์ด์ƒ - ๋ฌธ์ œ


@Autowired ๋Š” ํƒ€์ž…์œผ๋กœ ๋นˆ์„ ํƒ์ƒ‰ 2๊ฐœ์ผ ๊ฒฝ์šฐ ๋ฌธ์ œ ๋ฐœ์ƒ

@Autowired ํ•„๋“œ ๋ช…, @Qualifer, @Primary


์กฐํšŒ ๋Œ€์ƒ ๋นˆ์ด 2๊ฐœ ์ด์ƒ์ผ ๋•Œ

  • @Autowired ํ•„๋“œ๋ช… ๋งค์นญ
  • @Qualifier โ†’ @Qualifier ๋ผ๋ฆฌ ๋งค์นญ โ†’ ๋นˆ ์ด๋ฆ„ ๋งค์นญ
  • @Primary ์‚ฌ์šฉ

์–ด๋…ธํ…Œ์ด์…˜ ์ง์ ‘ ๋งŒ๋“ค๊ธฐ


@Target({ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
@Qualifier("mainDiscountPolicy")
public @interface MainDiscountPolicy {
}
  • ์• ๋…ธํ…Œ์ด์…˜์—๋Š” ์ƒ์†์ด๋ผ๋Š” ๊ฐœ๋…์ด ์—†์Œ
  • ์—ฌ๋Ÿฌ ์• ๋…ธํ…Œ์ด์…˜์„ ๋ชจ์•„์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ์€ ์Šคํ”„๋ง์ด ์ง€์›ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ

์กฐํšŒํ•œ ๋นˆ์ด ๋ชจ๋‘ ํ•„์š”ํ•  ๋•Œ, List, Map


์ž๋™, ์ˆ˜๋™์˜ ์˜ฌ๋ฐ”๋ฅธ ์‹ค๋ฌด ์šด์˜ ๊ธฐ์ค€