클래스간에 의존관계를 주입하는 방법에 대해서 설명하고 있다.

클래스 모델이나 코드에서 각각의 클래스들간의 관계를 직접 지정하게 되면, 향후 클래스나 코드의 변경이 일어날 때 마다 관련된 모든 코드를 손봐야 한다.
이는 소프트웨어 개발 시 높은 응집도와 낮은 결합도를 고려해야 한다는 원칙에 위배된다.
따라서 클래스를 개발 할 때 IoC(Inversion of Control)과 DI(Dependency Injection)을 고려해 개발한다.

사실 뭐 이 정도는 그리 대단한 내용이 아니다.
스프링 아니어도 기존에 개발할 때 마다 늘 하던 일이기도 하다.(xml이나 배열등의 노가다로)
하지만 스프링을 쓰면 이런 작업들을 하나하나 수동으로 하는 대신, 스프링의 특정 기술을 쓰면 된다.
거기에 더해, 싱글톤 레지스트리를 자동으로 구현해 주는 덕분에 서버 자원 관리에 이점이 있다.(한번 로드 된 ApplicationContext는 계속 재사용된다.)


스프링에서 DI를 구현하는 방법은 여러가지가 있지만, 그 중에 가장 많이 사용 되는 것은 역시 XML을 이용한 방식이다.
XML의 샘플은 아래와 같다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
        <bean id="dataSource" class="org.spring.jdbc.datasource.SimpleDriverDataSource">
                <property name="driverClass" value="com.mysql.jdbc.Driver">        //JDBC로 사용할 클래스 이름
                <property name="url" value="jdbc:mysql://localhost/springbook">        //DB 연결 url 
                <property name="username" value="spring">        //DB 사용자 이름
                <property name="password" value="book">        //DB 사용자 비밀번호
        </bean>
        <bean id="userDao" class="springbook.user.dao.UserDao">        //프로그램 전체에서 불러 쓸 수 있다. id에는 중복값이 올 수 없다.
                <property name="dataSource" ref="dataSource">        //다른 빈과의 관계를 주입할 수 있다. (붉은 색으로 표시된 부분)
        </bean>
</beans>


그리고 각 클래스에서 이러한 의존성을 인식하게 하기 위해 아래의 라인을 추가한다.

ApplicationContext context= new GenericXmlApplicationContext("applicationContext.xml");        //xml의 경로는 클래스 root를 기준으로 한다.

만약 root에서부터 xml 파일의 경로를 찾기가 번거로운 경우 다음과 같은 방법을 사용해도 된다.

ApplicationContext context= new ClassPathXmlApplicationContext("applicationContext.xml","UserDao.class");        //UserDao.class 와 같은 경로라는 뜻


이렇게 하면 각 클래스 파일간의 의존성 관계를 스프링이 제어하도록 할 수 있다.



Posted by Kunner

댓글을 달아 주세요

  1. 정진철

    <property name="url" value="jdbc:mysql://localhost/springbook"> //JDBC JAR파일의 경로
    jar파일 경로가 아니라 DB url 아닌가요

    2011.11.08 15:45 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 네 말씀하신게 맞습니다.
      보통 써놓고 다시 안 읽어 보다보니.. 말씀하시기 전엔 미처 몰랐네요.
      고쳐 놓겠습니다. 감사합니다. ^^

      2011.11.08 20:28 신고 [ ADDR : EDIT/ DEL ]