Back-end/Spring

[Spring] @Autowired vs @Resource vs @Inject

๐Ÿง @Autowired, @Resource, @Inject์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

 

์˜์กด ์ฃผ์ž…์„ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

 

ํŠน์ • Bean ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ๋Šฅ์— ํ•„์š”ํ•œ ํŠน์ •ํ•œ Bean์„ ์ฐธ์กฐํ•ด์•ผ ํ•˜๋Š”๋ฐ,

์ด ๋•Œ ํŠน์ • Bean์— ์ž๋™ ์—ฐ๊ฒฐ์„ ์œ„ํ•ด ์œ„ ์–ด๋…ธํ…Œ์ด์…˜๋“ค์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

๐Ÿ˜Š @Autowired vs @Resource vs @Inject

 

public class Animal{}
@Component
public class Dog implements Animal{}

@Component
public class Cat implements Animal{}

์ฐจ์ด

@Autowired
private Dog cat 
//ํƒ€์ž… ๊ธฐ์ค€ -- Dog ํƒ€์ž…์œผ๋กœ ์—ฐ๊ฒฐ

@Resource
private Dog cat
//์ด๋ฆ„ ๊ธฐ์ค€ -- Cat ํƒ€์ž…์œผ๋กœ ์—ฐ๊ฒฐ

@Inject
private Cat dog
//ํƒ€์ž… ๊ธฐ์ค€ -- Cat ํƒ€์ž…์œผ๋กœ ์—ฐ๊ฒฐ

 

๐Ÿ‘‰ @Autowired์˜ ํŠน์ง•

 

  • Spring Framwork์—๋งŒ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํƒ€ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ์ด๋ฆ„์„ ํ†ตํ•ด ๋นˆ์„ ๊ฒ€์ƒ‰ํ•œ๋‹ค.
  • @Autowired๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํŠน์ • ๋นˆ์„ ์ฐพ์ง€ ๋ชปํ•˜๋ฉด ์˜ˆ์™ธ๋ฅผ ๋˜์ง„๋‹ค.
  • ์ด ๋•Œ @Autowired์˜ required ์†์„ฑ๊ฐ’์„ false๋กœ ์ง€์ •ํ•ด ๋นˆ์„ ๋ชป ์ฐพ๋”๋ผ๋„ ๊ทธ๋ƒฅ ์น˜๋‚˜์น˜๊ฒŒ ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

 

@Autowired( required = false )

 

โ€ป ๋งŒ์•ฝ ํƒ€์ž…์„ ๊ธฐ์ค€์œผ๋กœ IoC ์ปจํ…Œ์ด๋„ˆ์— ํ˜ธํ™˜ ํƒ€์ž…์ด ์—ฌ๋Ÿฟ ์กด์žฌํ•˜๊ฑฐ๋‚˜ ๊ทธ๋ฃนํ˜•์ด ์•„๋‹ ๋•Œ

    @Primary, @Qualifier๋ฅผ ํ†ตํ•ด ํŠน์ •ํ•œ ๋นˆ์— ์šฐ์„ ๊ถŒ์„ ๋ถ€์—ฌ ํ•  ์ˆ˜ ์žˆ๋‹ค.

@Autowired
@Qualifier("example")

 

๐Ÿ‘‰ @Resource์˜ ํŠน์ง•

 

  • ์ž๋ฐ” ์ธก์—์„œ @Autowired๋ฅผ ์ฐธ๊ณ  ํ•ด ๋งŒ๋“  ์–ด๋…ธํ…Œ์ด์…˜.
  • javax.annotation์— ์†ํ•ด ์žˆ์Œ.
  • ์ด๋ฆ„์„ ํ†ตํ•œ ๊ฒ€์ƒ‰ ๋ฐฉ์‹์ด๊ธฐ ๋•Œ๋ฌธ์—, POJO๊ฐ€ ์—ฌ๋Ÿฟ์ผ ๋•Œ ๋Œ€์ƒ์ด ๋ชจํ˜ธํ•˜์ง€ ์•Š๊ณ , ๋ช…ํ™•ํ•˜๋‹ค.
  • @Autowired + @Qualifier

 

๐Ÿ‘‰ @Inject์˜ ํŠน์ง•

 

  • ์ž๋ฐ” ์ธก์—์„œ @Autowired๋ฅผ ์ฐธ๊ณ  ํ•ด ๋งŒ๋“  ์–ด๋…ธํ…Œ์ด์…˜
  • javax.annotation์— ์†ํ•ด ์žˆ์Œ.
  • ํƒ€์ž…์„ ํ†ตํ•œ ๊ฒ€์ƒ‰๋ฐฉ์‹
  • ํƒ€์ž…์ด ๊ฐ™์€ POJO๊ฐ€ ์—ฌ๋Ÿฟ์ผ ๋•Œ ์ปค์Šคํ…€ ์–ด๋…ธํ…Œ์ด์…˜(custom annotation)์„ ์ž‘์„ฑํ•ด์•ผํ•œ๋‹ค.
//์ปค์Šคํ…€ ์–ด๋…ธํ…Œ์ด์…˜
@Qualifier
@Target({ElementType.TYPE, ElementType.FILED, ElementType.PARAMETER})
@Documented
@Retention(RetentionPolicy.RUNTIME)
public @interface ExampleAnnotation {
}
//
//์ปค์Šคํ…€ ์–ด๋…ธํ…Œ์ด์…˜์„ ์ž‘์„ฑํ•œ ํ›„ ๋นˆ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” POJO ์ฃผ์ž… ํด๋ž˜์Šค์— ๋ถ™์ธ๋‹ค.
@ExampleAnnotation
public class Example{ }
//
//์ฃผ์ž… ์ง€์ ์— ์ปค์Šคํ…€ ์–ด๋…ธํ…Œ์ด์…˜์„ ํ•จ๊ป˜ ๋ถ™์ด๋ฉด ๋ชจํ˜ธํ•ด์ง€์ง€ ์•Š๋Š”๋‹ค.
public calss ForExample{
	
    @Inject @ExampleAnnotation
    ...
  
}

โ€ป ์œ„ @Qualifier๋Š” @Autowired์˜ @Qualifier์™€๋Š” ์ „ํ˜€ ๋‹ค๋ฅด๋‹ค.

 

 

๐Ÿ‘ ์–ด๋Š ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•ด์•ผ ํ• ๊นŒ?

 

๐Ÿ˜Ž @Autowired๋Š” ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ๋‚˜์™”๊ธฐ ๋•Œ๋ฌธ์—, ๋‹ค๋ฅธ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ๋ณ€ํ™˜ ํ•  ๋•Œ ํ˜ธํ™˜์ด ์•ˆ๋œ๋‹ค.

๋”ฐ๋ผ์„œ ํƒ€ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ๋„ ํ˜ธํ™˜์„ ์›ํ•œ๋‹ค๋ฉด @Resource, @Inject๋ฅผ ์‚ฌ์šฉํ•˜์ž.

 

๐Ÿ˜Ž ์ด๋ฆ„์„ ํ†ตํ•ด ๊ฒ€์ƒ‰ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์œผ๋ฉด @Resource๋ฅผ ์‚ฌ์šฉํ•˜๊ณ ,

ํƒ€์ž…์„ ํ†ตํ•ด ๊ฒ€์ƒ‰ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์œผ๋ฉด @Autowired, @Inject๋ฅผ ์‚ฌ์šฉํ•˜์ž.

 

 

์ •๋ฆฌ 

 

์ฐธ๊ณ  ๋ฌธ์„œ : 

์Šคํ”„๋ง5 ๋ ˆ์‹œํ”ผ (๋งˆํ‹ด ๋ฐ์ด๋„˜, ๋‹ค๋‹ˆ์—˜ ๋ฃจ๋น„์˜ค, ์กฐ์‹œ ๋กฑ ์ €/์ด์ผ์›… ์—ญ)

๋ฐ˜์‘ํ˜•