public @interface Autowired - 201211211yj/Spring-Boot-Start GitHub Wiki

public @interface Autowired


Autowired Constructors
์ง€์ •๋œ Bean ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž ์ค‘ ํ•˜๋‚˜๋งŒ required () ์†์„ฑ์„ true๋กœ ์„ค์ •ํ•˜์—ฌ ์ด ์ฃผ์„์„ ์„ ์–ธ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด๋Š” Spring Bean์œผ๋กœ ์‚ฌ์šฉ๋  ๋•Œ Autowiring๋˜๋„๋ก ์ƒ์„ฑ์ž๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๋˜ํ•œ required ์†์„ฑ์ด true๋กœ ์„ค์ •๋˜๋ฉด ๋‹จ์ผ ์ƒ์„ฑ์ž์—๋งŒ @Autowired๋กœ ์ฃผ์„์ด ๋‹ฌ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„์š”ํ•˜์ง€ ์•Š์€ ์—ฌ๋Ÿฌ ์ƒ์„ฑ์ž๊ฐ€ ์ฃผ์„์„ ์„ ์–ธํ•˜๋ฉด Autowire์˜ ํ›„๋ณด๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. Spring ์ปจํ…Œ์ด๋„ˆ์—์„œ Bean์„ ์ผ์น˜์‹œ์ผœ ์ถฉ์กฑ์‹œํ‚ฌ ์ˆ˜์žˆ๋Š” ๊ฐ€์žฅ ๋งŽ์€ ์ข…์†์„ฑ์„ ๊ฐ€์ง„ ์ƒ์„ฑ์ž๊ฐ€ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค. **๋งŒ์กฑํ•  ์ˆ˜์žˆ๋Š” ํ›„๋ณด๊ฐ€ ์—†์œผ๋ฉด ๊ธฐ๋ณธ / ๊ธฐ๋ณธ ์ƒ์„ฑ์ž (์žˆ๋Š” ๊ฒฝ์šฐ)**๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํด๋ž˜์Šค๊ฐ€ ์—ฌ๋Ÿฌ ์ƒ์„ฑ์ž๋ฅผ ์„ ์–ธํ•˜์ง€๋งŒ @Autowired๋กœ ์ฃผ์„์ด์—†๋Š” ๊ฒฝ์šฐ ๊ธฐ๋ณธ / ๊ธฐ๋ณธ ์ƒ์„ฑ์ž (์žˆ๋Š” ๊ฒฝ์šฐ)๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ํด๋ž˜์Šค๊ฐ€ ๋‹จ์ผ ์ƒ์„ฑ์ž๋ฅผ ์‹œ์ž‘์œผ๋กœ ์„ ์–ธํ•˜๋Š” ๊ฒฝ์šฐ ์ฃผ์„์„ ๋‹ฌ์ง€ ์•Š์•„๋„ ํ•ญ์ƒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ฃผ์„์ด ๋‹ฌ๋ฆฐ ์ƒ์„ฑ์ž๋Š” public์ผ ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.


Autowired Fields
๊ตฌ์„ฑ ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๊ธฐ ์ „์— Bean์„ ์ƒ์„ฑ ํ•œ ์งํ›„์— ํ•„๋“œ๊ฐ€ ์ฃผ์ž…๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ตฌ์„ฑ ํ•„๋“œ๋Š” public์ผ ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.


Autowired Methods
๊ตฌ์„ฑ ๋ฉ”์†Œ๋“œ๋Š” ์ž„์˜์˜ ์ด๋ฆ„๊ณผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ธ์ˆ˜๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐ ์ธ์ˆ˜๋Š” Spring ์ปจํ…Œ์ด๋„ˆ์—์„œ ์ผ์น˜ํ•˜๋Š” Bean์œผ๋กœ ์ž๋™ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. Bean Property Setter ๋ฉ”์†Œ๋“œ๋Š” ์‚ฌ์‹ค์ƒ ์ผ๋ฐ˜์ ์ธ config ๋ฉ”์†Œ๋“œ์˜ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ตฌ์„ฑ ๋ฐฉ๋ฒ•์€ public์ผ ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.


Autowired Parameters
@Autowired๋Š” Spring Framework 5.0 ์ดํ›„ ๊ฐœ๋ณ„ ๋ฉ”์†Œ๋“œ ๋˜๋Š” ์ƒ์„ฑ์ž ๋งค๊ฐœ ๋ณ€์ˆ˜์— ๊ธฐ์ˆ ์ ์œผ๋กœ ์„ ์–ธ ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ํ”„๋ ˆ์ž„ ์›Œํฌ์˜ ๋Œ€๋ถ€๋ถ„์€ ์ด๋Ÿฌํ•œ ์„ ์–ธ์„ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค. Autowiring๋˜๋Š” ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ ๊ทน์ ์œผ๋กœ ์ง€์›ํ•˜๋Š” ํ•ต์‹ฌ Spring Framework์˜ ์œ ์ผํ•œ ๋ถ€๋ถ„์€ spring-test ๋ชจ๋“ˆ์˜ JUnit Jupiter ์ง€์›์ž…๋‹ˆ๋‹ค (์ž์„ธํ•œ ๋‚ด์šฉ์€ TestContext ํ”„๋ ˆ์ž„ ์›Œํฌ ์ฐธ์กฐ ๋ฌธ์„œ ์ฐธ์กฐ).


Multiple Arguments and 'required' Semantics
๋‹ค์ค‘ ์ธ์ˆ˜ ์ƒ์„ฑ์ž ๋˜๋Š” ๋ฉ”์†Œ๋“œ์˜ ๊ฒฝ์šฐ required () ์†์„ฑ์ด ๋ชจ๋“  ์ธ์ˆ˜์— ์ ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ณ„ ๋งค๊ฐœ ๋ณ€์ˆ˜๋Š” Java-8 ์Šคํƒ€์ผ ์„ ํƒ ์‚ฌํ•ญ์œผ๋กœ ์„ ์–ธ ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, Spring Framework 5.0์—์„œ Kotlin์˜ @Nullable ๋˜๋Š” null์ด ์•„๋‹Œ ๋งค๊ฐœ ๋ณ€์ˆ˜ ์œ ํ˜•์œผ๋กœ ์„ ์–ธ๋˜์–ด 'required'๋ฅผ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค.


Autowiring Arrays, Collections, and Maps
Array, Collection ๋˜๋Š” Map์ด ์ข…์†๋œ ์œ ํ˜•์˜ ๊ฒฝ์šฐ ์ปจํ…Œ์ด๋„ˆ๋Š” ์„ ์–ธ ๋œ ๊ฐ’ ์œ ํ˜•๊ณผ ์ผ์น˜ํ•˜๋Š” ๋ชจ๋“  Bean์„ ์ž๋™ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ชฉ์ ์œผ๋กœ Map์˜ Key๋Š” String ์œ ํ˜•์œผ๋กœ ์„ ์–ธ๋˜์–ด์•ผํ•˜๋ฉฐ ํ•ด๋‹น Bean์˜ ์ด๋ฆ„์œผ๋กœ ํ•ด์„๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ปจํ…Œ์ด๋„ˆ๋กœ ์ œ๊ณต๋œ ์ปฌ๋ ‰์…˜์€ ๋Œ€์ƒ ๊ตฌ์„ฑ ์š”์†Œ์˜ Ordered ๋ฐ **@Order **๊ฐ’์„ ๊ณ ๋ คํ•˜์—ฌ ๋”ฐ๋ฅด๋ฉฐ, ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋ก ๋œ ์ˆœ์„œ๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ๋˜๋Š” ๋‹จ์ผ ์ผ์น˜ ๋Œ€์ƒ Bean์ด ์ผ๋ฐ˜์ ์œผ๋กœ ์œ ํ˜•์ด ์ง€์ •๋œ ์ฝœ๋ ‰์…˜ ๋˜๋Š” ๋งต ์ž์ฒด ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

  • public interface Ordered
    Ordered๋Š” Collection๊ณผ ๊ฐ™์ด ์ˆœ์„œ๋ฅผ ์ •ํ•ด์•ผํ•˜๋Š” ๊ฐ์ฒด๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค.
    ์‹ค์ œ ์ˆœ์„œ๋Š” ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋†’์€ ๊ฒƒ์œผ๋กœ ํ•ด์„ ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๊ฐ€์žฅ ๋‚ฎ์€ ์šฐ์„  ์ˆœ์œ„ ๊ฐ’์„ ๊ฐ€์ง„ ์ฒซ ๋ฒˆ์งธ ์˜ค๋ธŒ์ ํŠธ๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค.
    ์ด ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” PriorityOrdered์˜ ์šฐ์„  ์ˆœ์œ„ ํ‘œ์‹๋„ ์žˆ์Šต๋‹ˆ๋‹ค. PriorityOrdered ๊ฐ์ฒด๊ฐ€ ์ผ๋ฐ˜ ์ˆœ์„œํ˜• ๊ฐ์ฒด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ๋˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ Javadoc for PriorityOrdered๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.
    ์ •๋ ฌ๋˜์ง€ ์•Š์€ ๊ฐ์ฒด์˜ ์ •๋ ฌ ์˜๋ฏธ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ Javadoc for OrderComparator๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

  • public @interface Order
    value ()๋Š” ์„ ํƒ ์‚ฌํ•ญ์ด๋ฉฐ Ordered ์ธํ„ฐํŽ˜์ด์Šค์— ์ •์˜ ๋œ ์ˆœ์„œ ๊ฐ’์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ๊ฐ’์ด ๋‚ฎ์„์ˆ˜๋ก ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋†’์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ Ordered.LOWEST_PRECEDENCE์ด๋ฉฐ, ๊ฐ€์žฅ ๋‚ฎ์€ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค (์ง€์ •๋œ ๋‹ค๋ฅธ ์ˆœ์„œ ๊ฐ’์œผ๋กœ).
    ์ฐธ๊ณ  : Spring 4.0๋ถ€ํ„ฐ, ์–ด๋…ธํ…Œ์ด์…˜ ๊ธฐ๋ฐ˜ ์ˆœ์„œ๋Š” ๋Œ€์ƒ ์ปดํฌ๋„ŒํŠธ์˜ ์ˆœ์„œ ๊ฐ’์ด ๊ณ ๋ ค๋˜๋Š” ์ฝœ๋ ‰์…˜ ์ฃผ์ž… (๋Œ€์ƒ ํด๋ž˜์Šค ๋˜๋Š” @Bean ๋ฉ”์†Œ๋“œ)์—์„œ ์Šคํ”„๋ง์˜ ๋งŽ์€ ์ปดํฌ๋„ŒํŠธ์— ๋Œ€ํ•ด ์ง€์›๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ˆœ์„œ ๊ฐ’์€ ์ฃผ์ž… ์ง€์ ์˜ ์šฐ์„  ์ˆœ์œ„์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์ง€๋งŒ ์ข…์†์„ฑ ๊ด€๊ณ„ ๋ฐ @DependsOn ์„ ์–ธ (๋Ÿฐํƒ€์ž„ ๊ฒฐ์ • ์ข…์†์„ฑ ๊ทธ๋ž˜ํ”„์— ์˜ํ–ฅ์„ ๋ฏธ์นจ)์— ์˜ํ•ด ๊ฒฐ์ •๋˜๋Š” ์ง๊ต ๋ฌธ์ œ์ธ ๋‹จ์ผ ์‹œ์ž‘ ์ˆœ์„œ์—๋Š” ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    Spring 4.1๋ถ€ํ„ฐ ํ‘œ์ค€์˜ Priority์–ด๋…ธํ…Œ์ด์…˜์„ ์ฃผ๋ฌธ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์ด ์–ด๋…ธํ…Œ์ด์…˜์˜ drop-in์˜ ๋Œ€์ฒด๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ์ผ ์š”์†Œ๋ฅผ ์„ ํƒํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ @Priority์— ์ถ”๊ฐ€ ์‹œ๋งจํ‹ฑ์ด์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (AnnotationAwareOrderComparator.getPriority (java.lang.Object) ์ฐธ์กฐ).
    ๋Œ€์•ˆ์œผ๋กœ, ์ˆœ์„œ ๊ฐ’์€ Ordered ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์ธ์Šคํ„ด์Šค๋ณ„๋กœ ๊ฒฐ์ •๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํŠน์ • ํด๋ž˜์Šค์— ๋ถ€์ฐฉ ๋œ ํ•˜๋“œ ์ฝ”๋”ฉ ๋œ ๊ฐ’ ๋Œ€์‹  configuration์œผ๋กœ ๊ฒฐ์ •๋œ ์ธ์Šคํ„ด์Šค ๊ฐ’์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.
    ๋น„ ์ˆœ์ฐจ์  ์˜ค๋ธŒ์ ํŠธ์˜ ์ •๋ ฌ ์‹œ๋งจํ‹ฑ์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์‚ฌํ•ญ์€ OrderComparator์— ๋Œ€ํ•œ javadoc์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.


Not supported in BeanPostProcessor or BeanFactoryPostProcessor
์‹ค์ œ ์ฃผ์ž…์€ BeanPostProcessor๋ฅผ ํ†ตํ•ด ์ˆ˜ํ–‰๋˜๋ฏ€๋กœ @Autowired๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ BeanPostProcessor ๋˜๋Š” BeanFactoryPostProcessor ์œ ํ˜•์— ์ฐธ์กฐ๋ฅผ ์ฃผ์ž… ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
AutowiredAnnotationBeanPostProcessor ํด๋ž˜์Šค์— ๋Œ€ํ•œ javadoc์„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค (๊ธฐ๋ณธ์ ์œผ๋กœ ์ด ์ฃผ์„์˜ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํ™•์ธ ํ•ฉ๋‹ˆ๋‹ค).