Play! Framework 2.2.0 x MariaDB 5.5.32 x Mybatis 3.1

hibernate로 계속 테스트를 했었지만 아직도 Mybatis에 비해 낯설다. 일단 Mybatis를 한 번 써보자.

라인업은 제목과 동일.

일단 Play를 이용해서 프로젝트는 생성했고 eclipse에 맞게 프로젝트 구조도 생성했다.
먼저 Build.scala 파일에 디펜던시 추가.
하려고 보니 버전이 올라가면서 project 폴더에 있던 Build.scala가 사라졌다. 찾아보니 이제 root 폴더에 build.sbt 로 바뀌었다는 얘기.
추가하는 방법은 비슷하다.

libraryDependencies ++= Seq(
	"org.mybatis" % "mybatis" % "3.1.1",
	"mysql" % "mysql-connector-java" % "5.1.26",
	javaCore,
	javaJdbc,
	cache
)

그리고 application.conf 파일에 db관련 변수들을 추가해 준다.

#Mybatis configuration
mybatis.configuration=mybatis/configuration.xml

# You can expose this datasource via JNDI if needed (Useful for JPA)
# db.default.jndiName=DefaultDS
db.dottegidb.driver=com.mysql.jdbc.Driver
db.dottegidb.url=${?LOCAL_MYSQL_URL}
db.dottegidb.user=${?LOCAL_MYSQL_USER}
db.dottegidb.password=${?LOCAL_MYSQL_PASSWORD}

db.dottegidb.jndiName=DefaultDS
*저기 값 부분에 있는 것들은 .bash_profile에 설정해 둔 변수들이다. application.conf에 민감한 정보를 직접 올리면 안되기 때문에 저렇게 해둔 것이고 .bash_profile에는 아래와 같이 추가되어 있다.

export LOCAL_MYSQL_USER="xxxxx"
export LOCAL_MYSQL_PASSWORD="yyyyyy"
export LOCAL_MYSQL_URL=jdbc:mysql://127.0.0.1/dottegidb

돌려본다.
play application 실행하고 일단 잘 뜨면 설정은 성공.

~/Project/workspace/dottegi/dottegi_server> play debug
Listening for transport dt_socket at address: 9999
[info] Loading project definition from /Users/yangsaerohoon/Project/workspace/dottegi/dottegi_server/project
[info] Set current project to dottegi_server (in build file:/Users/yangsaerohoon/Project/workspace/dottegi/dottegi_server/)
       _
 _ __ | | __ _ _  _
| '_ \| |/ _' | || |
|  __/|_|\____|\__ /
|_|            |__/

play 2.2.0 built with Scala 2.10.2 (running Java 1.7.0_25), http://www.playframework.com

> Type "help play" or "license" for more information.
> Type "exit" or use Ctrl+D to leave this console.

[dottegi_server] $ run
[info] Updating {file:/Users/yangsaerohoon/Project/workspace/dottegi/dottegi_server/}dottegi_server...
[info] Resolving org.fusesource.jansi#jansi;1.4 ...
[info] downloading http://repo1.maven.org/maven2/org/mybatis/mybatis/3.1.1/mybatis-3.1.1.jar ...
[info] [SUCCESSFUL ] org.mybatis#mybatis;3.1.1!mybatis.jar (1891ms)
[info] downloading http://repo1.maven.org/maven2/mysql/mysql-connector-java/5.1.26/mysql-connector-java-5.1.26.jar ...
[info] [SUCCESSFUL ] mysql#mysql-connector-java;5.1.26!mysql-connector-java.jar (1260ms)
[info] Done updating.

--- (Running the application from SBT, auto-reloading is enabled) ---

[info] play - Listening for HTTP on /0:0:0:0:0:0:0:0:9000

(Server started, use Ctrl+D to stop and go back to the console...)

[info] play - datasource [jdbc:mysql://127.0.0.1/dottegidb] bound to JNDI as DefaultDS
[info] play - database [dottegidb] connected at jdbc:mysql://127.0.0.1/dottegidb
[info] play - Application started (Dev)

[success] Total time: 35 s, completed 2013. 10. 24 오후 3:53:21

브라우저에서 http://localhost:9000/ 으로 접속해서 잘 뜨나 본다. 디펜던시 다운 못 받으면 안되니까 만약 안되면 play 종료했다가 다시 켜서 해본다. 좀 있으면 될 때 있음.
그리고 잘 되면 eclipse 프로젝트도 업데이트 해주는 걸 잊지 않는다. 어떻게 하냐면 아래와 같이.

[dottegi_server] $ eclipse
[info] About to create Eclipse project files for your project(s).
[info] Successfully created Eclipse project files for project(s):
[info] dottegi_server
[dottegi_server] $

이거 안해주면 정작 디펜던시는 다운받았는데 이클립스 프로젝트에는 적용이 안돼서 죽어라 새로고침하고 클린에 빌드 새로 해봐야 라이브러리같은거 import를 못한다.
일단 db 연결까지는 잘 된것 같다. 이제 실제로 CRUD를 해봐야지.

다음으로 application.conf에 설정한 것처럼 mybatis용 configuration 파일을 만든다. 설정한 폴더를 conf 폴더 하위에 생성하고(conf/mybatis) 그 안에 configuration.xml 파일을 생성한다. 파일의 내용은 아래와 같다.


이제 Mybatis session을 생성하는 클래스를 생성한다. 위치는 아무데나.

package util;

import java.io.IOException;
import java.io.Reader;
import java.util.Properties;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import play.Configuration;
import play.Play;

public class MyBatisFactory {

	private static MyBatisFactory instance;
	private static String svrName = "dottegidb";

	{
		instance = new MyBatisFactory();
	}

	public synchronized static SqlSession getDefaultClient() {

		return newSqlSession();
	}

	public static SqlSession newSqlSession() {

		Properties props = new Properties();
		Configuration config = Play.application().configuration();

		String resource = config.getString("mybatis.configuration");

		Reader reader;

		try {
			reader = Resources.getResourceAsReader(resource);
		} catch (IOException e) {
			throw new RuntimeException(e);
		}

		props.setProperty("driver", config.getString("db.dottegidb.driver"));
		props.setProperty("url", config.getString("db.dottegidb.url"));
		props.setProperty("user", config.getString("db.dottegidb.user"));
		props.setProperty("password", config.getString("db.dottegidb.password"));

		SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader, props);

		return sessionFactory.openSession();
	}
}

다음은 sql query를 작성할 mapper를 만든다. 위치는 아까 configuration.xml에 명시한 것처럼 mybatis 폴더의 하위에 mapper라는 폴더를 생성하면 된다. 파일 이름은 일단 sample.xm

마지막으로 테스트를 위해 테스트케이스를 작성... 은 귀찮으니까 일단 원래 있는 controller를 이용하여 간단한 코드를 작성한 뒤에 콘솔로 확인.

package controllers;

import org.apache.ibatis.session.SqlSession;

import play.*;
import play.mvc.*;

import util.MyBatisFactory;
import views.html.*;

public class Application extends Controller {

    public static Result index() {

    	SqlSession sqlSession = MyBatisFactory.getDefaultClient();

    	System.out.println(sqlSession.selectList("sample.searchList"));

        return ok(index.render("Your new application is ready."));
    }

}

운명의 시간... 테스트용 데이터도 넣어뒀고 했으니 이제 돌려본다.

~/Project/workspace/dottegi/dottegi_server> play debug
Listening for transport dt_socket at address: 9999
[info] Loading project definition from /Users/yangsaerohoon/Project/workspace/dottegi/dottegi_server/project
[info] Set current project to dottegi_server (in build file:/Users/yangsaerohoon/Project/workspace/dottegi/dottegi_server/)
       _
 _ __ | | __ _ _  _
| '_ \| |/ _' | || |
|  __/|_|\____|\__ /
|_|            |__/

play 2.2.0 built with Scala 2.10.2 (running Java 1.7.0_25), http://www.playframework.com

> Type "help play" or "license" for more information.
> Type "exit" or use Ctrl+D to leave this console.

[dottegi_server] $ run

--- (Running the application from SBT, auto-reloading is enabled) ---

[info] play - Listening for HTTP on /0:0:0:0:0:0:0:0:9000

(Server started, use Ctrl+D to stop and go back to the console...)

[info] play - datasource [jdbc:mysql://127.0.0.1/dottegidb] bound to JNDI as DefaultDS
[info] play - database [dottegidb] connected at jdbc:mysql://127.0.0.1/dottegidb
[info] play - Application started (Dev)
[{followedby_count=0, sex=m, status=0, reg_time=2013-10-24 17:22:50.0, bio1=없습니다., bio2=없습니다2, private=f, currency=won, id=1, user_name=test, follows_count=0, email=test@gmail.com, cellphone=01011112222, item_count=0, full_name=test user}]

잘되네.
사실 중간에 username 설정 때문에 약간 문제가 있었지만 별거 아니었으니 그냥 넘어간다.
이제 다음에는 제대로 CRUD 하는 걸 테스트. 이건 여기까지.

댓글 1개: