의존관계 주입의 응용
런타임 시에 사용 의존관계를 맺을 오브젝트를 주입해준다는 DI 기술의 장점은 무엇?
오브젝트 팩토리가 바로 이 DI방식을 구현한 것이니, 앞서 설명한 모든 객체지향 설계와 프로그래밍의 원칙을 따랐을 때 얻을 수 있는 장점이 그대로 DI 기술에도 적용될 것이다.
코드에는 런타임 클래스에 대한 의존관계가 나타나지 않고, 인터페이스를 통해 결합도가 낮은 코드를 만들므로, 다른 책임을 가진 사용 의존관계에 있는 대상이 바뀌거나 변경되더라도 자신은 영향을 받지 않으며, 변경을 통한 다양한 확장 방법에는 자유롭다는게 지금까지 설명한 장점이었다.
D사와 N사에 UserDao의 코드를 판매하는 경우가 아니더라도 UsrDao와 ConnectionMaker 사이에 적용된 DI는 여러가지 방법으로 유용하게 활용될수 있다.
스프링이 제공하는 기능의 99%가 DI의 혜택을이용하고 있다. DI 없는 스프링도 없다. 그만큼 DI를 활용할 방법은 다양하다.
UserDao가 ConnectionMaker라는 인터페이스에만 의존하고 있다는 건, ConnectionMaker를 구현하기만 하고 있따면 어떤 오브젝트든지 사용할 수 있다는 뜻이다.
기능 구현의 교환
실제 운영에 사용할 데이터베이스는 매우 중요한 자원이다.
평상시에도 항상 부하를 많이 받고 있어서 개발 중에는 저대 사용하지 말아야 한다.
대신 개발중에 개발자 PC에 설치한 로컬 DB로 사용해야 한다고 해보자.
그리고 개발이 진행되다가 어느 시점이 되면 지금까지 개발한 것을 그대로 운영서버로 배치해서 사용할 것이다.
그런데 만약 DI방식을 적용하지 않았다고 해보자.
개발중에 로컬 DB를 사용하도록 해야 하니 로컬 DB에 대한 연결 기능이 있는 LocalDBConnectionMaker라는 클래스를 만들고, 모든 DAO에서 이 클래스의 오브젝트를 매번 생성해서 사용하게 했을 것이다.
그런데 서버에 배포할 때는 다시 서버가 제공하는 특별한 DB 연결 클래스를 사용해야 한다.
DI를 안햇으니 모든 DAO는 코드에서 이미 클래스인 LocalDBConnectionMaker에 의존하고 있다.
new LocalDBConnectionMaker() 라는 코드가 모든 DAO에 들어있을 것이다.
이를 서버에 배치하는 시점에서 운영서버에서 DB에서 연결할 때 필요한 ProductionDBConnectionMaker라는 클래스로 변경해줘야 한다.
DAO가 100개라면 최소한 100군데의 코드를 수정해야 한다.
하나라도 빼먹거나 잘못 고치면 서버에서 오류가 발생할 것이다.
그리고 다시 개발을 더 진행하려고 한다면 DAO코드를 LocalDBConnectionMaker를 사용하도록 수정해야 한다.
반면에 DI 방식을 적용해서 만들면 모든 DAO는 생성 시점에 ConnectionMaker 타입의 오브젝트를 컨테이너로부터 제공받는다.
구체적인 사용클래스 이름은 컨테이너가 사용할 설정정보에 들어 있다.
@Configuration이 붙은 DaoFactory를 사용한다고 하면 개발자 PC에서는 DaoFactory의 코드를 만들어서 사용하면된다.
개발용 ConnectionMaker
@Bean public ConnectionMaker connectionMaker() { return new LocalDBConnectionMaker(); } |
서버에 배포할때는 어떤 DAO 클래스와 코드도 수정할 필요가 없다.
단지 서버에 사용할 DaoFactory를 수정해주면된다.
서버용 ConnectionMaker
@Bean public ConnectionMaker connectionMaker() { return new ProductionDBConnectionMaker(); } |
개발환경과 운영환경에서 DI의 설정정보에 해당하는 DaoFactory만 다르게 만들어두면 나머지 코드에는 전혀 손대지 않고 개발시와 운영시에 각각 다른 런타임 오브젝트에 의존관계를 갖게 해줘서 문제를 해결할 수 있다.
또한 QA팀이 테스트용으로 별도의 테스트 DB를 만들어서, 개발한 코드를 테스트할때 쓴다고 하면 DAO코드에 전혀 손댈 필요가 없다.
테스트 DB에 접속하는 방법을 가진 ConnectionMaker 구현 클래스를 만들고, 그것을 테스트에서 사용할 DaoFactory 설정에 넣어주기만 하면된다.
테스트가 수행되는 시점에 테스트용 DB에 연결해주는 오브젝트를 DI 컨테이너가 만들어 모든 DAO가 사용할 수 있도록 DI 해줄것이다.
'JAVA > Spring' 카테고리의 다른 글
IoC 컨테이너와 DI - 토비의 스프링 (0) | 2020.09.24 |
---|---|
스프링3 XML를 이용한 설정 (0) | 2018.03.19 |
스프링 3 의존관계 주입(DI) (0) | 2018.03.13 |
스프링3 싱글톤 레지스트리와 오브젝트 스코프 (0) | 2018.03.09 |
스프링3 제어의 역전(IoC) (0) | 2018.03.07 |