-
[디자인 패턴] 의존성 주입 알아보기프로그래밍/이론 2021. 10. 18. 15:57
디자인 패턴 중 생성 패턴의 종류인 의존성 주입(Dependency Injection)은 무엇일까? 먼저 의존성은 무엇일까?
public class Printer3D { private Nylon nylon; public Printer3D() { this.nylon = new Nylon(); } public static void main(String[] args) { new Printer3D(); } } class Nylon {}
다음과 같이 Printer3D클래스에서 Nylon 클래스를 이용할 때 Printer3D가 Nylon에 의존성을 가진다고 한다. Printer3D 클래스는 Nylon 클래스에 의존하기 때문에 Nylon 클래스에 맞춰 작동해야 한다. 의존을 강하게 할수록 좋지 않다.
만약 3D프린터가 다른 재질을 사용하려고 한다면 생성자와 필드를 바꿔주어야 한다. 즉, Printer3D 클래스의 재사용성이 낮아진다. 또 Nylon 클래스가 코드 수정을 했다면, Printer3D 클래스도 맞춰 수정해야 한다. 그럼 어떻게 해야 좋은 코드일까?
public class Printer3D { private Filament filament; public Printer3D(Filament filament) { this.filament = filament; } public static void main(String[] args) { new Printer3D(new Nylon()); new Printer3D(new PLA()); } } class Filament {} class Nylon extends Filament {} class PLA extends Filament {}
이와 같이 생성자를 통해 의존성을 주입하고, 결합도(coupling)를 약하게 만든다. 이를 의존성 주입이라고 한다. 의존성 주입을 이점이 있다.
- 의존 관계 설정이 컴파일시가 아닌 실행할 때 이루어져 모듈들 간의 결합도를 낮출 수 있다.
- 코드 재사용을 높여 작성된 모듈을 여러 곳에서 소스코드의 수정 없이 사용할 수 있다.
- unit test의 편의성을 높여준다. (디버깅이 쉬워진다.)
의존성을 주입하는 패턴에는 3가지로 정리할 수 있다.
생성자를 이용하여 필요한 의존성을 주입하는 방법이다.
public class Printer3D { private final Filament filament; public Printer3D(Filament filament) { this.filament = filament; } }
생성자를 이용하여 의존성을 받으면 객체를 생성할 때 호출 되는 것을 보장하며, 객체가 반드시 의존성 주입이 필요할 때, 그 의존성이 변할 필요가 없을 때(불변성을 보장할 때) 쓰인다. 또 필드에 final을 사용할 수 있다. final 키워드에 대한 자세한 내용은 다음에 포스팅하겠다.
Setter 메서드를 이용하여 필요한 의존성을 주입하는 방법이다.
public class Printer3D { private Filament filament; public void setFilament(Filament filament) { this.filament = filament; } }
의존받는 객체가 변경될 필요가 있을 때 Setter 메서드를 이용한다. 이 같은 경우 객체에 이미 의존성이 부여되어 있는 경우도 있다.
인터페이스를 이용하여 필요한 의존성을 주입하는 방법이다.
interface Input { public void setFilament(Filament filament); } public class Printer3D implements Input { private Filament filament; @Override public void setFilament(Filament filament) { this.filament = filament; } }
인터페이스를 이용하여 메서드에 의존성 주입이 필요한 메서드를 명시해주고, 상속받은 클래스가 구현을 해주는 방법이다.
https://ko.wikipedia.org/wiki/%EC%9D%98%EC%A1%B4%EC%84%B1_%EC%A3%BC%EC%9E%85
'프로그래밍 > 이론' 카테고리의 다른 글
[디자인 패턴] 싱글톤 패턴 (0) 2022.01.09 [디자인 패턴] 디자인 패턴의 정의 (0) 2021.10.14