CS 스터디하면서 다시 Spring 의 기본 동작 원리를 살펴보고 있는데 정말 어렵다 🤧
SPRING 이랑 가까워지려다가도 더 알면 알 수록 멀어지는 느낌이랄까?!
처음에는 JAVA의 특징들을 그대로 물려받은 것 같다 생각해서 쉽게 느껴졌는데 깊이 알면 알 수록 어렵게 느껴진다
🟢 DI 종류는 어떤것이 있고, 이들의 차이는 무엇인가요?
의존성 주입 방법에는 생성자 주입 방법, 필드 주입 방법, setter 주입 방법 이 있습니다.
# 생성자 주입 방법
✅ 객체가 생성될 때 생성자를 통해 의존성 주입
✅ 필수 의존성을 처리할 때 권장
✅ 객체는 완전히 초기화된 상태로 사용되기 때문에 완전하지 않은 상태(의존성 없이)로 사용될 수 없도록 강제할 수 없어서 안전함
✅ 단일 생성자에 한해 ‘@Autowired’를 붙이지 않아도 된다.
✨ Spring 4.3부터 클래스의 생성자가 하나이고 그 생성자로 주입 받을 객체가 Bean으로 등록되어 있으면 @Autowired 생략 가능
✅ 생성자 주입 방식은 final 선언이 가능하여 불변성 보장
✅ Constructor Injection(생성자 주입)은 객체가 생성될 때 필요한 모든 의존성을 생성자를 통해 주입 받기 때문에 의존성 없이는 객체 생성이 불가
@Component
public class SomeClass {
private final SomeDependency someDependency;
private final OtherDependency otherDependency;
// 이 클래스는 단일 생성자를 가지므로, 스프링은 자동으로 이 생성자에 의존성을 주입
// 따라서 @Autowired 어노테이션을 생략
public SomeClass(SomeDependency someDependency, OtherDependency otherDependency) {
this.someDependency = someDependency;
this.otherDependency = otherDependency;
}
}
# 필드 주입 방법
✅ 필드에 의존성을 주입하는 방법
✅ 외부에서의 의존성 변경이 불가하여 테스트가 어려움
✅ DI 컨테이너에 대한 강한 의존성을 가지며 컨테이너 없이는 인스턴스화가 어려움
→ 의존성 주입이 쉬우나 스프링 컨테이너만 사용 가능 (@Autowired 어노테이션 추가로 추가가 가능)
✅ final 선언이 불가하여 객체의 불변성을 보장하기 힘들다 (변경가능한 객체)
→ 반면, 생성자 주입 방식은 final 선언이 가능하여 불변성을 보장
@Component
public class SomeClass {
@Autowired
private SomeDependency someDependency;
// other methods
}
# Setter 주입 방법
✅ 의존성을 제공하는 setter 메서드를 통해 의존 객체를 주입
✅ 선택적 의존성을 다룰 때 적합
✅ 객체가 완전히 생성된 후 의존성 설정되지만 일시적으로 완전하지 않은 상태에 있을 수 있음
✅ Setter Injection을 통해서 Service의 구현체를 주입해주지 않아도 Controller 객체는 생성이 가능
→ Constructor Injection(생성자 주입)은 객체가 생성될 때 필요한 모든 의존성을 생성자를 통해 주입 받기 때문에 의존성 없이는 객체 생성이 불가(안전한 이유, NULL 발생 가능성 적음)
→ Setter Injection(세터 주입)은 객체를 먼저 생성하고, 그 후 필요한 의존성을 세터 메서드(setter method)를 통해 주입
→ 객체가 생성된 후 의존성 주입이 되기 때문에 의존성 없이도 객체 생성이 가능 ( Null 포인트 예외 발생 가능성)
@Component
public class SomeClass {
private SomeDependency someDependency;
@Autowired
public void setSomeDependency(SomeDependency someDependency) {
this.someDependency = someDependency;
}
}
오랜만에 보니 또 새롭다...
그래도 다시 보니 조금은 더 이해 되고 또 다시 보니 또 조금은 더 이해가 되는 것 같기도?!ㅎㅎ
생성자가 뭔지, 단일 생성자가 뭔지도 몰랐는데 이정도면 발전 한 듯하다 캬캬 😋
📖 참고 자료