dependency injection : 의존성 주입
1. 의존성 주입이란
의존하고 있는 클래스의 객체를 멤버변수로 사용하는 것이다.
2. 의존이란
특정 클래스에 의지를 하고 있는 상태이다. 예를들면 "나"라는 클래스 안에 "손"이라는 클래스를 사용한다고 생각해보자. 아래와 같이 코드를 작성하면 "손"의 클래스가 변할 시 "나"의 클래스에 영향을 미친다.
class 나{
손 my손 = new 손();
}
class 손{
}
위와 같은 상황에서는 "나" 클래스가 "손" 클래스에 의존(의지)하고 있다고 말할 수 있다.
3. 왜 의존성 주입을 사용하는거지?
아래와 같이 "손"의 객체를 "나" 클래스의 멤버로 할당하면 "손" 클래스의 멤버를 맘대로 사용할 수 있으면서 "손" 클래스가 변경이 있어도 "나" 클래스에 영향을 주지 않는다.
class 나{
private 손 my손;
나(손 my손){
this.my손 = my손;
}
}
class 손{}
따라서 의존성 주입은 "의존할 클래스의 객체를 주입하는 것"이다.
여기서 포인트는 객체(인스턴스)로 준다는 것이다.
의존하고 있는 클래스의 객체를 "나"의 클래스에 멤버변수로 할당하는 것이다.
4. 의존성 주입시 final을 사용하는 이유는 뭘까?
코드의 통일성을 위해 해당 멤버변수가 참조하고 있는 객체를 변경하지 않게 하려는(불변성) 성질 때문이다.
final은 불변이다. 해당 클래스 변수에서는 변수가 참조하는 클래스를 변경할 수 없게 만든다. 그렇다면 왜 변경할 수 없게 만들까? 손이라는 클래스를 다른 손으로 할 수 있지 않나? 예를들어 손이아니라 모자라면 모자의 브랜드를 바꾸고 싶지 않을까?
개발자의 관점에서 보면 결코 그렇지 않다. 일단 루이비통의 모자를 쓰기로 했고 해당 모자를 계속 써야 코드의 흐름에 통일성이 유지되는 것인데 만약 루이비통이라고 객체를 선언했는데 구찌 모자를 참조하는 상황이 발생하면 이것은 잘못된 것이다. 코드도 하나의 언어이기 때문에 컨벤션같은 것이 존재하듯이 통일성을 유지하려는 노력 또한 중요하다. 그렇기 때문에, 불변성을 강조하는 것이고, 물론 특정상황에서는 참조를 변경할 수 있지만 굳이? 라는 생각이든다, 만약 다른 모자를 쓰고싶으면 의존성 주입하는 인스턴스를 하나 더 생성하면 될 일이다.
결론적으로, 코드의 통일성을 유지하기 위해 불변의 타입 지정자인 final을 의존성 주입할 멤버 변수 선언에 사용하는 것이다.
5. 의존성 주입의 장단점
가. 장점
첫번째로 단위 테스트가 쉬워진다. 왜냐하면 객체를 생성자로 할당해주기 때문에 직접 의존하지 않게 되고 의존하고 있는 클래스가 변경되어도 생성자 주입시 주입된 객체를 사용하기 때문에 영향을 받지 않게된다.
두번째로 애플리케이션을 쉽게 추론할 수 있다. 불변으로 인한 일관성(통일성)을 보장하기 때문에 코드 추론이 용이해진다.
결합도 감소, 테스트 용이, 코드추론 용이, 유연한 구조
나. 단점
객체의 생성 지점을 파악하기 어렵다. 왜냐하면 생성자로 객체를 주입하기 때문이다.
6. 의존성 주입 구현 방법
의존성 주입 원칙이 존재한다고? 아래 포스터에서 다뤄보겠다.
Dependency Injection Principle
1. 의존성 주입이란 Dependency Injectiondependency injection : 의존성 주입1. 의존성 주입이란의존하고 있는 클래스의 객체를 멤버변수로 사용하는 것이다. 2. 의존이란특정 클래스에 의지를 하고 있는 상
halo-server.tistory.com