[Spring] Autowired 와 private final의 차이
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
을 사용할 수 있습니다.- 실행 중에 객체가 변하는 것을 막을 수 있습니다.
- 오류를 방지할 수 있습니다.
출처