본문 바로가기
FrameWork/Spring

Spring DI(Dependency Injection)

by titlejjk 2023. 6. 19.

의존성 주입(DI Dependency Injection)은 개체가 생성자 인수, 팩터리 메소드에 대한 인수 또는 개체 인스턴스가 생성된 후 개체 인스턴스에 설정된 속성을 통해서만 의존성(함께 작동하는 다른개체)을 정의하는 프로세스이다.

 

더보기

의존성이란?
한 객체가 다른 객체를 사용하는 상황을 말하며, 일반적으로 한 객체가 다른 객체를 생성하거나 직접 의존하는 경우를 말한다. 예를 들어, 클래스 A가 클래스 B를 사용한다면 A는 B에 대한 의존성을 갖게 된다.

 

DI는 의존성을 외부에서 제공받을 것을 말하며, 객체가 필요로 하는 다른 객체를 직접 생성하지 않고, 외부에서 생성된 객체를 주입받아 사용하는 방식이다. 이를 통해 객체 간의 결합도를 낮추고 유연하게 하며 효율적인 코드를 작성할 수 있다.

코드가 더욱 간단하고 깔끔해지며 개체에 의존성이 제공될 때 분리가 더 효과적이다. 개체는 의존성을 조회하지 않으며 의존성의 위치나 클래스를 알지 못한다. 이로 인해 의존성이 인터페이스나 추상 기본 클래스에 있을 때 테스트 하기가 쉬워지며 모의 구현 및 단위 테스트에 좋다.

DI는 생성자 기반 의존성 주입과 세터 기반 의존성 주입의 두 가지 주요 형태가 존재한다.

 

생성자 기반 의존성 주입(Constructor Injection)

생성자 기반 DI는 각각 의존성을 나타내는 여러 인수를 사용하여 생성자를 호출하는 컨테이너에 의해 주입하는 방식이다. 빈을 구성하기 위해 클래스의 생성자를 정의하고, 의존하는 객체를 매개변수로 받아 필드에 저장한다.

public class MyClass {
    private Dependency dependency;

    public MyClass(Dependency dependency) {
        this.dependency = dependency;
    }
}

 

세터 기반 의존성 주입(Setter Injection)

의존성을 주입하기 위해 세터 메소드를 사용하는 방식이다. 클래스에 의존하는 객체를 설정하기 위한 세터 메소드를 정의하고, 이를 통해 외부에서 객체를 주입한다.

public class MyClass{
	private Dependency dependency;
    
    public void setDependency(Dependency dependency){
    	this.dependency = dependencyl;
    }
}

일반적으로 클래스에 멤버 변수(필드)가 있고, 해당 필드에 접근하고 값을 설정하는 메소드를 세터메소드라고 한다. 이걸 이용하여 의존성을 주입하는건데, MyClass는 Dependency객체를 의존한다. Dependency 객체를 주입받기 위해 setDependency()라는 세터 메소드를 정의했다. 이 메소드는 Dependency객체를 매개변수로 받아 this.dependency에 할당한다.

의존성을 주입할 때는 다음과 같이 MyClass 객체를 생성한 후, setDependency()메소도를 호출하여 의존하는 개체를 주입한다.

MyClass myClass = new MyClass();
Dependency dependency = new Dependency();

myClass.setDependency(dependency);

위 코드에서는 MyClass 객체를 생성한 후 Dependency객체를 생성하고 setDependency()메소드를 호출하여 MyClass 객체에 Dependency객체를 주입했다. 위의 코드 예제는 DI가 적용되지 않은 의존하는 객체를 직접생성하여 사용하는 방식인 직접 의존이다. 

 

아래 예제에서는 의존성을 주입받아 doSomething()메소드에서 dependency를 사용하여 메소드를 사용할 수 있다.

public class MyClass {
    private Dependency dependency;

    public void setDependency(Dependency dependency) {
        this.dependency = dependency;
    }

    public void doSomething() {
        // dependency를 사용하여 작업을 수행
    }
}

세터주입은 객체의 의존성을 설정하기 위해 명시적으로 세터 메소드를 호출해야한다는 점에서 명시적인 주입방식이다. 이 방식을 통해 외부에서 의존성을 주입할수 있으며, 필요에 따라 의존성을 변경하거나 교체하는 작업도 쉽게 수행 가능하다.

 

필드 주입(Field Injection)
의존성을 주입하기 위해 필드를 사용하는 방식이다. 클래스의 필드에 직접 의존하는 객체를 주입한다. 이 방식은 주로 Spring의 @Autowired 어노테이션을 이용한다.

public class MyClass {
    @Autowired
    private Dependency dependency;
}

 

 

DI를 사용하려면 Spring Framework에서 제공하는 IoC컨테이너를 사용해야 한다. IoC컨테이너는 객체의 생명주기를 관리하고, 객체들 간의 의존성을 해결하여 필요한 객체를 주입해준다.

DI를 통해 객체들은 느슨하게 결합되며, 재사용성과 테스트 용이성이 증가한다. 또한, DI는 AOP(Aspect-Orented Programming)와 함께 사용되어 보안, 로깅, 트랜잭션관리 등과 같은 부가적인 기능을 쉽게 구현가능하다.

'FrameWork > Spring' 카테고리의 다른 글

AOP란?🧑‍💻  (0) 2023.07.01
Spring Interceptor  (0) 2023.06.23
MyBatis  (0) 2023.06.19
@RequestMapping  (0) 2023.06.16
@ResponseBody  (0) 2023.06.16

댓글