페이지

2015. 2. 25.

[struts2] DI(dependency injection)를 구성하기 위한 메뉴얼

DI(dependency injection)개념

의존성 주입!!

객체를 직접적으로 만들어서 사용하는 것이 아니고 얻어서 사용하는 것을 말함
(다르게 말하면 코드 의존성 제거 - 수정 사항이 있을 떄 손이 덜 가게 하고 싶다.)

기존에 우리도

싱클톤패턴 인스턴스 생성을 사용했었다!! DAO dao = DAO.getInstance(); << 이런 형태


public class DAO {
    private static DAO dao = new DAO();
    public static DAO getInstance(){
        return dao;
    }
    private DAO(){
        //변수들은  DATABASE로 처리할 것이기때문에 필요한 변수들은 private로 처리한다.
        //따라서 다른곳에서 객체를 생성할 이유가 없어진다.
        //즉, 하나의 메모리를 만들어 놓고 같이 사용하는 것과 같다.
    }
}



어떻게 사용하면 될까?

init메서드가 호출될떄 필요한 모든 변수를 생성시켜버린다!!

    public void init() {
        DAO dao = new DAO();
    }
    public String intercept(ActionInvocation arg0) throws Exception {
        String result = arg0.invoke();
        return result;
    }



DI를 구성하기 위해 필요한것!(DI를 구성하기 위한 메뉴얼)
4단계

1. 범용성을 위한 interface 작성 (Superinterface)
2. Action 클래스는 슈퍼인터페이스 구현
3. 인터셉터 init 메서드에서 객체 생성
4. 인터셉터 intercept 메서드에서 객체 action에게 주입..!!!




1. 범용성을 위한 interface 작성 (Superinterface)

[DAOSuper.java]
package test.interceptor;

import test.action.DAO;

public interface DAOSuper {
    public void setDAO(DAO dao);
}




2. Action 클래스는 슈퍼인터페이스 구현

[HelloWorld.java]
package test.action;

import test.interceptor.DAOSuper;

public class HelloWorld implements DAOSuper{
    private DAO dao = null;
    public String execute(){
        return "success";
    }
    public void setDAO(DAO dao){
        this.dao = dao;
    }

}

이전에 인터셉터에서 add를 호출한것처럼 setDAO를 호출하는 것을 DI 형태라고 한다?





3. 인터셉터 init 메서드에서 객체 생성
package test.interceptor;

import test.action.DAO;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

public class DAOInterceptor implements Interceptor{
    private DAO dao = null;
    public void destroy() {    }

    public void init() {
        dao = new DAO();
    }

    public String intercept(ActionInvocation arg0) throws Exception {
        //DAOSuper를 구현했는 지를 검사한다.
        Object obj = arg0.getAction();
        if(obj instanceof DAOSuper){
            //instanceof true false를 반환(좌우가 상속관계인지 확인 후)
            //즉, helloworld가 DAOSuper를 구현 했는지?를 알아봄
            //따라서, 조상 자손 관계를 맽고 있다면,
            DAOSuper su = (DAOSuper)obj;  //기존객체를 형변환후 주입시킴
          su.setDAO(dao);  //이런 방식을 DI(의존성 주입)이라고함

        }
        return arg0.invoke();
    }
   
}



4. 인터셉터 intercept 메서드에서 객체 action에게 주입..!!!(3번 intercept 코드와 동일함)


public String intercept(ActionInvocation arg0) throws Exception {
        //DAOSuper를 구현했는 지를 검사한다.
        Object obj = arg0.getAction();
        if(obj instanceof DAOSuper){
            //instanceof true false를 반환(좌우가 상속관계인지 확인 후)
            //즉, helloworld가 DAOSuper를 구현 했는지?를 알아봄
            //따라서, 조상 자손 관계를 맽고 있다면,
            DAOSuper su = (DAOSuper)obj;//기존객체를 형변환후 주입시킴
            su.setDAO(dao);//이런 방식을 DI(의존성 주입)이라고함
        }
        return arg0.invoke();
    }


struts.xml 설정
<struts>
    <package name="test" extends="struts-default">
        <interceptors>
            <interceptor name="hello" class="test.interceptor.HelloInterceptor" />   
            <interceptor name="dao" class="test.interceptor.DAOInterceptor" />   
        </interceptors>
       
        <action name="hello2" class="test.action.HelloWorld">
            <interceptor-ref name="dao" />
            <result>/0223/result.jsp</result>
        </action>
    </package>
</struts>


[콘솔 내용]

정보: Server startup in 1588 ms
insert

정상적으로 출력되는 것 볼수 있음