백엔드/Spring

[Spring] 의존관계 주입

kwang2134 2024. 7. 12. 17:47
728x90

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'
    
}

 

  1.  build.gradle 파일에 해당 코드를 추가
  2. lombok plugin 설치
  3. 설정 -> 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;
    }
}

생성자 주입을 권장하는 이유

  • 클래스가 필요로 하는 모든 의존성을 명시적으로 나열 가능
  • 한 번 생성된 객체는 더 이상 변경할 수 없는 불변성을 보장
  • 스프링 컨테이너가 객체를 생성할 때 순환 참조를 방지
  • 테스트 시 필요한 의존성을 직접 주입 가능하여 단위 테스트나 통합 테스트 용이

스프링 핵심 원리 - 기본편 강의 | 김영한 - 인프런 강의 내용 참고

728x90

'백엔드 > 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