[Spring] DI (Dependency Injection)

한호성·2022년 11월 8일
0

글의 목적

Spring 의 큰 특징 중 하나인 DI에 대해 이해하고, DI방식에 대해 정리하는 글입니다.

DI (Dependency Injection)

DI 란?

DI란 말그대로 의존성 주입이다. 여기서 의존성이란 무엇일까? 객체지향 프로그래밍에서의 두개의 객체 A,B가 있다고 생각해보자 이 때, B객체의 맴버변수나, 맴버함수가 A의 객체에 영향을 받고 있다면, 우리는 B 객체가 A객체의 의존성을 갖고 있다라고 표현한다.

의존성있는 객체를 주입받지 않고 사용할 경우, 코드가 복잡해지고, 유지보수에 있어서 굉장히 불편해진다. DI를 활용하여 프로그램 설계 했을 때, 얻을 수 있는 장점은 다음과 같다.

  • Unit Test 용이해진다.
  • 코드의 재활용성을 높여준다.
  • 객체 간의 의존성을 줄이거나 없앨 수 있다.

스프링에서만 사용되는 용어가 아니라 객체 지향 프로그래밍에서 통용되는 개념이다.

DI 방식

DI를 하는 방법에는 크게 2가지가 존재한다. (생성자를 통한 주입, 수정자를 통한 주입)

Setter Based Injection (수정자 주입)

      public class Controller {
          private Service service;

          public void setService(Service service) {
              this.service = service;
          }

          public void callService() {
              service.doSomething();
          }
      }
  • Class 내에서 의존관계에 있는 다른 Class를 구현할 수 있다.(런타임)

  • 수정자 주입을 사용할 의존관계 주입을 런타임시에 할 수 있도록 했지만, 의존관계에 있는 Class를 구현하지 않으면, NullPointerException이 발생한다 (런타임에러) -> 이러한 단점을 해결하는 방법이 생성자 주입이다..

Constructor based Injection (생성자를 통한 주입)

      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 객체를 바꿀 수 없다.)

Spring 에서의 DI 방식

Field Injection

  • 수정자 주입 방식과 유사한 방식으로 이루어진다 (Setter Based Injection의 단점을 그대로 갖고있다.)
  • 스프링 컨테이너 말고 외부에서 주입이 불가능하다.

Spirng 에서의 생성자 주입의 장점

  • 개발하다 보면 여러 서비스들 간 의존관계까 생기게 되는 경우가 있다.
  • 객체 생성시점에 순환참조가 일어나는지 알 수 있다.

생성자 주입을 사용하는 이유

  1. 의존관계가 설정되어 있지 않으면 객체 생성 불가 (컴파일 타임에 오류인지 가능 -> Null Pointer Excetpion 방지)
  2. 스프링 내부에서 Application 구동 시 순환 참조 파악 가능
  3. 의존성 주입이 필요한 필드 final로 선언 가능 -> 중간에 객체 변경되는 것을 막을 수 있다.

Reference

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

profile
개발자 지망생입니다.

0개의 댓글