의존관계 주입
(Dependency Injection)
객체 지향 프로그래밍에서 사용되는 디자인 패턴 중의 하나로,
클래스 간의 결합도를 낮추기 위해 사용된다.
Ioc의 구현 방법 중 하나로
의존관계 주입은 객체가 아닌 외부에서 의존 객체를 생성하고,
생성자, 메서드, 필드 등을 통해 주입하는 방식이다.
A class -1
public class A {
public void method() {
B b = new B();
// B 클래스의 메서드를 호출
b.play();
}
}
B class
public class B {
public void play() {
System.out.println("B에서 플레이가 되고있습니다.");
}
}
"A class"에서 "B class"를 인스턴스화하여 호출하고 있으므로,
"A class"는 "B class"에 의존하고 있다고 할 수 있다.
만약 "B 클래스"가 변경이 된다면 "A 클래스"도 변경이 되어야 하므로,
유지보수성이 떨어지는 코드가 될 수 또 있다.
이러한 문제를 해결하고자 의존성 주입(DI 패턴)을 사용하여
해결할 수 있다.
DI를 활용하여 A class와 B class의 의존성을 줄여보기
A class -2
public class A {
private B b;
//생성자를 통한 의존성 주입
public A(B b) {
this.b = b;
}
public void method() {
b.play();
}
}
"A class"를 위의 코드와 같이
외부의 객체가 생성자를 통하여 받아오게 되면 의존성은 줄어들게 된다.
이전 "A class -1"과의 차이점은
생성자를 통해 "A class" 내부에서 인스턴스를 만든 것과는 달리,
"A class -2"는 직접 객체를 생성하지 않고,
외부에서 생성된 객체를 생성자를 통하여 주입한 형태가
되었다는 것이다.
"B class"를 상속받은 "C class"
public class C extends B {
@Override
public play() {
System.out.println("B에서 업그레이드 된 C 클래스를 써보자!");
}
}
Main class
public class Main {
public static void main(String[] args) {
B b = new B();
//B b = new C();
//B클래스와 C클래스를 변경을 해도 A 클래스의 코드는 변하지 않아도 된다.
A a = new A(b);
}
}
"A class"의 외부로부터 생성된 객체를 주입받았기 때문에
"B class"가 "C class"로 변경하거나,
요구에 따라 "C class"에서 "B class"로 변경하여도,
"A class"의 코드는 변경하지 않아도 문제가 없다.
위의 예시처럼 DI 패턴을 활용하면
유지보수와 재사용성에 매우 이점이 있다.
DI 패턴의 장점
1. 유연성
객체 간의 결합도가 낮아지고, 코드를 모듈화 하기 쉬워진다.
따라서, 유지보수와 확장이 더 쉬워지며, 코드의 재사용성도 좋아진다.
2. 테스트 용이성
의존하는 객체를 모의객체(Mock)로 대체하면 객체만 변경하면 되므로
테스트 코드 작성과 실행이 더 쉬워진다.
3. 코드 가독성 향상
객체 생성과 의존성 주입이 명시적으로 구분되어 코드의 가독성이 향상된다.
4. 결합도 감소
의존하는 객체를 인터페이스 형태로 선언하고, DI를 사용하여 의존하는 객체를
주입하면, 코드를 수정하지 않고도 의존하는 객체를 교체할 수 있다.
이를 통해 유지보수성과 확장성이 높아진다.
'자바 탐구' 카테고리의 다른 글
스프링) Bean (0) | 2023.04.23 |
---|---|
스프링) 제어의 역전(Inversion of Control) (0) | 2023.04.23 |
스프링 부트) Dependency : Spring Boot DevTools (0) | 2023.04.21 |
인텔리제이) FAILURE : Build failed with an exception. (0) | 2023.04.21 |
JWT) JWT 사용해보기 (0) | 2023.04.19 |