JDBC 코드의 대안 마이바티스

시작하기 앞서

마이바티스는 2003년 아이바티스 데이터베이스 레이어로 처음 릴리스했다. 직후 SQLMaps와 DAO 패키지를 함께 릴리스했다. 국내에는 많은 개발자들이 아이바티스 또는 SQLMaps라는 이름으로 알고 있다. 최근에는 아파치 프로젝트에서 구글 코드로 호스팅을 옮기고, 코드를 새로 작성하면서 마이바티스로 이름을 바꿔 릴리스하고 있다. 우선 데이터베이스 프로그래밍할 때 JDBC API를 사용하는 코드에서 불편한 점을 하나씩 살펴보면서 아이바티스와 마이바티스가 만들어진 배경을 살펴본다. 또한 2.x버전의 아이바티스와 3.x버전의 마이바티스에 대해 간단히 비교해 본다.

 

전통적인 JDBC 프로그래밍

웹 어플리케이션을 개발할 때는 주로 데이터베이스와의 연동을 위해 JDBC를 사용해 데이터를 조회, 입력, 수정, 삭제하는 코드를 작성한다. 그러나 JDBC를 사용해 데이터베이스 프로그래밍을 하다보면 개발을 한다기보다는 마치 작은 코드를 지속적으로 복사하고 붙여 넣는 작업을 빈번하게 하는 것을 느끼게 된다. 따라서 처리해야 할 작업에 비해 굉장히 많은 시간이 소요되고, 오타에 의한 버그도 상당히 많다.

마이바티스의 가장 큰 특징으로는 JDBC에서 사용한 SQL을 별도 XML에 분리해서 관리한다는 점이다. 따라서 XML과 자바 코드 두가지를 모두 살펴 볼 것이다.

 

 

 

 

<select id="selectForList" resultType="Comment">
SELECT comment_no, user_id, comment_content FROM comment
</select>
▲코드1 데이터베이스를 조회하는 마이바티스 매핑 구문

 

 

 

 

 

위 매핑 구문은 마이바티스가 제시하는 형태로 SQL을 XML에 선언한 것이다. 마이바티스에서는 위 구문처럼 SQL을 XML에 선언한 형태를 매핑 구문이라고 부른다. 매핑 구문의 id 속성 값은 마이바티스 API를 사용해 해당 SQL을 실행할 수 있게 한다. 조회 결과를 자바 객체에 자동으로 설정한다면 그 결과 타입으로 resultType 속성에 해당 타입의 클래스를 적는다. 마이바티스는 resultType 속성에 선언한 클래스에서 컬럼명과 일치하는 setter메서도를 사용해 값을 자동으로 설정한다. 위 구문에는 없지만 동적으로 전달된 값을 사용해 조회 조건을 만들때 Map이나 모델 객체에 값을 설정해 매핑 구문에서 사용할 수 있다. 이런 경우처럼 매핑 구문에서 필요한 값을 설정하고자 할 때 파라미터로 던지는 타입은 ParameterType 속성에 설정한다.

 

 public List<Comment> queryForList(){
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
return sqlSessionFactory.selectList("selectForList");
}
▲코드2 마이바티스 코드

 

코드1처럼 SQL을 별도 XML에 분리했다면 마이바티스 API를 사용해 SQL을 실행하고 결과를 가져와야 한다. 코드2는 코드1의 SQL을 실행한다. SqlSessionFactory 객체를 생성하는 과정은 마이바티스 객체를 생성하는 과정이다. 마이바티스 객체를 생성한 뒤에는 코드1의 매핑 구문을 사용하기만 하면 된다. 코드2에 대해서는 뒤에서 다시 다룰 예정이다. 코드1과 코드2는 유형이 조금 다르긴 하지만 JDBC코드와 동일한 결과를 보여준다. 그러나 JDBC코드와 비교하면 데이터베이스 자원을 가진 객체를 생성하고 해제하는 코드가 없다. 그리고 조회 결과를 모델 객체에 설정하는 과정을 찾아볼 수 없다. JDBC 코드에서 봤던 많은 코드가 없어진 사실로 마이바티스 코드가 좀더 간결하다는 것을 알 수 있다.

 

마이바티스란 무엇인가?

마이바티스는 객체지향 언어인 자바의 관계형 데이터베이스 프로그래밍을 좀 더 쉽게 할 수 있게 도와주는 개발 프레임워크다. 자바는 데이터베이스 프로그래밍을 하기 위해 JDBC를 제공하고, JDBC는 관계형 데이터베이스를 사용하기 위해 다양한 API를 제공한다. 그러나 다수의 메소드를 호출해야 하고 데이터베이스에 관련된 자원 객체를 해제해야 하는 점 등은 개발자에게 부담이 된다. 그리고 데이터베이스에서 SQL을 작성하다보면 굉장히 긴 SQL을 작성하는 경우가 종종 있다. 자바에서 여러 줄에 걸친 긴 SQL을 작성하려면 줄마다 문자열 관련 객체의 append 메소드를 호출하거나 큰따옴표("")를 붙여줘야 한다. SQL 문자열 앞뒤로 다른 문자가 있으면 쿼리를 보기 힘들고 수정할 때 많이 불편하다.

마이바티스는 잘게 나눠져 있는 JDBC에 비해 여러 개의 메소드 호출을 더 적은 수의 메솓 호출로 처리할 수 있는 API를 제공한다. 그리고 여러 줄에 걸친 SQL을 쉽게 작성하기 위해 SQL을 자바 코드에 정의하기보다는 XML에 정의해서 보기에도 편하고 수정할 때도 편하다.

마이바티스는 JDBC를 좀더 편하게 사용하게 기능을 제공하기 위해 몇 가지 프로젝트로 나눠서 개발 중이고, 각 프로젝트별로 결과물을 제공한다.

여타의 캐시 제품을 마이바티스에서 편하게 사용하도록 연동 모듈을 제공하기도 한다. 그리고 마이바티스는 자바뿐 아니라 함수형 언어인 스칼라와 닷넷에서 사용하는 마이바티스도 제공한다.

 

마이바티스 프로젝트

마이바티스는 코어 프레임워크, 마이바티스 제너레이터, 스키마 마이그레이션의 3가지 프로젝트로 구성된다.

  • 코어 프레임워크 JDBC를 단순화하고 SQL을 XML에 정의하게 해주는 마이바티스의 가장 큰 부분을 차지한다. 이후 마이바티스라는 지칭은 모두 코어 프레임워크를 가리킨다.
  • 마이바티스 제너레이터 자바로 데이터베이스 프로그래밍을 하다 보면 테이블별로 SQL을 만들거나 조회 결과를 담는 자바 모델 클래스 등을 필수로 만들게된다. 테이블이 많거나 개발 도중에 빈번하게 변경이 발생하면 테이블별로 SQL이나 자바의 모델 클래스를 만드는 데 시간이 많이 사용된다. 데이터베이스를 사용할 때 조인을 사용해 데이터를 가져올 때를 제외하면 테이블별로 만드는 SQL과 자바 모델 클래스는 비슷한데, 마이바티스 제너레이터는 테이블별로 SQL과 자바 모델 클래스를 자동으로 만들어준다.
  • 스키마 마이그레이션 데이터베이스가 변경되면 그에 맞게 마이바티스 관련 파일을 변경해주는 도구다. 운영 중인 시스템의 데이터베이스를 변경하는 일은 거의 없기 때문에 기회가 많지는 않다.

 

다른 언어를 위한 마이바티스

  • 스칼라 마이바티스 스칼라는 자바의 JVM 위에서 동작하는 함수형 언어다. 자바를 만든 구성원 중 한 명인 마틴 오더스키가 만들었다. 자바에서 사용하던 각종 라이브러리도 그대로 사용할 수 있고, 자바의 객체지향 특징도 모두 갖고 있기 때문에 자바용 마이바티스 프로젝트에 포함돼 있다. 참고 사이트 http://www.scala-lang.org/
  • 닷넷 마이바티스 마이크로소프트 사의 닷넷을 지원하는 마이바티스다. 참고 사이트 https://code.google.com/p/mybatisnet/

 

연동 모듈

  • 스프링 연동 모듈 스프링 프레임워크는 최근 자바 개발자가 가장 많이 사용하는 프레임워크다. 웹, 배치, 소셜 등의 다양한 기능을 제공한다. 스프링 연동 모듈은스프링과 마이바티스를 연동하는 API를 제공한다. 스프링의 개발 방식에 따라 팩토리 패턴과 템플릿 패턴 등을 사용하고, 트랜잭션은 스프링이 처리하게 위임한다.
  • 구글쥬스 연동 모듈 구글에서 만든 개발 프레임워크인 구글쥬스와 연동할 때 사용하는 모듈이다.
  • OsCache 캐시 연동 모듈 현재는 없어졌지만 과거 오픈심포니에서 호스팅하던 캐시 라이브러리다. 마이바티스가 제공하는 캐시를 사용하지 않고 마이바티스와 OsCache를 함께 사용하기 편하도록 기능을 제공한다.
  • EhCache 캐시 연동 모듈 OsCache와 더불어 가장 많이 사용하는 캐시 라이브러리는 EhCache다. OsCache가 더 이상 개발되지 않으면서 최근에 가장 많이 사용하는 캐시 라이브러리가 됐다. 마이바티스와 EhCache를 함께 사용하기 편하도록 기능을 제공한다.
  • Hazelcast 캐시 연동 모듈 마이바티스의 자체 캐시와 OsCache는 서버별로 개시를 저장하는 로컬 캐시다. 서버를 여러 대 두고 서비스할 때 서버마다 동일한 캐시 내용을 가지려면 여러 대의 서버가 동일한 캐시 내용을 볼 수 있게 분산 캐시를 사용해야 한다. Hazelcast는 분산 캐시를 지원하는 캐시 라이브러리다. 마이바티스와 Hazelcast를 함께 사용하기 편하도록 기능을 제공한다.

 

데이터 매퍼 마이바티스의 역사

 

'예전 포스팅 모음' 카테고리의 다른 글

ORACLE DB LINK 설정 및 JOIN  (0) 2015.04.27
자료구조의 개념  (0) 2015.02.13
마이바티스란?  (0) 2015.01.19
[강의필기] spring  (0) 2014.12.31
Ajax, xml, parser, json(JavaScript Object Notation), MVC pattern  (0) 2014.12.18