Spring 의 큰 특징 중 하나인 DI에 대해 이해하고, DI방식에 대해 정리하는 글입니다.
DI란 말그대로 의존성 주입이다. 여기서 의존성이란 무엇일까? 객체지향 프로그래밍에서의 두개의 객체 A,B가 있다고 생각해보자 이 때, B객체의 맴버변수나, 맴버함수가 A의 객체에 영향을 받고 있다면, 우리는 B 객체가 A객체의 의존성을 갖고 있다라고 표현한다.
의존성있는 객체를 주입받지 않고 사용할 경우, 코드가 복잡해지고, 유지보수에 있어서 굉장히 불편해진다. DI를 활용하여 프로그램 설계 했을 때, 얻을 수 있는 장점은 다음과 같다.
스프링에서만 사용되는 용어가 아니라 객체 지향 프로그래밍에서 통용되는 개념이다.
DI를 하는 방법에는 크게 2가지가 존재한다. (생성자를 통한 주입, 수정자를 통한 주입)
public class Controller {
private Service service;
public void setService(Service service) {
this.service = service;
}
public void callService() {
service.doSomething();
}
}
Class 내에서 의존관계에 있는 다른 Class를 구현할 수 있다.(런타임)
수정자 주입을 사용할 의존관계 주입을 런타임시에 할 수 있도록 했지만, 의존관계에 있는 Class를 구현하지 않으면, NullPointerException이 발생한다 (런타임에러) -> 이러한 단점을 해결하는 방법이 생성자 주입이다..
public class Controller {
private Service service;
public Controller(Service service) {
this.service = service;
}
public void callService() {
service.doSomething();
}
}
null을 주입하지 않는 한 NullPointerExcetpion 발생하지 않는다.
의존관계 주입을 하지 않은 경우 Controller 객체를 생성할 수 없다. 즉 의존관계에 대한 내용을 컴파일 타임에 오류를 잡을 수 있다.
final을 사용할 수 있다. final로 선언된 레퍼런스 타입의 변수는 선언과 함께 초기화 되어야 하므로 setter(수정자 주입 방식으로는 적용할 수 없다. & Controller 내부에서 Service 객체를 바꿀 수 없다.)
https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-dependencies
https://yaboong.github.io/spring/2019/08/29/why-field-injection-is-bad/
https://velog.io/@wlsdud2194/what-is-di