iBatis를 사용함에 있어 VO와 액션클래스의 작성법을 이어서 소개한다.

 

이전 글에서의 testSQL.xml에서 typeAlias태그와 parameterClass에서 정의했던 대로 TestVO를 작성한다.

 

package test;

 

public class TestVO {

    private int no;

    private String title;

    private String content;

 

    public void setNo(int no){

        this.no = no;

    }

    public int getNo(){

        return no;

    }

   

    ... getters and setters.

}

 

VO 클래스 이기에 당연한 이야기이지만, 각 멤버변수에 대해서는 getter, setter를 빠짐없이 생성해준다.

가끔 멤버변수를 추가하고 나서 깜박하는 때가 있기도 하다. 나만 그런가? 나이가 들어서... ㅡㅡ;

 

VO를 작성했으니 SQL수행을 위한 파라메터 전달 및 결과를 받을 준비는 끝났다.

 

액션클래스의 메소드 호출 한줄이면 이제 끝.

 

package test.action;

 

import! java.io.IOException;
import! java.io.Reader;
import! java.util.ArrayList;
import! java.util.List;

 

import! test.TestVO;

 

import! com.ibatis.common.resources.Resources;
import! com.ibatis.sqlmap.client.SqlMapClient;
import! com.ibatis.sqlmap.client.SqlMapClientBuilder;

import! com.opensymphony.xwork2.ActionSupport;

 

public class TestAction extends ActionSupport {
    public static Reader reader;
    public static SqlMapClient sqlMapper;
 
    private List<TestVO> list new ArrayList<TestVO>();
 
    public TestAction() throws IOException {

        //xml 설정을 로딩
        reader = Resources.getResourceAsReader("sqlMapConfig.xml");
        sqlMapper = SqlMapClientBuilder.buildSqlMapClient(reader);
        reader.close();
    }
 
    public String execute() throws Exception {

        //testSQL.xml의 selectList에 해당하는 쿼리를 수행
        list sqlMapper.queryForList("selectList");
        return SUCCESS;
    }

 

    public static Reader getReader() {
        return reader;
    }

    public static void setReader(Reader reader) {
        TestAction.reader = reader;
    }

 

    ... getters and setters.

}

 

기본적으로 액션을 통해 요청이 들어오면, 리스트를 검색하여 반환하는 간단한 구조이다.

생성자의 xml로딩 부분은 공통이고, execute() 메소드  내의 sqlMapper.queryForList("selectList"); 가 핵심 포인트 되겠다.

 

그렇다면, 기타 insert, update, delete 그리고, 리스트가 아닌 건별 select 는 어떻게 처리될까?

 

각 케이스에 대해 execute() 메소드 내부만 살펴보도록 하겠다.

 

    //INSERT

    public String execute() throws Exception {

        TestVO paramClass = new TestVO();

        //폼에서 넘어온 값들을 VO에 세팅

        paramClass.setNo(getNo());

        paramClass.setTitle(getTitle());

        paramClass.setContent(getContent());

 

        sqlMapper.insert("insert", paramClass);
        return SUCCESS;
    }

 

    //DELETE

    public String execute() throws Exception {

        TestVO paramClass = new TestVO();

        //폼에서 넘어온 값들을 VO에 세팅

        paramClass.setNo(getNo());

        paramClass.setTitle(getTitle());

        paramClass.setContent(getContent());

 

        sqlMapper.insert("delete", paramClass);
        return SUCCESS;
    }

 

    //단일 건 SELECT

    public String execute() throws Exception {

        TestVO resultClass = new TestVO();

        resultClass = sqlMapper.queryForObject("selectOne");


        return SUCCESS;
    }

 

앞서 핵심포인트로 지적했던 sqlMapper의 호출되는 메소드만 변경될 뿐 큰 변화가 없다.

특이한 사항은 DELETE 시 update() 메소드를 호출한다는 것이다.

그리고, 기존의 PreparedStatement 사용시 쿼리의 ? 에 값을 일일이 순차적으로 바인딩 했던것과 달리, VO클래스를 통째로 넘김으로써 코딩의 번거로움을 크게 줄였다. 물론 VO에 값을 담기위해 set메소드를 호출하는 것도 일이라면 마찬가지이지만, 순서에 연연하지 않아도 된다는 것만으로도 충분히 효율적이다.

 

이밖에, 다양한 케이스에 따라 메소드를 호출할 수가 있는데 같은 메소드에 오버로딩 되어있으므로 API를 참고하면 어렵지 않게 사용할 수 있을 것이다.

 

여기까지가 Struts2, iBatis에 대한 초압축 정리이다.

철저히 copy & paste (게시글 드래그가 지원이 안되고 있지만..내 의지는 아니다.), '무작정 따라하기'에 편리하도록 작성하였다. 단지 프로그램을 동작시키는 것에 초점을 맞추었으므로, 실제 ActionSupport 클래스의 동작은 어떻게 되는지, HttpRequest가 어떻게 액션클래스로 전달되는지 등 다소 Fundamental한 측면은 역시 관련 서적을 보는 것이 최고다.

 

 

- 끝 -

 

 

- 참고문헌 : 스트럿츠2 실무프로그래밍 (최재은,표재민 저 - 삼양미디어 2009.04)

원문 : http://www.cyworld.com/deepb1ue/2941192

Posted by 커널제로

본 블로그는 페이스북 댓글을 지원합니다.

,