// MyClass7 은 MyClass8의 필드와 메소드를 사용하려한다
// 만약 MyClass8이 없으면 NullPintException이 난다
// 그래서 없으면 안되기 때문에 이걸 의존성이라고 한다.
예를 들어 @Controller에서는 @Service의 메소드와 필드를 사용하려고 한다.
만약 @Service의 메소드와 필드가 없다면 @Controller에서는 사용할게 없으니 NullPointException이 발생
그래서 @Controller에서는 @Service가 있어야 하기 때문에 @Controller가 @Service에 의존한다고 하는걸
의존성이라고 한다.
근데 이걸 안하면 직접 객체 만들어서 인스턴스화 시키고 해야하는 번거로움이 있지만
@Autowired를 하게되면 스프링이 대신 이걸 처리해준다
주입방법에는
생성자 주입, 메소드 주입이 있고
필드 주입도 가능하긴 하지만 권장하지 않는다.
생성자 주입에서 생성자가 여러개가 아닌 한개라면 @Autowired를 생략해도 된다.
@Component
@RequiredArgsConstructor // final 필드를 아규먼트로 받는 생성자 만들어주는 lombok 어노테이션
class MyClass15 {
// final을 작성하게되면 무조건 값을 한번 받아야 한다.
// 우리가 값을 받는 방법중 바로 받을 수 있는건 생성자를 통해 받을 수 있다.
// 불변성 주입이라고도함
private final MyClass16 field;
// @RequiredArgsConstructor 쓰면 자동으로 만들어줌
// public MyClass15(MyClass16 field) {
// this.field = field;
// }
public MyClass16 getField() {
return field;
}
}
최종 정리
Spring Framework에서의 DI(의존성 주입, Dependency Injection)는 객체가 필요로 하는 의존성을 외부에서 제공하는 패턴을 의미합니다. 이는 객체의 생성과 의존성 관리를 Spring 컨테이너가 맡게 되어, 개발자는 객체 간의 결합도를 낮추고, 유지보수 및 테스트가 용이한 코드를 작성할 수 있게 됩니다.
의존성 주입의 방식
- 생성자 주입(Constructor Injection): 객체 생성 시 생성자를 통해 의존성을 주입합니다.
- 세터 주입(Setter Injection): 객체 생성 후 세터 메서드를 통해 의존성을 주입합니다.
- 필드 주입(Field Injection): 리플렉션을 사용하여 직접 필드에 의존성을 주입합니다.
장점
- 낮은 결합도: 객체는 자신의 의존성을 생성하지 않고, 외부에서 제공받기 때문에 결합도가 낮아집니다. 이는 코드 재사용성과 유지보수성을 증가시킵니다.
- 유연한 코드: 의존성을 외부에서 주입받기 때문에 구성 변경이 용이합니다. 이를 통해 다양한 환경에 쉽게 적응할 수 있는 코드를 작성할 수 있습니다.
- 단위 테스트 용이성: 의존성을 외부에서 주입할 수 있기 때문에, 테스트 시 모의 객체(Mock)를 사용하여 테스트하기가 용이합니다.
단점
- 오버헤드 증가: 의존성 주입을 위한 추가적인 코드가 필요하며, 초기 학습 곡선이 가파를 수 있습니다.
- 런타임 오류: 의존성 주입이 잘못되었을 경우, 컴파일 타임이 아닌 런타임에 오류가 발생할 수 있습니다.
- 디버깅 어려움: DI를 사용할 때 발생하는 오류는 종종 추적하기 어려울 수 있습니다. 이는 의존성이 자동으로 주입되기 때문에 발생하는 문제입니다.
'Spring Boot' 카테고리의 다른 글
ResponseEntity - 응답코드, 응답본문, 응답헤더 작성 가능한 객체 (0) | 2023.10.25 |
---|---|
파일 첨부(전송, 받기) (0) | 2023.10.20 |
@Compnent (0) | 2023.10.17 |
@SpringBootApplication 동작원리 (0) | 2023.10.17 |
세션(session), 쿠키(cookie) (0) | 2023.09.26 |