개발

[Spring] Constructor injection(생성자 주입) vs Field injection (필드 주입)

Loopy_SEOB 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시 편리