본문 바로가기

Spring Boot

의존성 주입 DI (Dependency Inject)

// MyClass7 은 MyClass8의 필드와 메소드를 사용하려한다
// 만약 MyClass8이 없으면 NullPintException이 난다
// 그래서 없으면 안되기 때문에 이걸 의존성이라고 한다.

예를 들어 @Controller에서는  @Service의 메소드와 필드를 사용하려고 한다.

만약 @Service의 메소드와 필드가 없다면 @Controller에서는 사용할게 없으니 NullPointException이 발생

그래서 @Controller에서는 @Service가 있어야 하기 때문에 @Controller가 @Service에 의존한다고 하는걸 

의존성이라고 한다.

 

그림 설명

근데 이걸 안하면 직접 객체 만들어서 인스턴스화 시키고 해야하는 번거로움이 있지만

@Autowired를 하게되면 스프링이 대신 이걸 처리해준다

 

 

 

 

주입방법에는
생성자 주입, 메소드 주입이 있고
필드 주입도 가능하긴 하지만 권장하지 않는다.

생성자 주입에서 생성자가 여러개가 아닌 한개라면 @Autowired를 생략해도 된다.

 

@Component
@RequiredArgsConstructor // final 필드를 아규먼트로 받는 생성자 만들어주는 lombok 어노테이션
class MyClass15 {


    // final을 작성하게되면 무조건 값을 한번 받아야 한다.
    // 우리가 값을 받는 방법중 바로 받을 수 있는건 생성자를 통해 받을 수 있다.
    // 불변성 주입이라고도함
    private final MyClass16 field;

    // @RequiredArgsConstructor 쓰면 자동으로 만들어줌
//    public MyClass15(MyClass16 field) {
//        this.field = field;
//    }


    public MyClass16 getField() {
        return field;
    }
}

 

최종 정리

Spring Framework에서의 DI(의존성 주입, Dependency Injection)는 객체가 필요로 하는 의존성을 외부에서 제공하는 패턴을 의미합니다. 이는 객체의 생성과 의존성 관리를 Spring 컨테이너가 맡게 되어, 개발자는 객체 간의 결합도를 낮추고, 유지보수 및 테스트가 용이한 코드를 작성할 수 있게 됩니다.

의존성 주입의 방식

  1. 생성자 주입(Constructor Injection): 객체 생성 시 생성자를 통해 의존성을 주입합니다.
  2. 세터 주입(Setter Injection): 객체 생성 후 세터 메서드를 통해 의존성을 주입합니다.
  3. 필드 주입(Field Injection): 리플렉션을 사용하여 직접 필드에 의존성을 주입합니다.

장점

  1. 낮은 결합도: 객체는 자신의 의존성을 생성하지 않고, 외부에서 제공받기 때문에 결합도가 낮아집니다. 이는 코드 재사용성과 유지보수성을 증가시킵니다.
  2. 유연한 코드: 의존성을 외부에서 주입받기 때문에 구성 변경이 용이합니다. 이를 통해 다양한 환경에 쉽게 적응할 수 있는 코드를 작성할 수 있습니다.
  3. 단위 테스트 용이성: 의존성을 외부에서 주입할 수 있기 때문에, 테스트 시 모의 객체(Mock)를 사용하여 테스트하기가 용이합니다.

단점

  1. 오버헤드 증가: 의존성 주입을 위한 추가적인 코드가 필요하며, 초기 학습 곡선이 가파를 수 있습니다.
  2. 런타임 오류: 의존성 주입이 잘못되었을 경우, 컴파일 타임이 아닌 런타임에 오류가 발생할 수 있습니다.
  3. 디버깅 어려움: DI를 사용할 때 발생하는 오류는 종종 추적하기 어려울 수 있습니다. 이는 의존성이 자동으로 주입되기 때문에 발생하는 문제입니다.