본문 바로가기
Lecture/Mybatis

[본격 게시판짜기 Part2.6 Model2 MVC패턴] Model 구성2 - i-batis의 사용2

by cusmaker 2012. 7. 17.
반응형

2012/06/13 - [Lecture/HTML] - [본격 게시판짜기 Part1.1 - 게시판도 HTML부터] 게시글 리스트

2012/06/13 - [Lecture/HTML] - [본격 게시판짜기 Part1.2 - 게시판도 HTML부터] 글입력폼

2012/06/13 - [Lecture/Javascript-기초] - [본격 게시판짜기 Part1.3 - Dom 맛보기 ] 글입력폼 검사

2012/06/13 - [Lecture/Jsp] - [본격 게시판짜기 Part1.4 - HTML-> JSP] form 파라미터 받기

2012/06/26 - [Lecture/SQL / Oracle] - [본격 게시판짜기 Part1.5 JSP > Oracle] 게시판 DB 테이블 생성

2012/06/26 - [Lecture/Jsp] - [본격 게시판짜기 Part1.6 Oracle > JSP] Database 접속 및 Select

2012/07/05 - [Lecture/Jsp] - [본격 게시판짜기 Part1.7 JSP, SQLDeveloper] 게시글 입력 및 리스트조회기능

2012/07/08 - [Lecture/Jsp] - [본격 게시판짜기 Part1.8 JSP 게시글 조회] 게시글 조회기능 및 게시글 삭제

2012/07/10 - [Lecture/Jsp] - [본격 게시판짜기 Part2.1 Model2 MVC패턴] 뷰(View) 코드 분리

2012/07/10 - [Lecture/Jsp] - [본격 게시판짜기 Part2.2 Model2 MVC패턴] Entity Beans의 사용

2012/07/12 - [Lecture/Jsp] - [본격 게시판짜기 Part2.3 Model2 MVC패턴] Controller구성

2012/07/13 - [Lecture/Jsp] - [본격 게시판짜기 Part2.4 Model2 MVC패턴] Model 구성

2012/07/16 - [Lecture/Mybatis] - [본격 게시판짜기 Part2.5 Model2 MVC패턴] Model 구성2 - i-batis의 사용


안녕하세요 cocy입니다.

이번시간에는 저번시간에 이어 아이바티스를 활용한 Model 구성에 들어가도록 하겠습니다.

어제 못다한 Board.xml의 내용을 채워보고, 사용법을 배워 볼텐데요,


그전에 기본적으로 알아야 할 쿼리들에 대해서는 

다음포스팅을 참고하세요.


Select 쿼리                               :        http://cusmaker.tistory.com/38

Select 쿼리 Where절의 사용        :        http://cusmaker.tistory.com/43

Update 쿼리                              :        not yet.

Delete 쿼리                               :        not yet.



가장 기본적인 내용을 채워봅시다.

코드는 다음과 같습니다.


<?xml version="1.0" encoding="UTF-8"?>
 
 
 
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"  "http://ibatis.apache.org/dtd/sql-map-2.dtd">
 
 
 
<sqlMap namespace="Board">
 
 
 
</sqlMap>


간단하죠? sqlMap 태그에 들어가있는 namespace는 

Dao에서 해당 쿼리를 식별하기위한 용도로 쓰입니다. 

지금은 sqlMapConfig.xml파일에서 namespace설정을 false로 지정했기때문에 명시적으로만 쓰입니다.

그러므로 sqlMap 태그 안에 다음에 추가될 모든 내용들이 들어가야겠죠?

복사해서 붙여넣기 하셨으면 다음의 문장을 sqlMap 태그 안에 넣습니다.


<typeAlias alias="str" type="java.lang.String" />
 
<typeAlias alias="int" type="java.lang.Integer" />
 
<typeAlias alias="board" type="com.board.beans.Board" />

typeAlias태그는 긴 클래스명에 별칭을 주어 별칭만으로 접근 가능하도록하여 코딩을 수월하게합니다.

기본타입의 String과 Integer외에도 사용자지정 클래스(Entity Bean)도 저런식으로 별칭이 가능합니다.


그다음은 이제 본격적으로 쿼리가 들어갈 태그를 작성할텐데요,

쿼리 태그에는 가장 자주쓰이는 다음의 네가지 태그가 있습니다.


<select id="" parameterClass="" resultClass=""> </select>
 
<insert id=""  parameterClass ="" > </insert>
 
<delete id=""  parameterClass ="" > </delete>
 
<update id=""  parameterClass ="" > </update>

공통적인 속성인 id는 Dao에서 해당 쿼리를 식별하기위한 식별자로 쓰입니다.


역시 공통적인 속성인 parameterClass는 만약 쿼리를 실행할때 파라미터가 필요할 경우,

이 속성값에 클래스패스를 적어주어 만약 int값이라면 java.lang.Integer를 주면 되겠습니다.

헌데, 위에서 별칭으로 int라 지정해주었기때문에 int만 적으면 되겠습니다.


resultClass는 반환값이 있는경우에 parameterClass와 마찬가지로 클래스패스를 적어줍니다.

아이바티스의 편리한점 중 하나가 바로 이 resultClass에 entityBean을 등록하면 

알아서 결과값을 Bean에 셋팅해 주는 것입니다. 예를 들어 board테이블에서 결과를 조회하고

resultClass를 typeAlias해준 board로 지정하면, 결과값을 board에 자동으로 맵핑해줍니다.

편리하죠? 여기서 주의할점은 bean의 변수이름과 데이터베이스의 컬럼명이 정확히 일치해야합니다.


select쿼리의 경우에는 대부분 반환값이 있지만,

update쿼리나 delete쿼리, insert쿼리는 반환값이 없습니다. 없을까요? ※한번 조사해보시기바랍니다.


그럼 설명은 이쯤하고 listAction에서 사용할 BoardDao의 모든 게시글을 가져오는 select쿼리를 작성해보도록 하겠습니다.


<select id="getArticleList"  resultClass="board">
 
     select * from Board order by idx desc
 
</select>

모든 게시글을 가져오는 쿼리의 경우 파라미터가 없기때문에 적지않았고,

resultClass로 entity Bean인 Board클래스를 맵핑해주었습니다.

그럼 전체적인 쿼리는 다음과같습니다.


그림 1. ibatis sqlmap

그럼 이쿼리를 어떻게 사용해야죠?

Dao를 저번시간에 작성한 IBatisDBConnector를 사용할 수 있도록 수정해봅시다.

CommonDao.java로 갑니다.

뭔가 많죠? 하지만 우리는 이미 데이터베이스 연결과 관리는 아이바티스에게 넘겼기때문에

클래스 내의 모든 내용을 지워줍시다.


그리고 다음의 코드를 추가합니다.


private SqlMapClient myDB;
 
public void SetDB() {
 
    myDB = IBatisDBConnector.getSqlMapInstance();
 
}
 
 
 
protected SqlMapClient GetDB() {
 
    return myDB;
 
}


아이바티스에서 제공하는 sqlMapClient객체를 생성하고 

아이바티스커넥터로부터 인스턴스를 가져오는 SetDB메서드를 구현하는 코드입니다.

당연히 IbatisDBConnector를 사용하려면 임포트 해야겠죠?


그림2. ibatis Dao에 추가하기


작업이 끝나셨으면 CommandDao를 상속받는 BoardDao에서도 이 객체를 사용하여 

board.xml에 명시한 쿼리를 사용하도록 해야합니다.

BoardDao.java로 갑시다.

여기서도 역시 코드는 단순해집니다.

예전에 구현한 getArticleList의 내용을 모두 지우고 다음의 코드를 입력합니다.

public static BoardDao getInstance() {    // 기존에 구현했던 getInstance메서드
 
    BoardDao _instance = new BoardDao();
 
    _instance.SetDB();                // 이 코드 한줄이 추가되었습니다.
 
    return _instance;
 
}  
 
 
 
    ArrayList<Board> articleList = null;
 
    articleList = (ArrayList<Board>)GetDB().queryForList("getArticleList"null);
 
    return articleList;


길었던 코드가 단 세줄로 구현되었습니다.(인스턴스 메서드 빼고)

뭐 더 간단히 하자면 다음과같이

return  (ArrayList<Board>)GetDB().queryForList("getArticleList"null);

한줄로도 가능하지만 개인취향에 맡기도록 하겠습니다.


코드를 설명하면 CommonDao의 GetDB메소드로부터 sqlMap 객체를 가져와서,

ibatis를 통해 queryForList()라는 메서드를 사용하였습니다.

그리고 해당 반환값을 전과 동일하게 (ArrayList<Board>) Board객체형 리스트로 캐스팅 해주고,

해당 리스트를 반환하였습니다.


여기서 주목해야할 부분은  queryForList 메서드인데요

셀렉트 쿼리에 쓰이는 메서드이며 DB에서 조회하는 값이 한개의 행 이상일 경우 이 메서드를 사용합니다.

조회하는 행이 하나일경우엔 queryForObjcet를 사용하며

update쿼리일 경우에는 update

delete쿼리일 경우에는 delete,

insert쿼리일 경우에는 insert 메서드를 사용합니다.

어시스트를 사용하면 그 외에도 여러 메서드가 존재하는데 한번 알아보시는것도 좋을듯합니다만,

주로 이 다섯개의 메서드가 주로 쓰입니다.


매개변수는 보통 두개를 가지며,

첫번째 매개변수는 board.xml 즉, xml파일에서 쿼리를 식별하기위해 만들어준 id를 입력합니다. string형이어야겠죠?

두번째 파라미터는 쿼리에 쓰일 파라미터입니다. object형으로 어떤 객체든 넘길 수 있습니다.

지금은 파라미터가 없기때문에 null로 주었습니다.


그럼 한번 잘 작동하는지 실행해 보도록 하겠습니다. ... ... .........

저도 지금 같이 코딩하면서 포스팅하고 있는데 잘 안돌아가네요 -_-;

확인결과 라이브러리추가에서 조금 빼먹은 부분이 있었습니다. 

다음 파일들을 WebContent > WEB-INF > lib 폴더에 추가해주세요.


commons-dbcp-1.2.2.jar


commons-pool-1.3.jar


log4sql.jar


아이바티스에서 사용할 커넥션 풀과 sql로그를 사용하기위한 라이브러리들입니다.

추가하셨으면 다시한번 실행해서 동작하는지 확인해 보시기 바랍니다.

혹시나 한글이 깨지시는 분들은

listAction 상단에 

request.setCharacterEncoding("euc-kr"); 

구문을 추가해주세요.



그림3. 아이바티스 설정 완료!



이것으로 i-batis 를 사용한 Model 재구성을 완료하였습니다.

나머지 액션들의 쿼리들도 마찬가지로 셋팅해 보시기 바랍니다.

질문이나 궁금한 사항 있으시면 바로 댓글로 남겨주세요. 주시하고 있겠습니다 -_-+


수고하셨습니다. 


다음글 >> http://cusmaker.tistory.com/94