의존성 주입은 객체지향 프로그래밍을 하다보면 자주 듣게 되는 용어이다.
이번엔 의존성, 의존성 주입 이 무엇인지 그리고 왜 필요한지를 간단하게 알아보자
[의존성]
<예제 1>
class Test {
private Work work;
public Test() {
this.work = new Work();
}
public runTest() {
this.work.~~~();
...
}
}
위 예제 1을 보면 Test 클래스에서 runTest 메서드가 호출 되기 위해서는 Work 라는 클래스를 필요로 한다.
이것을 Test 클래스는 Work 클래스의 의존성을 가진다 라고 한다.
※ Work 라는 클래스 없이 runTest메서드가 작동을 할 수 없는 상태이다.
예제 1 처럼 코드를 작성하면 재활용하기 힘들고 Work클래스가 수정이 되면 Test클래스도 수정을 해야한다.
상당히 귀찮고 작은 실수라도 있다면 정상적으로 작동을 하지 못한다.
※ 이런 상황을 결합도(coupling)가 높은 상태 라고 말한다.
[의존성 주입(Dependency Injection)을 해야 하는 이유]
의존성 주입을 통해 아래와 같은 이점을 얻을 수 있다.
1. 유닛 테스트가 용이하다.
2. 코드 재사용성을 높여준다.
3. 객체 - 객체 간의 의존성을 낮추거나 없엘 수 있다.
4. 객체 - 객체 간의 결합도가 낮아지면서 유연하게 코드를 작성 할 수 있다.
의존성 주입을 통하지 않고 Work 클래스의 상속을 받은 Read 나 Write클래스를 사용하려면 직접 수정을 해야한다.
아래 예제 2 를 통해 알아보자
<예제 2>
class Read extends Work { ... }
class Write extends Work { ... }
class Test {
private Work work;
public Test() {
this.work = new Read(); // 직접 수정
this.work = new Write(); // 직접 수정
}
...
}
위 예제 2에서 Work 클래스를 사용하는 클래스가 10개라면 그 중 Read가 필요한 클래스가 있으면
직접 수정을 해주어야 한다. 이렇게 귀찮음을 의존성 주입(Dependency Injection)을 통해 아래 예제 3처럼 할 수 있다.
<예제 3>
class Test {
private Work work;
public Test( Work work ) {
this.work = work;
}
public runTest() {
this.work.~~~();
...
}
}
예제 3 처럼 필요한 클래스를 직접 생성 하는 것이 아닌, 주입을 해줌으로써 객체 간의 결합도를 줄이고 좀 더 유연한 코드를 작성 할 수 있게 된다.
<요약>
- 의존성 주입은 필요한 객체를 직접 생성하는 것이 아닌 외부로 부터 필요한 객체를 받아서 사용하는 것이다.
- 의존성 주입을 통해 객체간의 결합도를 줄이고 코드의 재사용성을 높여준다.
'Java > Spring' 카테고리의 다른 글
[Spring] @Controller / @ResponseBody / @RestController 를 알아보자 (0) | 2022.01.04 |
---|---|
[Spring] Spring은 무엇인가 (0) | 2022.01.04 |