[Spring] Setter, 필드, 생성자 의존성 주입

ian kwon·2024년 8월 23일

Spring 의존성 주입 방법: Setter, 필드, 생성자 의존성 주입

Spring 프레임워크에서 의존성 주입(Dependency Injection, DI)은 객체 간의 의존성을 외부에서 주입하여 객체들 간의 결합도를 낮추고, 코드의 유연성과 테스트 용이성을 높이는 중요한 기법입니다. Spring에서는 크게 세 가지 방식으로 의존성 주입을 할 수 있습니다: Setter 주입, 필드 주입, 생성자 주입입니다. 각 방법의 장단점을 알아보겠습니다.


1. Setter 의존성 주입

Setter 주입은 객체의 Setter 메서드를 통해 의존성을 주입하는 방법입니다. 이 방식은 선택적인 의존성 주입에 유리하며, 생성 후에 의존성을 변경할 수 있습니다.

@Component
public class MyService {
    private MyRepository myRepository;

    @Autowired
    public void setMyRepository(MyRepository myRepository) {
        this.myRepository = myRepository;
    }
}

장점:

  • 의존성이 반드시 필요하지 않을 때 사용하기 좋습니다.
  • Spring 컨테이너가 객체를 생성한 후에도 의존성을 주입할 수 있습니다.

단점:

  • 객체가 불완전한 상태로 생성될 수 있으므로, 필수적인 의존성 주입에는 적합하지 않습니다.

2. 필드(Field) 의존성 주입

필드 주입은 클래스의 필드에 직접 @Autowired 어노테이션을 붙여 의존성을 주입하는 방법입니다. 코드가 간결해지지만, 테스트 및 유지보수에 불리할 수 있습니다.

@Component
public class MyService {
    @Autowired
    private MyRepository myRepository;
}

장점:

  • 가장 간단하고 코드가 짧습니다.

단점:

  • DI 프레임워크가 없이는 테스트가 어려워집니다. (Mockito 같은 프레임워크를 사용하지 않는다면)
  • 의존성이 숨겨져 있어 코드의 가독성이 떨어질 수 있습니다.
  • DI 프레임워크에 강하게 결합됩니다.

3. 생성자(Constructor) 의존성 주입

생성자 주입은 객체 생성 시점에 필요한 의존성을 주입받는 방식입니다. Spring 4.3 이후부터는 생성자가 하나뿐인 경우 @Autowired 어노테이션을 생략해도 자동으로 의존성이 주입됩니다.

@Component
public class MyService {
    private final MyRepository myRepository;

    @Autowired
    public MyService(MyRepository myRepository) {
        this.myRepository = myRepository;
    }
}

장점:

  • 필수 의존성을 명확하게 정의할 수 있어 객체의 일관성을 유지할 수 있습니다.
  • 의존성이 주입되지 않으면 객체가 생성되지 않으므로 오류를 예방할 수 있습니다.
  • 불변성을 보장할 수 있습니다.

단점:

  • 의존성 수가 많아질 경우 생성자의 매개변수가 많아져 코드가 복잡해질 수 있습니다.

결론

Spring에서는 상황에 따라 세 가지 의존성 주입 방법을 적절히 사용할 수 있습니다.

  • Setter 주입: 선택적 의존성이 필요할 때 유용합니다.

  • 필드 주입: 코드가 간결해지는 장점이 있지만, 테스트와 유지보수 측면에서 주의가 필요합니다.

  • 생성자 주입: 필수 의존성을 명확하게 설정할 수 있으며, 객체의 일관성과 불변성을 유지할 수 있어 권장되는 방법입니다.

profile
“당신이 두려워하는 일을 매일 하라.” -엘리너 루스벨트-

0개의 댓글