[Spring] Autowired 와 private final의 차이

Cover image

Autowired 와 private final의 차이

스프링을 개발하다보면, Autowired와 private final을 사용해서 의존성을 주입합니다. 다만, 이에 대한 차이점에 대해 의문이 존재했습니다.

필드 주입과 생성자 주입

Field Injection (필드 주입)

필드에 @Autowired 어노테이션을 붙여주면 자동으로 의존성이 주입됩니다.

@Service
public class TestService {
  @Autowired
  private TestRepository testRepository;
}

Constructor Based DI (생성자 기반 DI)

@Service
public class TestService {
  private final TestRepository testRepository;

  // 생략하고 @AllArgsConstructor 어노테이션 사용해도 됩니다.
  public TestService(TestRepository testRepository) {
    this.testRepository = testRepository;
  }
}

생성자 주입 방법이 더 좋은 이유

  • 순환 참조를 방지할 수 있습니다.

    • 순환 참조 발생 시, 애플리케이션이 구동되지 않습니다.
  • 테스트에 용이합니다.

    • 단순 POJO를 이용한 테스트 코드를 만들 수 있습니다.
  • 코드의 품질을 높일 수 있습니다.
  • 불변성을 얻을 수 있습니다.

    • final을 사용할 수 있습니다.
    • 실행 중에 객체가 변하는 것을 막을 수 있습니다.
  • 오류를 방지할 수 있습니다.

출처