의존성 주입: Difference between revisions

From IT위키
No edit summary
No edit summary
 
Line 29: Line 29:
*의존성은 테스트를 어렵게 한다.
*의존성은 테스트를 어렵게 한다.


== 의존성 주입의 장점 ==
==의존성 주입의 장점==
'''클라이언트 관점'''
'''클라이언트 관점'''
{| class="wikitable"
{| class="wikitable"
Line 38: Line 38:
(Reduced Dependencies)
(Reduced Dependencies)
|
|
* 컴포넌트의 종속성이 감소하면 변경에 민감하지 않게 됨
*컴포넌트의 종속성이 감소하면 변경에 민감하지 않게 됨
|-
|-
|결합도 감소
|결합도 감소
(Reduced coupling)
(Reduced coupling)
|
|
* 결합도를 낮추어 주면서 유연성과 확장성을 향상
*결합도를 낮추어 주면서 유연성과 확장성을 향상
|-
|-
|재사용성 증가
|재사용성 증가
(More Reusable Code)
(More Reusable Code)
|
|
* 인터페이스의 구현 변경 필요한 경우, 코드 변경 없이 해당 구현을 사용하도록 컴포넌트 구성 가능
*인터페이스의 구현 변경 필요한 경우, 코드 변경 없이 해당 구현을 사용하도록 컴포넌트 구성 가능
|}
|}
'''코드 관점'''
'''코드 관점'''
Line 58: Line 58:
(More Testable Code)
(More Testable Code)
|
|
* 실제 구현의 테스트로 사용되는 Mock 객체 활용
*실제 구현의 테스트로 사용되는 Mock 객체 활용


* 의존성을 컴포넌트에 주입할 수 있는 경우 단위 테스트 편의성을 높여준다
*의존성을 컴포넌트에 주입할 수 있는 경우 단위 테스트 편의성을 높여준다
|-
|-
|코드 가독성 향상
|코드 가독성 향상
(More Readable Code)
(More Readable Code)
|
|
* 컴포넌트의 종속성을 보다 쉽게 파악할 수 있으므로 코드를 쉽게 읽을 수 있다.
*컴포넌트의 종속성을 보다 쉽게 파악할 수 있으므로 코드를 쉽게 읽을 수 있다.
|-
|-
|코드 단순화  
|코드 단순화  
Simplify code)
Simplify code)
|
|
* 의존 관계 제거와 사용 관점의 단순화로 프로그램 코드 전체의 단순화
*의존 관계 제거와 사용 관점의 단순화로 프로그램 코드 전체의 단순화
|}
|}


Line 81: Line 81:
(Constructor Injection)
(Constructor Injection)
|
|
* 필요한 의존성을 모두 포함하는 클래스의 생성자를 만들고 그 생성자를 통한 의존성을 주입
*필요한 의존성을 모두 포함하는 클래스의 생성자를 만들고 그 생성자를 통한 의존성을 주입
|-
|-
|세터(Setter)를 통한 주입
|세터(Setter)를 통한 주입
(Method(Setter) Injection)
(Method(Setter) Injection)
|
|
* 의존성을 입력받는 Setter 메소드를 만들고 이를 통한 의존성을 주입
*의존성을 입력받는 Setter 메소드를 만들고 이를 통한 의존성을 주입
|-
|-
|인터페이스(Interface)를 통한 주입
|인터페이스(Interface)를 통한 주입
(Field Injection)
(Field Injection)
|
|
* 의존성을 주입하는 함수를 포함한 인터페이스를 작성
*의존성을 주입하는 함수를 포함한 인터페이스를 작성
* 이 인터페이스를 구현하도록 함으로써 실행 시에 이를 통하여 의존성을 주입
*이 인터페이스를 구현하도록 함으로써 실행 시에 이를 통하여 의존성을 주입
|}
|}
== 참고 문헌 ==
* 정보관리기술사 123회 하나둘셋 동기회 기출풀이집

Latest revision as of 15:38, 3 August 2021

분류:소프트웨어 공학 분류:프로그래밍

Dependency Injection

의존성[edit | edit source]

  • 아래는 객체지향 프로그래밍에서 아주 흔히 쓰이는 형태의 클래스 및 메소드의 구현 예이다.
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에 의존성이 있다고 표현한다.

의존성 문제[edit | edit source]

  • 의존성은 강한 결합도를 야기한다.
  • 의존성은 모듈의 수정을 어렵게 한다.
  • 의존성은 테스트를 어렵게 한다.

의존성 주입의 장점[edit | edit source]

클라이언트 관점

구분 설명
종속성의 감소

(Reduced Dependencies)

  • 컴포넌트의 종속성이 감소하면 변경에 민감하지 않게 됨
결합도 감소

(Reduced coupling)

  • 결합도를 낮추어 주면서 유연성과 확장성을 향상
재사용성 증가

(More Reusable Code)

  • 인터페이스의 구현 변경 필요한 경우, 코드 변경 없이 해당 구현을 사용하도록 컴포넌트 구성 가능

코드 관점

구분 설명
테스트 케이스 생성 용이

(More Testable Code)

  • 실제 구현의 테스트로 사용되는 Mock 객체 활용
  • 의존성을 컴포넌트에 주입할 수 있는 경우 단위 테스트 편의성을 높여준다
코드 가독성 향상

(More Readable Code)

  • 컴포넌트의 종속성을 보다 쉽게 파악할 수 있으므로 코드를 쉽게 읽을 수 있다.
코드 단순화

Simplify code)

  • 의존 관계 제거와 사용 관점의 단순화로 프로그램 코드 전체의 단순화

의존성 주입 방법[edit | edit source]

방법 설명
생성자 사용

(Constructor Injection)

  • 필요한 의존성을 모두 포함하는 클래스의 생성자를 만들고 그 생성자를 통한 의존성을 주입
세터(Setter)를 통한 주입

(Method(Setter) Injection)

  • 의존성을 입력받는 Setter 메소드를 만들고 이를 통한 의존성을 주입
인터페이스(Interface)를 통한 주입

(Field Injection)

  • 의존성을 주입하는 함수를 포함한 인터페이스를 작성
  • 이 인터페이스를 구현하도록 함으로써 실행 시에 이를 통하여 의존성을 주입

참고 문헌[edit | edit source]

  • 정보관리기술사 123회 하나둘셋 동기회 기출풀이집