본문 바로가기
개발/스프링

[Spring] 의존성 주입의 세 가지 방법

by 카펀 2022. 3. 10.

@Deprecated

이 글은 오래되었으며, 제가 이후 더 공부하고 나서 새로 작성한 글이 있습니다.

이 글보다 더 자세하고 깊이 있게 작성되어 있으니 새로 작성한 글을 참고해 주세요! (2022. 07. 11)

 

앞서 스프링의 의존성 주입에 대한 글을 몇 가지 쓴 바 있습니다. (IoC와 DI, 테스트 코드와 의존성 주입, Bean 의존 관계 설정)

이러한 의존성을 주입하는 방법이 대표적으로 세 가지가 있는데요.

각 세 가지 방법에 대해 다루어 보고자 합니다.

 

1. 필드 주입

2. setter 주입

3. 생성자 주입

 

1. 필드 주입

필드 주입은 아래와 같은 방식으로 이루어집니다.

public class PurchaseController {
    
    @Autowired private PurchaseService purchaseService;

    ...

}

필드 주입은 그다지 좋은 방식은 아닙니다.

맨 처음 선언되고 나서 내용을 바꿀 수 있는 방법이 없기 때문인데, Spring 첫 실행 시에 고정되어 있는 채로 바꿀 수 있는 여지가 없습니다.

그래서 필드 주입보다는 setter 주입이 더 좋은 방법입니다.

 

2. setter 주입

 

setter 주입은 아래와 같이 이루어집니다.

public class PurchaseController {
    
    private PurchaseService purchaseService;
    
    @Autowired
    public void setPurchaseService (PurchaseService purchaseService) {
        this.purchaseService = purchaseService;
    }

    ...

}

 

이후에 내용을 바꿀 수 있으므로, 앞서 봤던 필드 주입보다 훨신 좋은 방법입니다.

하지만 이것 역시 좋은 방법이 아닌데요.

위처럼 setter 주입 방법으로 구현을 하게 되면 아래와 같은 경우가 발생합니다.

 

(setPurchaseService와 유사한 코드를 이용하여 예시 화면을 촬영하였습니다.)

위 코드에서는 개발 과정에서 다른 곳에서 setMemberService를 호출할 수 있게 됩니다.

 

즉, 누군가가 PurchaseController를 호출했을 때, setPurchaseService가 public하게 열려 있다는 뜻인데요.

PurchaseService는 처음에 Spring이 로딩될 때는 변경될 수 있지만, 한 번 서비스가 세팅이 되고 나면 이후에는 바뀔 일이 없습니다.

따라서 수정할 일이 없는 부분인데, setter가 계속 노출된다는 것은 설계상 좋은 방법이 아닐 것입니다.

그래서 보통 다음으로 소개해 드릴 생성자 주입 방식을 가장 많이 사용합니다.

3. 생성자 주입

생성자 주입은 아래와 같은 방식으로 이루어집니다.

public class PurchaseController {
    
    public final PurchaseService purchaseService;
    
    @Autowired
    public PurchaseController(PurchaseService purchaseService) {
        this.purchaseService = purchaseService;
    }

    ...

}

PurchaseController를 호출할 때 생성자가 자동으로 호출되며, purchaseService에 대한 의존성을 주입 받는 내용입니다.

위처럼 선언하게 되면 앞서 setter 때와는 달리 내용 변경이 public하게 노출되지 않게 됩니다.

 

앞서 제가 작성한 글들에서도 생성자 주입 방식으로 의존성을 주입한 것을 확인할 수 있습니다.

 

마무리

의존성 주입은 Spring의 중요한 특징이자 개념 중 하나입니다.

DI가 이루어지는 방법이 어떤 방법이 있고, 각각의 장단점이 어떻게 있으며, 왜 특정 방법이 실무에서 주로 사용되는지 파악하고 사용하는 것이 중요하다고 생각하여 정리해 보았습니다.

 

 

 

댓글