의존성 주입: Difference between revisions
From IT Wiki
(새 문서: 분류:소프트웨어 공학분류:프로그래밍 ;Dependency Injection == 의존성 == * 아래는 객체지향 프로그래밍에서 아주 흔히 쓰이는 형태의 클...) |
No edit summary |
||
Line 1: | Line 1: | ||
[[분류:소프트웨어 공학]][[분류:프로그래밍]] | [[분류:소프트웨어 공학]] | ||
[[분류:프로그래밍]] | |||
;Dependency Injection | ;Dependency Injection | ||
== 의존성 == | ==의존성== | ||
* 아래는 객체지향 프로그래밍에서 아주 흔히 쓰이는 형태의 클래스 및 메소드의 구현 예이다. | |||
*아래는 객체지향 프로그래밍에서 아주 흔히 쓰이는 형태의 클래스 및 메소드의 구현 예이다. | |||
<pre> | <pre> | ||
public class TestClass { | public class TestClass { | ||
Line 13: | Line 16: | ||
} | } | ||
</pre> | </pre> | ||
== 의존성 문제 == | *TestClass의 testMethod에선 내부적으로 OtherClass라는 클래스를 사용한다. | ||
* 의존성은 강한 [[결합도]]를 야기한다. | **OtherClass의 인스턴스에 Data를 설정하고 Data를 불러온다. | ||
* 의존성은 모듈의 수정을 어렵게 한다. | *만약 OtherClass가 변경되어 더 이상 setData 라는 메서드를 지원하지 않는다면 에러가 발생하게 된다. | ||
* 의존성은 테스트를 어렵게 한다. | *'''이때 TestClass는 OtherClass에 의존성이 있다고 표현한다.''' | ||
**OtherClass를 TestClass의 '''[[의존성|의존성(Dependancy)]]'''이라고 표현하기도 한다. | |||
==의존성 문제== | |||
*의존성은 강한 [[결합도]]를 야기한다. | |||
*의존성은 모듈의 수정을 어렵게 한다. | |||
*의존성은 테스트를 어렵게 한다. | |||
== 의존성 주입의 장점 == | |||
'''클라이언트 관점''' | |||
{| class="wikitable" | |||
!구분 | |||
!설명 | |||
|- | |||
|종속성의 감소 | |||
(Reduced Dependencies) | |||
| | |||
* 컴포넌트의 종속성이 감소하면 변경에 민감하지 않게 됨 | |||
|- | |||
|결합도 감소 | |||
(Reduced coupling) | |||
| | |||
* 결합도를 낮추어 주면서 유연성과 확장성을 향상 | |||
|- | |||
|재사용성 증가 | |||
(More Reusable Code) | |||
| | |||
* 인터페이스의 구현 변경 필요한 경우, 코드 변경 없이 해당 구현을 사용하도록 컴포넌트 구성 가능 | |||
|} | |||
'''코드 관점''' | |||
{| class="wikitable" | |||
!구분 | |||
!설명 | |||
|- | |||
|테스트 케이스 생성 용이 | |||
(More Testable Code) | |||
| | |||
* 실제 구현의 테스트로 사용되는 Mock 객체 활용 | |||
* 의존성을 컴포넌트에 주입할 수 있는 경우 단위 테스트 편의성을 높여준다 | |||
|- | |||
|코드 가독성 향상 | |||
(More Readable Code) | |||
| | |||
* 컴포넌트의 종속성을 보다 쉽게 파악할 수 있으므로 코드를 쉽게 읽을 수 있다. | |||
|- | |||
|코드 단순화 | |||
Simplify code) | |||
| | |||
* 의존 관계 제거와 사용 관점의 단순화로 프로그램 코드 전체의 단순화 | |||
|} | |||
== 의존성 주입 | ==의존성 주입 방법== | ||
= | {| class="wikitable" | ||
!방법 | |||
!설명 | |||
|- | |||
|생성자 사용 | |||
(Constructor Injection) | |||
| | |||
* 필요한 의존성을 모두 포함하는 클래스의 생성자를 만들고 그 생성자를 통한 의존성을 주입 | |||
|- | |||
|세터(Setter)를 통한 주입 | |||
(Method(Setter) Injection) | |||
| | |||
* 의존성을 입력받는 Setter 메소드를 만들고 이를 통한 의존성을 주입 | |||
|- | |||
|인터페이스(Interface)를 통한 주입 | |||
(Field Injection) | |||
| | |||
* 의존성을 주입하는 함수를 포함한 인터페이스를 작성 | |||
* 이 인터페이스를 구현하도록 함으로써 실행 시에 이를 통하여 의존성을 주입 | |||
|} |
Revision as of 15:37, 3 August 2021
- Dependency Injection
의존성
- 아래는 객체지향 프로그래밍에서 아주 흔히 쓰이는 형태의 클래스 및 메소드의 구현 예이다.
public class TestClass { public String testMethod() { OtherClass instance = new Instance(); instance.setData('a'); return instance.getData(); } }
- TestClass의 testMethod에선 내부적으로 OtherClass라는 클래스를 사용한다.
- OtherClass의 인스턴스에 Data를 설정하고 Data를 불러온다.
- 만약 OtherClass가 변경되어 더 이상 setData 라는 메서드를 지원하지 않는다면 에러가 발생하게 된다.
- 이때 TestClass는 OtherClass에 의존성이 있다고 표현한다.
- OtherClass를 TestClass의 의존성(Dependancy)이라고 표현하기도 한다.
의존성 문제
- 의존성은 강한 결합도를 야기한다.
- 의존성은 모듈의 수정을 어렵게 한다.
- 의존성은 테스트를 어렵게 한다.
의존성 주입의 장점
클라이언트 관점
구분 | 설명 |
---|---|
종속성의 감소
(Reduced Dependencies) |
|
결합도 감소
(Reduced coupling) |
|
재사용성 증가
(More Reusable Code) |
|
코드 관점
구분 | 설명 |
---|---|
테스트 케이스 생성 용이
(More Testable Code) |
|
코드 가독성 향상
(More Readable Code) |
|
코드 단순화
Simplify code) |
|
의존성 주입 방법
방법 | 설명 |
---|---|
생성자 사용
(Constructor Injection) |
|
세터(Setter)를 통한 주입
(Method(Setter) Injection) |
|
인터페이스(Interface)를 통한 주입
(Field Injection) |
|