클래스들의 구조는 다음과 같다.
지금까지 보통 new SeoulServer();를 써서 객체를 생성해서 썼지만,
후에, 요구사항이 변경되면 코드도 엄청나게 수정해야 한다.
스프링을 적용하여 applicationContext.xml에서 설정만 해주면,
외부 설정파일(xml)에서 연관관계에 있는 객체를 넣어주기(주입) 때문에
의존객체를 찾기 위한 코드가 필요하지 않게 된다.
즉, 외부설정에서 객체를 찾아서 쓰기 때문에 코드내에 의존관계를 맺는 코드 생성이 불필요한것이다.<o:p></o:p>
<o:p> </o:p>
의존(Dependenty)하는 객체를 외부설정에서 삽입 (Inject)을 해주기 때문에
이 방식을 DI 패턴이라고 부르는 것이다.
DI를 적용하게 되면 불필요한 의존관계를 줄이거나 없애버릴 수 있다.<o:p></o:p>
코드 수정없이 객체를 생성..ㅇㅋ?ㅋㅋㅋ
// ——————————————————————————–<o:p></o:p>
// applicationContext.xml<o:p></o:p>
// ——————————————————————————–<o:p></o:p>
<?xml version=”1.0″ encoding=”UTF-8″?><o:p></o:p>
<beans<o:p></o:p>
xmlns=”http://www.springframework.org/schema/beans“<o:p></o:p>
xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance“<o:p></o:p>
xsi:schemaLocation=”http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd“><o:p></o:p>
<bean id=”manager” class=”di.ServerManager”></bean><o:p></o:p>
<bean id=”server” class=”di.SeoulServer”></bean><o:p></o:p>
<o:p> </o:p>
</beans><o:p></o:p>
<o:p> </o:p>
<o:p> </o:p>
// ——————————————————————————–<o:p></o:p>
// TestServer.java (메인 클래스)<o:p></o:p>
// ——————————————————————————–<o:p></o:p>
package di;<o:p></o:p>
<o:p> </o:p>
import org.springframework.beans.factory.BeanFactory;<o:p></o:p>
import org.springframework.beans.factory.xml.XmlBeanFactory;<o:p></o:p>
import org.springframework.core.io.ClassPathResource;<o:p></o:p>
import org.springframework.core.io.Resource;<o:p></o:p>
<o:p> </o:p>
<o:p> </o:p>
public class TestServer {<o:p></o:p>
<o:p> </o:p>
/**<o:p></o:p>
* 콘솔에서의 출력 결과 – ‘서울 서버 서비스~~'<o:p></o:p>
*/<o:p></o:p>
public static void main(String[] args) {<o:p></o:p>
<o:p></o:p>
//—————————————————————–<o:p></o:p>
// 1. old<o:p></o:p>
//—————————————————————–<o:p></o:p>
// 코드의 변경 가능성 존재! <o:p></o:p>
Manager m = new ServerManager();<o:p></o:p>
<o:p></o:p>
//변경가능성 有<o:p></o:p>
Server server = new SeoulServer();<o:p></o:p>
m.manage(server);<o:p></o:p>
<o:p></o:p>
<o:p></o:p>
//—————————————————————–<o:p></o:p>
// 2. spring 적용<o:p></o:p>
//—————————————————————– <o:p></o:p>
// 스프링 설정 로딩<o:p></o:p>
Resource resource = new ClassPathResource(“applicationContext.xml”);<o:p></o:p>
<o:p></o:p>
// 설정에서 생성된 객체의 팩토리를 생성한다.<o:p></o:p>
BeanFactory factory = new XmlBeanFactory(resource);<o:p></o:p>
Manager m2 = (Manager)factory.getBean(“manager”);<o:p></o:p>
Server server2 = (Server)factory.getBean(“server”);<o:p></o:p>
m2.manage(server2);<o:p></o:p>
<o:p></o:p>
<o:p> </o:p>
}<o:p></o:p>
<o:p> </o:p>
}<o:p></o:p>
<o:p> </o:p>
<o:p> </o:p>
// ——————————————————————————–<o:p></o:p>
// Manager 인터페이스와 ServerManager.java<o:p></o:p>
// ——————————————————————————–<o:p></o:p>
package di;<o:p></o:p>
<o:p> </o:p>
public interface Manager {<o:p></o:p>
public void manage(Server s);<o:p></o:p>
}<o:p></o:p>
<o:p> </o:p>
package di;<o:p></o:p>
<o:p> </o:p>
public class ServerManager implements Manager {<o:p></o:p>
<o:p> </o:p>
public void manage(Server s) {<o:p></o:p>
s.service(); <o:p></o:p>
}<o:p></o:p>
<o:p></o:p>
}<o:p></o:p>
<o:p> </o:p>
// ——————————————————————————–<o:p></o:p>
// Server 인터페이스와 SeoulServer.java & NewYorkServer.java<o:p></o:p>
// ——————————————————————————–<o:p></o:p>
package di;<o:p></o:p>
<o:p> </o:p>
public interface Server {<o:p></o:p>
public void service();<o:p></o:p>
}<o:p></o:p>
<o:p> </o:p>
package di;<o:p></o:p>
<o:p> </o:p>
public class SeoulServer implements Server {<o:p></o:p>
<o:p> </o:p>
public void service() {<o:p></o:p>
System.out.println(“서울 서버 서비스~~”);<o:p></o:p>
}<o:p></o:p>
}<o:p></o:p>
<o:p> </o:p>
package di;<o:p></o:p>
<o:p> </o:p>
public class NewYorkServer implements Server {<o:p></o:p>
<o:p> </o:p>
public void service() {<o:p></o:p>
System.out.println(“뉴욕 서버 서비스~~”);<o:p></o:p>
}<o:p></o:p>
}<o:p></o:p>