Spring 의존관계 주입
@Autowired를 사용해 의존관계를 자동으로 주입받는 방법이다.
required 옵션 처리를 통해 자동 주입 대상이 없다면 호출이 되지 않게 처리 가능하다.
@Autowired를 사용할 때 빈이 중복이 될 경우 @Qualifier를 통해 추가 구분자를 붙여 주거나
@Primary를 사용해 빈의 우선순위를 줄 수 도 있다.
- 생성자 주입
- 수정자 주입
- 필드 주입
- 일반 메서드 주입
1. 생성자 주입
생성자를 통한 의존관계 주입 방법으로 생성자 호출 시점 1번만 호출되는 것이 보장된다.
불변, 필수 의존관계에 사용하는 방법
@Autowired를 사용해 주입하고 생성자가 1개라면 생략이 가능하다.
@Component
public class MyClass {
private final MyDependency dependency;
@Autowired
public MyClass(MyDependency dependency) {
this.dependency = dependency;
}
}
//생략 가능
@Component
public class MyClass {
private final MyDependency dependency;
public MyClass(MyDependency dependency) {
this.dependency = dependency;
}
}
1.1 Lombok 라이브러리를 통한 코드 최적화
생성자 주입을 사용할 경우 Lombok 라이브러리를 사용하여 코드를 간결하게 만들 수 있다.
Lombok 라이브러리의 @RequiredArgsConstructor 기능을 사용하게 되면 final로 선언된 필드를 모아 자동으로 생성자를 만들어 준다.
만들어진 생성자의 코드가 필드에는 노출이 되지 않기 때문에 코드가 간결해진다.
//Lombok
@Component
@RequiredArgsConstructor
public class MyClass {
private final MyDependency dependency;
}
1.2 Lombok 라이브러리 추가
Lombok 라이브러리 추가 방법
//build.gradle
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
dependencies{
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testCompileOnly 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'
}
- build.gradle 파일에 해당 코드를 추가
- lombok plugin 설치
- 설정 -> Annotation Processors 검색 -> Enable annotation processing 체크
2. 수정자 주입
setter라 불리는 필드값을 변경하는 수정자 메서드를 사용해 주입하는 방법이다.
선택, 변경 가능성이 있는 의존관계에서 사용한다.
@Component
public class MyClass {
private MyDependency dependency;
@Autowired
public void setDependency(MyDependency dependency) {
this.dependency = dependency;
}
}
@Autowired를 생성자가 아닌 setter 메서드에 붙여 사용한다.
생성자 주입처럼 딱 1번만 호출을 보장할 수 없어 불변성을 보장하기 어렵다.
3. 필드 주입
필드에 바로 주입을 받는 방식이다.
필드에 바로 주입을 받는 방식이라 코드가 매우 간결해지지만 DI 프레임워크에 의존이 강하고 외부에서 변경이 불가능해 테스트에 어려움이 있다.
@Component
public class MyClass {
@Autowired
private MyDependency dependency;
}
4. 일반 메서드 주입
말 그대로 일반 메서드를 통해 주입 받는 방식이다.
사용자가 정의한 메서드로 주입을 받는 다는것 뿐 수정자 주입과 크게 다를 게 없다.
@Component
public class MyClass {
private MyDependency myDependency;
private YourDependency yourDependency;
@Autowired
public void init(MyDependency myDependency, YourDependency yourDependency) {
this.myDependency = myDependency;
this.yourDependency = yourDependency;
}
}
생성자 주입을 권장하는 이유
- 클래스가 필요로 하는 모든 의존성을 명시적으로 나열 가능
- 한 번 생성된 객체는 더 이상 변경할 수 없는 불변성을 보장
- 스프링 컨테이너가 객체를 생성할 때 순환 참조를 방지
- 테스트 시 필요한 의존성을 직접 주입 가능하여 단위 테스트나 통합 테스트 용이
스프링 핵심 원리 - 기본편 강의 | 김영한 - 인프런 강의 내용 참고
'백엔드 > Spring' 카테고리의 다른 글
[Spring] 서블릿 & JSP MVC (0) | 2024.07.22 |
---|---|
[Spring] 자바 Servlet & JSP (3) | 2024.07.22 |
[Spring] 빈 스코프 (0) | 2024.07.12 |
[Spring] 컴포넌트 스캔 - Component Scan (0) | 2024.07.11 |
[Spring] 스프링 컨테이너 - Spring Container (0) | 2024.07.11 |