본문 바로가기

BE/Spring

[Spring] @Autowired 와 DI 개념 정리

인트로

안녕하세요 :) 오늘은 Spring 프레임워크의 @Autowird 어노테이션, 이를 설명하기 위한 DI개념에 대해 정리하겠습니다.

목차
1) DI(Dependency Injection) 개념
2) @Autowired 개념
3) @Autowired 와 @Resource
4) @Autowired 활용 방법

 

DI(Dependency Injection) 

DI(Dependency Injection)란
@Autowired 개념을 알기 위해 먼저 DI 개념을 알아야 합니다.

DI(의존성 종속, Dependency Injection)란, 클래스간의 의존관계스프링 컨테이너가 자동으로 연결해주는 것을 말합니다. 

* Dependency 란, 객체가 다른 객체와 상호작용하는 것을 말합니다.

클래스 A가 클래스 B,C와 상호작용한다면 객체 A는 객체B,C와 의존관계입니다. 

 

DI가 필요한 이유 : 객체 간 의존성 

아래 Factory 인터페이스를 상속받는 ConsoleFactory, UserFactory가 있습니다.

SW를 사용하는 고객은 Factory 클래스만을 호출해야하며, 그것이 ConsoleFactory인지 UserFactory인지 몰라야합니다. 

고객마다 전용 Factory를 생성할 경우 코드 생산성이 떨어지며, 고객이 몰라도 되는 코드가 노출되기 때문입니다. 

때문에 스프링은 Factory가 ConsoleFactory인지 UserFactory인지를 프레임워크가 자동으로 객체간 의존성을 주입해줍니다.

 

Factory관계

 

 

DI 유형 : 의존관계에 있는 Bean을 주입하는 3가지 방법

스프링이 제공하는 DI에는 Setter Injection, Construction Injection, Method InJection 이 있습니다. 

1) Setter Injection : setter/getter 메서드의 setter 메서드를 통해 의존관계에 있는 객체를 주입합니다.

- <property> 태그를 통해 의존관계에 있는 bean을 주입합니다. 

- ref 속성 : Bean의 레퍼런스를 주입하고자 하는 경우 사용하는데, 스프링이 Bean id를 통해 Bean을 찾아 주입시킵니다.

- value 속성 : 관련 객체가 아닌 단순 값을 주입하고자 하는 경우 
2) Constructor injection : 생성자를 통해 의존 관계에 있는 객체를 주입합니다.  

- 생성자를 통해 의존관계가 있는 객체를 주입하는 경우 <constructor arg > 태그를 사용합니다.

 

 

@Autowired 개념 

 

@Autowired란, 스프링 DI(Dependency Injection)에서 사용되는 어노테이션입니다.  

스프링에서 빈 인스턴스가 생성된 이후 @Autowired를 설정한 메서드가 자동으로 호출되고, 인스턴스가 자동으로 주입됩니다. 

즉, 해당 변수 및 메서드에 스프링이 관리하는 Bean을 자동으로 매핑해주는 개념입니다. @Autowired 는 변수, Setter메서드, 생성자, 일반 메서드에 적용이 가능하며 <property>, <constructor-arg>태그와 동일한 역할을 합니다. 

 

@Type을 통한 주입

@Autowired는 주로 타입(Type)을 이용해 주입합니다. @Autowired 가 Type으로 찾아서 주입하므로 동일한 Bean 타입의 객체가 여러개 있을 경우, Bean을 찾기 위해 @Qualifier 어노테이션을 같이 사용해야 합니다. 

 

<context:component scan > 태그

@Autowired로 의존 관계를 주입받을 경우, 해당 클래스(@Autowired당하는 클래스)를 반드시 Component Auto Scanning을 설정해야 합니다.  Component Auto Scanning 코드는 아래와 같습니다. 

<context:component-scan base-package="factory.userfactory" />

 

 

@Autowired 와 @Resource

스프링이 관리하는 빈(Bean)을 자동으로 주입해주는 어노테이션에는 @Autowired, @Resource 어노테이션이 있습니다.

@Resource어노테이션은 변수와 세터 메서드를 빈 이름(name)으로 자동연결합니다. 그러나 여러 인수를 받는 메서드 등의 경우에는 @Resource를 사용할 수 없습니다. 

 

두 어노테이션의 차이점
두 어노테이션은 비슷하지만 조금 차이가 있습니다.

1) 의존성 주입  : @Autowired 는 타입으로 의존성을 주입하는 반면, @Resource는 이름으로 의존성을 주입한다는 점입니다. 

2) 적용 위치 : @Autowired 는 변수, 생성자, Setter메서드, 일반 메서드 등에 적용 가능합니다. 반면, @Resource는 변수, Setter메서드등에 적용 가능합니다. 

(만약 bean이 Map타입인 경우,  @Autowired 애노테이션이 제대로 작성하지 않기 때문에 @Resource애노테이션을 사용해야합니다.)

 

 

@Autowired 와 @Qualifier 

@Qualifier는 두가지 기능이 있습니다. 

 

1) 유일한 빈 구별 : @Autowired로 연결한 빈 목록에서 유일한 빈을 구별합니다. @Qualifier(value ="빈이름") 

스프링 컨테이너가 @Autowired 를 설정한 필드, 생성자 등 타입으로 후보 빈을 찾는데, 그 후 @Qualifier를 통해 유일한 빈을 구별합니다. 

 

2) 타입 지정 : 연결할 빈의 값 타입을 지정합니다. @Qualifier("serviceName")

연결할 빈의 타입을 지정한 경우 springbeans.xml에 선언한 이름을 작성해줍니다. 

 

> Qualifier

@Autowired
@Qualifier("abService")

 

> springbeans.xml

<bean id="abService" class="spring.service.ABService"></bean>
<bean id="bcService" class="spring.service.BCService"></bean>

 

이상 스프링의 @Autowired 에 대해 정리해보았습니다.

감사합니다 :D