102. mybatis 소개
mybatis는 반복적이고 지루한 JDBC 프로그래밍을 단순화하기 위해 클린턴 비긴(Clinton Begin)이 만든 작은 라이브러리에서 출발하였다. 이 라이브러리는 iBATIS라는 이름으로 2004년 아파치 소프트웨어 재단(Apache Software Foundation)에 기부되면서 널리 알려지게 되었고, 많은 개발자들의 호응을 얻게 된다. 이 프로젝트는 좀 더 효율적인 개발 관리를 목표로 2010년 6월에 아파치 소프트웨어 재단에서 구글 코드(Google Code)로 이사하였고 프로젝트 이름도 mybatis로 바꿨다. 현재는 4년간 지내왔던 구글 코드를 떠나 깃허브(github.com/mybatis)로 이사하였다.
mybatis의 핵심은 개발과 유지보수가 쉽도록 소스 코드에 박혀있는 SQL을 별도의 파일로 분리하는 것이다. 또한 단순하고 반복적인 JDBC 코드를 캡슐화하여 데이터베이스 프로그래밍을 간결하게 만드는 것이다. 다음 그림은 MySqlProjectDao 클래스로부터 분리된 SQL을 보여주고 있다(그림 1).
앞의 그림과 같이 기존의 MySqlProjectDao 클래스는 자바 코드와 SQL문이 섞여 있어 코드를 읽기가 어렵다. 또한, SQL문을 만들고자 문자열과 더하기(+) 연산자가 얽혀 있어 소스 코드가 매우 지저분하다. SQL문은 FROM절이나 WHERE절 앞에 공백이 있어야 하는데 문자열들을 붙이다 보면 생략하는 경우가 있어 이런 경우 SQL 구문 오류가 발생한다.
mybatis는 객체 관계 맵퍼와 달리 SQL문을 감추거나 대체하지 않는다. 오히려 개발자가 SQL문을 더 쉽게 작성하고 관리하도록 도와준다. 이를 위해 SQL을 별도의 파일로 분리한다. 이렇게 되면 SQL의 작성을 데이터베이스 및 업무 전문가에게 맡길 수 있다. 또한, mybatis가 제공하는 클래스를 사용하면 단순하고 지루한 JDBC 프로그래밍에서 탈출하여 업무관련 로직을 작성하는데 더 집중할 수 있다.
1. mybatis 사용하기
다음 그림은 DAO에서 mybatis를 사용하는 시나리오이다(그림 2).
① 데이터 처리를 위해 DAO는 mybatis에 제공하는 객체의 메서드를 호출한다.
② mybatis는 SQL문이 저장된 맵퍼 파일에서 데이터 처리에 필요한 SQL문을 찾는다.
③ mybatis는 맵퍼 파일에서 찾은 SQL을 서버에 보내고자 JDBC 드라이버를 사용한다.
④ JDBC 드라이버는 SQL문을 데이터베이스 서버로 보낸다.
⑤ mybatis는 SELECT문의 실행 결과를 값 객체에 담아서 반환한다. INSERT, UPDATE, DELETE문인 경우 입력, 변경, 삭제된 레코드의 개수를 반환한다.
2. mybatis 사용 준비
mybatis를 사용하려면 관련 라이브러리 파일을 내려받아야 한다.
https://github.com/mybatis에 접속한다. 프로젝트 목록에서 'mybatis-3'을 클릭한다(그림 3).
'mybatis-3' 프로젝트 홈의 아래로 내려가면, 'README.md'가 보인다. 여기에서 JAR 파일을 내려받기하는 링크를 클릭한다(그림 4).
목록에서 최신 버전인 'mybatis-3.5.10.zip' 링크를 클릭한다(그림 5).
mybatis-3.5.10.zip의 압축을 풀면 JAR 파일과 사용 설명을 담은 PDF 파일이 있다. lib폴더에는 mybatis가 의존하는 JAR 파일들이 들어있다(그림 6).
mybatis-3.5.10.jar 파일과 의존 라이브러리들을 web07/webapp/WEB-INF/lib 폴더에 복사한다. 단, 중복 파일이 있으면 버전이 낮은 파일을 삭제한다(그림 7).
예를 들어 앞의 그림에서는 세 개의 라이브러리가 중복되는데, 그 중에서 버전이 낮은 파일(javassist-3.16.1-GA.jar, slf4j-api-1.6.1.jar, slf4j-simple-1.6.1.jar)을 삭제하면 된다(그림 8).
이제 mybatis를 사용하기 위해 파일 준비는 끝났다. 다음 강의에서 mybatis를 적용해본다.
참고도서 : https://freelec.co.kr/book/1674/
[열혈강의] 자바 웹 개발 워크북
[열혈강의] 자바 웹 개발 워크북
freelec.co.kr