2-2. Spring Ioc 실습(XML 기반, 인터페이스, 세터주입)
[Money.java]
[Car.java]
[HyundaiMaker.java]
[OrderManager.java]
[src/main/rtesources/ioc.xml]
Project에서 마우스 우측버튼 -> new -> other -> Spring -> Spring Bean Configuration File
[OrderManagerApp.java]
위 예제에서
ü OrderManager와 HyundaiMaker는 서로 떼어 놓을 방법이 없다. 이 두 클래스는 정적으로 결합(coupling)되어 있다
ü 하나의 버그를 고치면 그 결과 다른 새로운 버그가 생성되는 ‘두더지잡기(whack-a-mole)’ 버그를 만든다.
ü 다른 한편으로 완벽하게 분리된 코드는 아무일 도 못한다.
자바에서 결합도를 떨어뜨리는 일반적인 방법은 구현을 인터페이스 뒤로 숨기는 인터페이스 기반 프로그래밍을 하는 것이다. 이를 통해 클라이언트 클래스에 영향을 주지 않고도 쉽게 구현 클래스가 교체될 수 있도록 할 수 있다.
[CarMaker.java]
[HyundaiMaker.java를 인터페이스를 구현하도록 수정]
[OrderManager.java 수정]
ü 수정된 코드에 대한 검토
- 인터페이스 기반이므로 new HyundaiMaker 부분은 쉽게 다른 메이커로 변경 가능하지만 여전히 HyundaiMaker를 new 하고 있음. 강한 의존관계
- 자주 변경되는 구상클래스(Concrete class)에 의존하지 말라.
- 어떤 클래스를 상속받아야 한다면 , 기반 클래스를 추상 클래스 또는 인터페이스로 만들어서 구현하라.
- 어떤 클래스의 참조를 가져야 한다면 참조 대상이 되는 클래스를 추상 클래스, 인터페이스로 정의하라.
- 인터페이스를 만들어서 이 인터페이스에 의존하라. DIP(Dependency Inversion Principle)
[DaewooMaker.java]
[OrderManager.java 수정]
실행결과를 확인하여 DaewooMaker로 바뀐것을 확인하자.
인스턴스를 생성하는 방법의 문제를 해결하기 위해 스프링 프레임워크의 세터주입을 이용하자.
[OrderManager.java 수정]
[ioc.xml 수정]
OrderManagerApp 실행 후 결과 확인하자.
Ioc.xml을 대신하여 자바 설정으로 변경해보자.
[MyConfig.java]
[OrderManagerApp.java]