DI (Dependency Injection)

wkdtmddus·2023년 7월 25일
0
post-custom-banner

주입은 클래스 간의 의존성을 외부에서 주입하는 개념입니다.
클래스가 다른 클래스에 의존해야 하는 경우, 해당 의존성을 외부에서 주입 받는 것을 의미합니다.

클래스 간의 의존성은 객체를 생성하거나 사용할 때 발생합니다.
예를 들어, 클래스 A가 클래스 B에 의존하는 경우, 클래스 A를 사용하기 위해 클래스 B의 인스턴스를 생성하거나 가져와야 합니다.
이때, 클래스 A는 클래스 B의 인스턴스를 직접 생성하지 않고, 외부에서 주입받아 사용하는 것이 주입입니다.


스프링 프레임워크에서는 주로 의존성 주입을 위해 다음과 같은 방법을 사용합니다.

  1. 생성자 주입(Constructor Injection) :

    생성자 주입은 클래스의 생성자를 통해 의존성을 주입하는 방식입니다.
    주입하려는 의존성을 필수적으로 만들어야 하는 경우에 주로 사용됩니다.
    클래스의 필드를 final로 선언하고, 생성자에서 해당 필드를 초기화하는 방식으로 구현합니다.
    생성자 주입은 클래스의 인스턴스가 생성될 때 의존성이 주입되므로, 클래스의 의존성이 변경되지 않는 불변성을 보장할 수 있습니다.
public class MyClass {
	private final OtherClass otherClass;

	public MyClass(OtherClass otherClass) {
		this.otherClass = otherClass;
	}

	// otherClass 사용하는 메서드 등...
}
  1. 필드 주입(Field Injection) :

    필드 주입은 클래스의 필드에 '@Autowired' 어노테이션을 사용하여 의존성을 주입하는 방식입니다.
    주로 Spring 프레임워크에서 사용되며, 간결하고 편리한 방법으로 의존성을 주입할 수 있습니다.
    하지만 필드 주입은 클래스의 변경이 어렵고 테스트하기 어려운 단점이 있습니다.
    따라서, 필드 주입보다는 생성자 주입을 권장하는 경우가 많습니다.
public class MyClass {
	@Autowired
	private OtherClass otherClass;

	// otherClass 사용하는 메서드 등...
}
  1. 세터 주입(Setter Injection) :

    세터 주입은 클래스의 세터 메서드를 통해 의존성을 주입하는 방식입니다.
    필드 주입과 비슷하지만, 필드를 직접 초기화하는 대신 세터 메서드를 통해 의존성을 설정합니다.
    필요한 의존성이 여러 개일 때 편리하게 사용할 수 있습니다.
    그러나 세터 주입 역시 필드 주입과 마찬가지로 클래스의 변경이 어렵고 테스트하기 어려운 단점이 있습니다.
    생성자 주입과 비교했을 때 의존성이 누락될 수 있는 가능성도 있으므로 주의해야 합니다.
public class MyClass {
	private OtherClass otherClass;

	@Autowired
	public void setOtherClass(OtherClass otherClass) {
		this.otherClass = otherClass;
	}

	// otherClass 사용하는 메서드 등...
}

의존성 주입을 통해 클래스 간의 결합도를 낮추고 유연성과 테스트 용이성을 높일 수 있습니다.
또한, 코드의 변경 없이 다양한 의존성을 주입하여 클래스의 동작을 다양화 할 수 있습니다
각각의 주입 방식에는 장단점이 있으며, 사용하는 상황에 따라 적절한 방식을 선택해야 합니다.
생성자 주입을 사용하여 의존성을 불변성으로 유지하고, 필요한 의존성을 명시적으로 표현하는 것이 좋습니다.
또한, 필드 주입과 세터 주입은 특별한 상황이 아니라면 사용을 자제하고 생성자 주입을 선호하는 것이 권장됩니다.

post-custom-banner

1개의 댓글

comment-user-thumbnail
2023년 7월 25일

좋은 글 감사합니다. 자주 올게요 :)

답글 달기