-
[Spring] Constructor injection(생성자 주입) vs Field injection (필드 주입)개발 2023. 1. 16. 15:24
오늘 기존소스를 수정하다 보니 @RequiredArgConstructor를 선언하고 private final로 주입해서 사용하는 생성자 주입 케이스와
@Autowired를 사용해서 주입하는 필드 주입 케이스가 공존하는 것을 보고 일괄로 수정하려다 두가지가 정확히 무슨차이가 있을까 고민한 내용을 포스팅한다.
1. Contructor Injection (생성자 주입)
@RequiredArgsConstructor public class DataAggregationController { private final DataImportService dataImportService; private final DataExportService dataExportServcie; ... }
2. Field Injection (필드 주입)
public class BatchConfig { @Autowired private JobBuilderFactory jobBuilderFactory; @Autowired private StepBuilderFactory stepBuilderFactory; .... }
생성자 주입의 장점
- 순환 참조 방지
객체에 의존성을 주입하다 보면 순환 참조 되는 문제가 발생할 수 있다. A class -> B class / B class -> A class 이런 식으로.
필드 주입 같은 경우 서버는 실행 되겠지만 곧 StackOverflowError를 띄우며 순환참조로 죽는다. (dfs시 탈출로직을 안세우면 무한으로 도는것 마냥?) 생성자 주입 같은 경우는 애초에 서버에서 context cycle이 존재한다고 실행되지 않는다.
- final로 선언하여 사용 가능
- Test시 편리
'개발' 카테고리의 다른 글
Spring Multi Module (0) 2022.12.29 Eureka - [Spring Cloud] (0) 2022.12.29 Gradle 기본 정리 (0) 2022.12.21 Effective Java Study - 1 (1) 2022.09.08 JPA 연관 관계 매핑 (0) 2022.08.02