스프링으로 사용하다 보면 항상 나오는 말이 DI이고 그만큼 강력한 기술이라고 생각한다. 더불어 자바가 객체지향 언어라는 것을 다시금 알 수 있게 해주는 기술이 DI이다.
그래서 이번에는 DI를 사용함으로써 어떤 점이 좋은지 예시를 들어 설명해보려고 한다.
먼저 Player 클래스와 Bat 인터페이스를 만들고 Bat를 구현한 WoodBat 클래스를 추가해준다.
언뜻 보면 Player 클래스는 Bat인터페이스를 의존하고 있고 WoodBat 클래스는 Bat 인터페이스를 구현하여 의존 관계가 잘 성립된 것처럼 보인다. 하지만 Player 클래스를 보면 Bat 인터페이스에도 의존하며 인터페이스를 구현한 WoodBat 클래스에도 의존하고 있는 것을 볼 수 있다.
하지만 배트를 알루미늄 배트로 바꾼다면 인터페이스를 구현한 클래스를 만드는 것과 덤으로 Player 클래스의 수정까지 해주어야 한다.
지금처럼 기능이 별거 없을 때는 수정하는 것이 크게 부담이 안되지만 기능이 점점 많아지고 복잡해지면 수정하는 시간이 상당히 길어질 것이다. 그럼 이 부담스러운 상황을 조금이라도 덜 수 있도록 DI를 적용해서 코드를 바꿔보겠다.
먼저 Bat 타입의 객체를 만들어서 Player 클래스에 넣어줄 AppConfig 클래스를 만들어준다. 여기서 객체를 생성해서 넣어주면 Player 클래스에서는 자신이 사용할 클래스를 따로 만들지 않고 주는 대로 쓰면 된다.
왼쪽에서는 Bat 인터페이스를 구현한 클래스까지 Player 클래스가 알고 객체로 만들어서 사용했지만 오른쪽은 Bat 인터페이스만 알 뿐 Bat 인터페이스를 구현한 클래스까지 알지 못하고 외부에서 주입해주는 대로 Bat 타입 클래스를 사용하는 것을 알 수 있다.
여기서 다시 구현 클래스를 WoodBat 클래스로 바꿔야 한다면 AppConfig에서 AluminiumBat 클래스를 WoodBat 클래스로 바꿔주기만 하면 Player 클래스는 수정할 필요도 없이 기능을 변경할 수 있다.
DI를 적용하기 전과 비교했을 때, Player 클래스의 수정이 없다는 것을 빼면 그다지 큰 장점으로 안 느껴질 수 있지만 위에서 말했듯이 기능이 많아지고 복잡해질수록 DI를 적용함으로써 코드를 수정하고 스프링에서 가장 중요한 테스트를 진행하는 데도 큰 도움을 준다.
'Spring > Spring' 카테고리의 다른 글
[Spring] 인터셉터(Interceptor)에 대해 알아보자! (0) | 2022.06.28 |
---|---|
[Spring] Filter에 대해 알아보자 ! (0) | 2022.06.24 |
[spring] Spring MVC 구조 (0) | 2022.06.02 |
[spring] 컴포넌트 스캔 (0) | 2022.04.25 |
[spring] 싱글톤 레지스트리 (0) | 2022.04.22 |