JAVA/SPRING

[Spring] 의존성 주입 (Dependency Injection)

KMSEOP 2023. 5. 29. 15:44
728x90

1. 의존성 주입이란?

객체를 직접 생성하는 것이 아니라 외부에서 생성된 객체를 주입하는 방법으로 런타임에 의존성을 동적으로 주입하여 결합도를 낮출 수 있습니다.

스프링에서 의존성을 주입할 수 있는 방법으로는 생성자 주입, 필드 주입, 수정자 주입 등의 방법이 존재하고 스프링에서는 생성자 주입을 권장하고 있습니다.

의존성 주입을 통해 클래스들의 결합도를 낮출 수 있고 객체의 유연성을 높이고 테스트 작성이 용이해진다는 장점이 있습니다.

 

public class Person {
  private Student student;

  public Person() {
    this.student = new Student();
  }
}

위 코드 예시의 문제점은 Person 클래스와 Student클래스가 강한 결합도를 가지고 있습니다.

DI를 이용하여 문제점은 아래와 같이 해결이 가능합니다.

public class Job {}

public class Student extends Job {}
public class Police extends Job {}

public class Person {
  private Job job;

  public Person() {
    job = new Job();
  }
}

 

의존성 주입을 통해 클래스들의 결합도를 낮출 수 있고 객체의 유연성을 높이고 테스트 작성이 용이해진다는 장점이 있습니다.

 

 

2. 의존성 주입 방법

생성자 주입

public class Person {
  private final Job job;

  public Person(Job job) {
    this.job = job;
  }
}


// lombok을 이용하여 간결하게 사용 가능
@RequiredArgsConstructor
public class Person {
  private final Job job;
}

생성자 주입은 생성자가 호출되는 시점에 단 1번만 호출되므로 객체의 불변을 보장합니다.

 

수정자 주입

public class Person {
  private final Job job;

  @Autowired
  public void setJob(Job job) {
    this.job = job;
  }
}

수정자 주입은 객체의 변경이 필요할 때 사용 가능합니다. 다만 @Autowired로 주입할 대상이 없는경우에 에러가 발생합니다.

 

필드 주입

public class Person {
  @Autowired
  private final Job job;
}

필드 주입은 코드가 간결하나 외부에서 접근이 불가능해 테스트 코드 작성 시 객체를 변경할 수 없다는 단점이 있습니다.

728x90