@Autowired vs private final

황희윤·2023년 7월 22일

private final : ( 생성자 주입 - Constructor Injection )

@Autowired : ( 필드 주입 - Field Injection )

Setter : ( 수정자 주입 - Setter Injection )

가장 권장하는 방식은 생성자 주입으로 private final을 쓰는 방법이다.

@Autowired와 Setter는 필드를 final로 선언할 수 없다.

생성자 주입 (Constructor Injection)

public  class  ExampleCase {
    
    private  final  ChocolateService  chocolateService;
    private  final  DrinkService  drinkService;
    
    @Autowired
    public ExampleCase(ChocolateService  chocolateService, DrinkService  drinkService) {
   	this.chocolateService = chocolateService;
   	this.drinkService = drinkService;
    }
}

필드 주입 (Field Injection)

public  class  ExampleCase{
    
    	@Autowired
    	private ChocolateService  chocolateService;

    	@Autowired
    	private DrinkService  drinkService;
    }

수정자 주입 (Setter Injection)

public  class  ExampleCase{
    
    	@Autowired
    	private ChocolateService  chocolateService;
    
    	@Autowired
    	private DrinkService  drinkService;
    }

필드 주입의 단점

1. 단일 책임의 원칙 위반

의존성을 주입하기 쉽기 때문에 @Autowired 선언 후 마구잡이로 여러 개를 추가할 수 있다.

2.불변성(Immutability)

생성자 주입과 다르게 필드 주입은 final을 선언할 수 없다. 그래서 객체가 변할 수 있다.

3. 순환 의존성

생성자 주입에서 순환 의존성을 가질 경우 BeanCurrentlyCreationExeption을 발생시킴으로써 순환 의존성을 알 수 있다.

순환 의존성이란?

First Class가 Second Class를 참조하는데 Second Class가 다시 First Class를 참조할 경우 혹은 First Class가 Second Class를 참조하고, Second Class가 Third Class를 참조하고 Third Class가 First Class를 참조하는 경우 이를 순환 의존성이라고 부른다.

수정자 주입(setter) vs 생성자 주입(private final)

Setter Injection

수정자 주입은 선택적인 의존성을 사용할 때 유용하다. 상황에 따라 의존성 주입이 가능하다.

Constructor Injection

생성자 주입은 필수적인 의존성 주입에 유용하다. 게다가 final을 선언할 수 있으므로 객체가 불변하도록 할 수 있다. 또한 위에서 언급했듯이 순환 의존성도 알 수 있다. 그로 인해 나쁜 디자인 패턴인지 아닌지 판단할 수 있다.

profile
HeeYun's programming study

0개의 댓글