1. iBATIS란 무엇인가?
1.1. SQL 매핑하기
아래는 간단한 XML 서술 파일을 이용하여 SQL 구문의 입력과 출력을 매핑하는 예이다.
여기서 주소 데이터를 반환하는 SQL SELECT 구문을 볼 수 있다.
parameterClass="java.lang.Integer"
resultClass="Employee">
SELECT ID as id,
EMPLOYEE_NUMBER as employeeNumber,
FIRST_NAME as firstName,
LAST_NAME as lastName,
TITLE as title
FROM EMPLOYEE
WHERE EMPLOYEE_NUMBER = #empNum#
이 쿼리문을 실행하는 방법은 자바코드에서 다음을 실행하는 것이다.
Employee emp = (Employee) sqlMap.queryForObject("getEmployee",
new Integer(5));
이 코드는 구문을 실행하고 파라미터를 셋팅하며 실제 자바 객체로 결과를 가져온다.
2.2.1작고 간단한 시스템을 위한 iBATIS
iBATIS 가 소규모 어플리케이션과도 잘 작동하는 이유는
첫째, iBATIS 자체가 작고 간단하다.
둘째, iBATIS 는 이미 존재하는 어플리케이션이나 데이터베이스의 설계 변경을 강요하지 않는다.
셋째, 현재 오랜 기간 운영중인 소프트웨어라면, 자그마한 규모의 소프트웨어가 큰 규모의 소프트웨어로 성장하는 것은 피할 수 없는 사실이다. iBATIS가 대규모 시스템에서도 잘 작동하기 때문에 iBATIS를 사용하는 소규모 어플리케이션이 전사적 애클리케이션의 요구 조건을 만족시키는 시스템으로 성장해가는 데도 문제가 없다.
1.3. 왜 iBATIS를 사용하나?
2.3.1간단함
iBATIS의 매우 견고한 토대가 되는 JDBC와 SQL을 계속 유지함으로써 이러한 간결성을 확보하게 되었다. iBATIS는 훨씬 더 적은 코드로도 JDBC처럼 작동하기 때문에 자바 개발자들이 다루기가 쉽다.
2.3.2생산성
iBATIS는 개발자의 생산성을 높여주는 데 성공했다. 코드량의 감소는 주소 작성할 필요가 없는 JDBC 코드 때문이다. SQL은 여전히 손으로 작성해야 하지만, SQL은 문제가 되지 않는다.
2.3.3성능
iBATIS는 나중에 자세히 언급할 많은 성능 최적화 기법을 지원한다. 지금은 iBATIS를 간단한 방법으로 설정해서 사용할 수 있고, 나아가 JDBC만큼 잘, 혹은 더 뛰어나게 수행된다는 것을 아는 것이 중요하다.
2.3.4관심사의 분리
iBATIS는 데이터베이스 커넥션과 PreparedStatement 그리고 결과셋 같은 퍼시스턴스 계층과 관련된 리소스를 관리하여 계층화를 지원하도록 도와준다. iBATIS는 데이터베이스에 독립적인 인터페이스와 API를 제공하여 애플리케이션을 어떠한 퍼시스턴스 계층 관련 리소스에도 의존하지 않게 해준다.
2.3.5 작업의 분배
SQL문이 애플리케이션 소스 코드로부터 완전히 분리되기 때문에, SQL 프로그래머는 문자열 이어 붙이기에 대해 걱정할 필요없이 SQL을 작성할 수 있다.
2.3.6 이식성: 자바, .NET 그리고 그 외…
이식성이 높다는 것은 모든 애플리케이션에서 설계를 일관성 있게 할 수 있다는 의미이다. iBATIS는 애플리케이션의 설계와 무관하게 더 많은 언어와 다른 프레임워크보다 더 많은 형태의 애플리케이션에서 작동한다.
2.3.7 오픈 소스와 정직성
오픈 소스 소프트웨어의 가장 큰 장점 중 하나는 정직하다는 점이다. 진실이나 거짓을 과장할 까닭이 없다. 그래서 iBATIS를 사용할 필요가 없는 경우에 대해 몇 가지 이야기해보고 적절한 대안을 제시해 본다.
1.4. iBATIS를 사용하지 않는 경우
2.4.1 개발자가 모든 것에 대해 영원한 결정권을 갖고 있을 때…
모든 결정권을 갖고 있을 때라면, 하이터 네이트와 같은 완전한 객체 관계 매핑 솔루션을 사용하는 것이 좋다. 이 때는 객체 관계 매퍼가 제공해 주는 설계상의 이점과 생산성 향상을 제대로 누릴 수 있다.
2.4.2 어플리케이션이 완전히 동적인 SQL을 요구할 때
애플리케이션의 핵심 기능이 SQL을 동적으로 생성하는 것이라면, iBATIS는 좋지 못한 선택이다. 그냥 JDBC를 사용하거나 혹은 자신만의 프레임워크를 직접 만드는 것도 좋다.
2.4.3 관계형 데이터베이스를 사용하지 않을 때
iBATIS는 환경에 대해 많은 전제조건을 걸지는 않는다. 하지만 트랜잭션과 전통적인 SQL 그리고 저장 프로시저 구문을 지원하는 진짜 관계형 데이터 베이스를 사용한다고 어느정도는 가정하고 있다. 실제로 관계형 데이터 베이스를 사용하지 않는다면 순수한 JDBC 나 저수준 파일 입출력 API 사용을 추천한다.
2.4.4 그냥 작동하지 않을 경우
iBATIS는 커뮤니티가 성장하면서 나타나는 요구사항에 맞춰 지속적으로 많은 훌륭한 기능들을 구현하고 있다. 하지만 iBATIS도 몇몇 애플레케이션의 요구사항과는 상반되는 개발 방향이나 설계 지침을 분명히 가지고 있다.이러한 경우에 대비하여 요구사항에 맞아 떨어지도록 iBATIS를 확장할 수 있는 추가 가능한 인터페이스를 제공하도록 시도한다.
1.5. 5분 내에 사용 가능한 iBATIS
간단한 데이터베이스 테이블을 조회하는 정적인 SQL 문을 설정하고, 아래와 같이 콘솔에 그 결과를 출력한다.
java -classpath <…> Main
Selected 2 records.
{USERNAME=LMEADORS, PASSSWORD=PICKLE, USERID=1, GROUPNAME=EMPLOYEE}
{USERNAME=JDOE, PASSSWORD=TEST, USERID=2, GROUPNAME=EMPLOYEE}
2.5.1데이터 베이스 준비하기
우리가 사용할 테이블을 생성하고 몇 가지 샘플 데이터를 추가하는 MySQL 스크립트이다.
#
# Table structure for table 'user'
#
CREATE TABLE USER_ACCOUNT (
USERID INT(3) NOT NULL AUTO_INCREMENT,
USERNAME VARCHAR(10) NOT NULL,
PASSSWORD VARCHAR(30) NOT NULL,
GROUPNAME VARCHAR(10),
PRIMARY KEY (USERID)
);
#
# Data for table 'user'
#
INSERT INTO USER_ACCOUNT (USERNAME, PASSSWORD, GROUPNAME)
VALUES ('LMEADORS', 'PICKLE', 'EMPLOYEE');
INSERT INTO USER_ACCOUNT (USERNAME, PASSSWORD, GROUPNAME)
VALUES ('JDOE', 'TEST', 'EMPLOYEE');
COMMIT;
2.5.2 코드 작성하기
우리의 첫 번째 완전한 형태의 예제이자 iBATIS 사용법에 대한 소개이다. 타입 안정성과 예외 처리는 나중에 알아보도록 하고 여기서는 고려하지 않을 것이다.
import com.ibatis.sqlmap.client.*;
import com.ibatis.common.resources.Resources;
import java.io.Reader;
import java.util.List;
public class Main {
public static void main(String arg[]) throws Exception {
String resource = "SqlMapConfig.xml";
Reader reader = Resources.getResourceAsReader (resource);
SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
List list = sqlMap.queryForList("getAllUsers", "EMPLOYEE");
System.out.println("Selected " + list.size() + " records.");
for(int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}
10줄 정도의 자바 코드로 iBATIS 를 설정하고 구문을 실행하였으며 결과를 출력했다. 위의 자바 코드만으로 완벽하게 작동하는 iBATIS 애플리케이션을 만든 것이다. 나중에 더 개선할 것이지만, 일단은 기본적인 설정 방법을 알아보자.
2.5.3 iBATIS 설정하기(미리보기)
3장에서 iBATIS의 설정에 대해 깊이 있게 다룰 것이기 때문에 여기서 간단하게만 살펴본다. 먼저 SqlMapConfig.xml 파일을 보자. 다음은 우리의 간단한 애플리케이션을 위한 SqlMapConfig.xml 파일을 보여준다.
PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
value="com.mysql.jdbc.Driver"/>
value="jdbc:mysql://localhost/test"/>
value="root"/>
value="blah"/>
위 설정은 데이터 베이스에 연결하는 방법과 사용 가능한 SQL Map 파일들을 iBATIS에 지정해주는 역할을 한다. 핵심이 되는 설정파일을 보았으니, 이제 우리는 SqlMap.xml 파일을 살펴보자.
"http://ibatis.apache.org/dtd/sql-map-2.dtd">
GROUPNAME 파라미터를 위해 하나의 문자열 파라미터를 받고 결과를 HashMap에 매핑한다.
2.5.4 애플리케이션 빌드하기
빌드하기 위해 클래스 패스에 둘 필요가 있는 JAR 파일은 ibatis-common-2.jar 와 ibatis-sqlmap-2.jar 이다. 그러고 나서 자바 컴파일러에 클래스 패스를 지정하기 위해 다음과 같이 명령줄을 작성할 것이다.
javac -classpath
2.5.5 애플리케이션 실행하기
애플리케이션을 실행할 때 몇 개의 추가적인 jar 파일이 있어야 하지만 많지는 않다. 애플리케이션을 실행하기 위해 클래스패스에 두어야 할 jar 파일은 ibatis-common-2.jar, ibatis-sqlmap-2.jar, commons-logging.jar 그리고 JDBC 드라이버(이 경우, mysql-connector-java.jar)이다. 이제 다음으로 아래 명령을 입력한다.
java -classpath
ibatis-common-2.jar;ibatis-sqlmap-2.jar;.
Main
프로그램이 실행될 것이고, 얼마나 많은 행이 선택되었는지 알려주고, 다음과 같이 대강의 형태로 데이터를 출력한다.
Selected 2 records.
{USERID=1, USERNAME=LMEADORS, PASSSWORD=PICKLE, GROUPNAME=EMPLOYEE}
{USERID=2, USERNAME=JDOE, PASSSWORD=TEST, GROUPNAME=EMPLOYEE}
1.6. 미래: iBATIS는 어디로 가는가?
2.6.1 Apache 소프트웨어 재단
iBATIS 는 기술보다는 소프트웨어를 둘러싼 커뮤니티에 집중한다.Apache는 iBATIS를 보호하기 위해 필요한 것들을 제공하고, iBATIS를 원하는 사람들이 있는한 계속해서 우리 곁에 있을 것이다.
댓글 없음:
댓글 쓰기