케이스윔의 개발 블로그

[Spring] DI(Dependency Injection, 의존성 주입) 본문

Study/Spring Framework

[Spring] DI(Dependency Injection, 의존성 주입)

kswim 2019. 1. 19. 19:27

DI(Dependency Injection)

외부에서 의존관계의 객체를 주입하는 것입니다. 객체 생성 후 다른 객체에 해당 객체를 주입하는 것입니다. 그냥 정의로는 잘 이해가 안가니 예를 들어보면 만약 클래스 A의 필드로 클래스 B가 존재하고, 클래스 A에서 어느 메소드에서의 연산에서 클래스 B가 필요하다면 클래스 A와 B를 생성하고, 클래스 A의 생성자 또는 setter를 통해서 클래스 B를 A의 필드로 만들어주어야 합니다. 이렇게 해주는 것이 바로 의존성 주입입니다.

이전 글에서 스프링 설정파일에서 bean을 만들 수 있다고 했는데 생성한 bean에 주입하고자 하는 객체를 <constructor-arg ref=”해당객체”/> 태그를 통해 주입할 수 있습니다.  위의 예시에서 A라는 bean을 생성할 때 해당 태그안에 <constructor-arg ref=”B”/> 와 같이 해주면 됩니다. 이렇게 만들어진 Bean은 이후 getBean으로 가져와 사용할 수 있습니다. 


Injection 할 수 있는 여러가지 방법을 소개하겠습니다.

 1. 생성자를 이용한 객체 주입(생성하고자 하는 bean의 생성자에서 객체를 Injection 할 때) 

2. Setter를 이용한 객체 주입(생성하고자 하는 bean에서 setter 메소드를 이용할 때): set을 떼고 첫글자를 소문자로 바꾸어서 Bean 생성 시에 property 태그로 넣어줍니다. 

<bean id=”databaseConnectionInfoDev” class = “프로젝트명.class명”>

<property name=”jdbcUrl” value=”jdbc:oracle:thin:@localhost:1521:xe”/>

</bean>

3. List 타입 의존 객체 주입(생성하고자 하는 bean에 Injection 하고 싶은 내용이 List일 때)

<property name=”developers”>

<list>

<value>suyoung</value>

</list>

</property>


이렇게 스프링 설정파일을 통해 bean을 생성하고 의존주입까지 가능하니 의존성 설정을 바꾸고 싶을 때 프로그램 코드를 변경할 필요 없이 설정파일만 수정하면 된다는 장점이 있습니다!


Bean의 범위

- Singleton(싱글톤): 스프링 컨테이너에서 생성된 Bean의 경우 동일한 타입에 대해서는 기본적으로 한 개만 생성이 되며, getBean() 메소드로 호출 될 때 동일한 객체가 반환됩니다.

- Prototype: 싱글톤 범위와 반대의(?) 범위입니다. 스프링 설정파일에서 property를 가지는 Bean의 속성에 scope의 속성을 prototype으로 명시해주면 getBean()으로 호출할 때에 property의 객체를 새로 생성합니다. 

ex) <bean id=”dependencyBean” class=”프로젝트명.클래스명” scope=”prototype”>


의존객체 자동주입

스프링 설정 파일에서 의존 객체를 주입할 때 <constructor-arg> 또는 <property> 태그로 의존 객체를 명시하지 않아도 스프링 컨테이너가 자동으로 필요한 의존 대상 객체를 필요한 객체에 주입해주는 기능입니다. 아래의 두가지 annotation을 의존 주입할 객체의 생성 시에 명시해주면 됩니다. 대신 스프링 설정파일에 url과 <context: annotation-config/>를 추가해줘야 합니다.


1. @Autowired: 주입하려고 하는 객체의 타입이 일치하는 객체를 자동으로 주입합니다. (생성자에서는 자유롭게 사용이 가능하지만 메소드나 속성에 바로 사용할 때는 의존주입하고자 하는 객체의 default 생성자가 필요합니다. 생성자없이 파라매터가 필요한 생성자만 있으면 해당 객체가 생성안돼서 에러가 날 수 있습니다.)-> required=false 옵션을 통해서 주입하고자 하는 객체가 없을 때 에러가 나지 않도록 할 수도 있습니다.

2. @Resource: 주입하려고 하는 객체의 이름이 일치하는 객체를 자동으로 주입한다. 생성자에서는 쓸 수 없고 속성 또는 메소드에 사용이 가능합니다.(이 때도 default 생성자가 필요하겠죠?)

3.@Inject: @Autowired와 거의 비슷하게 의존 객체를 자동으로 주입할 수 있습니다.(required 속성은 지원하지 않습니다.)


만약 동일한 객체가 2개 이상인 경우 스프링 컨테이너에서는 자동 주입 객체를 판단하지 못하고 에러가 날 것입니다. 다수의 Bean 객체 중 의존 객체의 대상이 되는 객체를 선택해야 한다면 @Autowired와 함께 @Qualifier(“가져올 bean의 id”)를 명시해주거나 <qualifier value=”가져올 bean의 id”/>를 명시하여  이 bean을 우선적으로 사용하겠다고 알려줘야 합니다. @Inject에서는 @Inject @named(value=”id명”)을 통해서 선택해서 사용할 수 있습니다.




Comments