본문 바로가기

Spring

[Spring] 의존성 주입(DI)

의존성 주입(Dependency Injection)은 객체를 외부에서 주입하여 결합도를 낮추고 유연한 코드를 작성하는 디자인 패턴이다. 의존성 주입은 크게 생성자 주입, Setter 주입, 필드 주입으로 나뉜다.

 

1. 의존성 주입(DI)방식 3가지

1) 생성자 주입(Constructor Injection)

생성자 주입은 의존성 객체를 생성하는 시점에 주입하는 방식

생성자의 호출 시점에 1회 호출되는 것이 보장되어 주입받은 객체가 변하지 않거나, 객체의 주입을 강제할 수 있다.

public class MyClass {
	private final MyData myData;

	public MyClass(MyData myData) {
    	this.myData = myData;
	}
}

2) Setter 주입(Setter Injection)

Setter 메서드를 통해 의존성을 주입하는 방식

객체가 변경될 가능성이 있을 때 사용한다.

public class MyClass {
	private MyData myData;

	public void setMyData(MyData myData) {
    	this.myData = myData;
	}
}

3) 필드 주입(Field Injection)

@Autowired 어노테이션을 사용해서 멤버 변수의 선언 시점에 의존성을 주입하는 방식

코드가 간결해지는 장점이 있으나 외부에서 접근이 불가능해 테스트 코드 작성시 어려울 수 있다.

public class MyClass {

	@Autowired
	private MyData myData;

}

2. 스프링 공식문서에서 생성자 주입 방식 사용을 권고하는 이유

(요약)

의존성 주입을 강제해야 하는 필드는 생성자 주입을 사용하고, 선택적으로 하는 경우 수정자 주입을 사용하면 된다. 대신, 수정자 주입 시 @Autowired를 통해 의존성을 강제 주입할 수 있다. 하지만 인수의 계획적인 검증을 포함하는 생성자 주입이 더 좋다.

 

생성자 주입 방식은 애플리케이션 구성 요소를 불변 객체로 구현하고, 의존성이 null이 아님을 보장하기 때문에 스프링은 생성자 주입을 권고한다. 그리고 완전히 초기화된 상태로 클라이언트 코드에 반환된다.

 

수정자 주입의 장점은 Setter 메서드가 클래스 객체를 재구성 혹은 재주입 할 수 있도록 하는 것이다.

 

3. 객체지향 관점에서 DI 방식으로 의존성 문제 해결시 장점

의존성 주입을 사용하면 객체 간 결합도가 낮아지고 코드의 유연성과 재사용성이 높아진다.

단일책임 원칙을 준수한다.

객체 간 결합도가 낮아 테스트 코드를 더 쉽게 작성할 수 있다.

객체의 생명주기와 의존성을 외부에서 관리할 수 있다.

코드의 가독성이 향상되고, 유지보수성이 높아진다.

 

 

 

참고

Dependency Injection :: Spring Framework

[Spring] 의존성 주입(Dependency Injection, DI)이란? 및 Spring이 의존성 주입을 지원하는 이유 - MangKyu's Diary (tistory.com)

[Spring] 다양한 의존성 주입 방법과 생성자 주입을 사용해야 하는 이유 - (2/2) - MangKyu's Diary (tistory.com)

'Spring' 카테고리의 다른 글

[Spring] 웹서버(WS)와 WAS & 자료구조  (0) 2023.07.27
[Spring] 트랜잭션 & TCP와 UDP  (0) 2023.07.26
[Spring] Rest Client & @SpringBootTest와 @WebMvcTest  (0) 2023.07.25
[Spring] JPA & 제네릭  (0) 2023.07.21
[Spring] DI와 예외처리  (0) 2023.07.20