[Spring] DI 의존성 주입

HodooHa·2024년 6월 10일

DI (의존성 주입)

DI(Dependency Injection)란 IoC 구현의 핵심 기술로, 사용하는 객체를 직접 생성하여 만드는 것이 아니라 컨테이너가 빈의 설정 정보를 읽어와 자동으로 해당 객체에 연결하는 것을 말한다.
이렇게 의존성을 주입 받게 되면 이후 해당 객체를 수정해야 할 상황이 발생했을 때 소스 코드의 수정을 최소화할 수 있다.

DI의 장점으로 1) 개발자가 작성해야 할 코드가 단순해지며, 2) 각 객체 간의 종속 관계(결합도)를 해소할 수 있다.


객체간의 종속관계 (결합도)

한 클래스에서 필드 객체를 생성할 때 발생하는 두 객체 간의 관계를 말하며, 각 객체간의 내용이 수정될 경우 영향을 미치는 정도를 나타낸다.
예를 들어 A클래스에서 B클래스를 생성할 경우, B클래스의 생성자의 매개변수가 변경되거나 제공하는 메소드가 변경될 경우 이를 사용하는 A클래스의 일부 정보도 필히 수정해야 하는 상황이 발생하는데 이를 '두 객체간 종속관계(결합도)가 강하다.'라고 표현한다.


DI의 종류

- Setter 메소드를 통한 의존성 주입

의존성을 주입받는 Setter 메소드를 만들고, 이를 통해 의존성을 주입한다.

[예시]

<bean id="student" class="com.uni.firstSpring.person.model.vo.Student">
<property name="name" value="리사" />
<property name="wallet" ref="money" />
</bean>
<bean id="money" class="com.uni.firstSpring.wallet.model.vo.Wallet" />
  • name 속성은 class에서 선언한 필드 변수의 이름을 사용한다.
  • value 속성은 단순 값 또는 Bean이 아닌 객체를 주입할 때 사용한다.
  • ref 속성은 사용하면 Bean 이름을 이용해 주입할 Bean을 찾는다.

- 생성자를 통한 의존성 주입

필요한 의존성을 포함하는 클래스에 생성자를 만들고, 이를 통해 의존성을 주입한다.

[예시]

<bean id="student" class="com.uni.firstSpring.person.model.vo.Student">
<constructor-arg index="0" value="리사"/>
<constructor-arg index="1" ref="money"/>
</bean>
<bean id="money" class="com.uni.firstSpring.wallet.model.vo.Wallet" />
  • Constructor 주입 방식은 생성자의 파라미터를 이용하기 때문에 한번에 여러 개의 객체를 주입할 수 있다.
  • 필드 선언 순서에 따라 index 속성을 통해서도 접근이 가능하다.

- 메소드를 통한 의존성 주입

의존성을 입력받는 일반 메소드를 만들고 이를 통해 의존성을 주입한다.



Spring DI Annotaion

Bean 등록 Annotaion

※ @Repository, @Service, @Controller는 특정한 객체의 역할에 대한 @Component의 구체화된 형태이다.

Bean 의존관계 주입 Annotaion

  • @Autowired와 @Resource 어노테이션은 @Component 로 의존관계를 설정한 객체로부터 의존 관계를 자동으로 주입해주는 어노테이션이다.
  • @Autowired는 타입으로, @Resource는 이름으로 연결해준다.
  • @Value는 단순한 값을 주입할 때 사용한다.

<context:component-scan> 태그

  • @Component를 통해 자동으로 Bean을 등록하고, @Autowired로 의존관계를 주입받는 어노테이션을 클래스에서 선언하여 사용했을 경우에는 해당 클래스가 위치한 특정 패키지를 scan하기 위한 설정을 XML에 해주어야 한다.

[예시]

<context:component-scan base-package=“com.uni.firstSpring" />

※ <context:include-filter> 태그와 <context:exclude-filter>태그를 같이 사용하면 자동 스캔 대상에 포함시킬 클래스와 포함시키지 않을 클래스를 구체적으로 명시할 수 있다.

본 포스팅은 멀티캠퍼스의 멀티잇 백엔드 개발(Java)의 교육을 수강하고 작성되었습니다.

profile
성장하는 개발자, 하지은입니다.

0개의 댓글