본문 바로가기
교재 실습/자바 웹 개발 워크북

103. mybatis 적용 (1)

by Jint 2022. 8. 28.

이제 웹 애플리케이션에 mybatis를 적용해 본다. 이전 절에서는 mybatis를 사용하는데 필요한 라이브러리 파일(JAR)을 준비하였고, 이번 절에서는 그 라이브러리에 들어있는 클래스를 사용하여 데이터를 처리해 본다.

 

1. mybatis 구동하기

다음 그림은 mybatis를 이용하여 프로젝트 목록을 가져오는 시나리오이다.

그림 1 (mybatis를 이용한 프로젝트 목록 가져오기 시나리오)

① MySqlProjectDao 클래스는 SqlSessionFactory 객체에게 SQL을 실행할 객체를 요구한다.

② SqlSessionFactory 객체는 SqlSession 객체를 생성하여 반환한다.

③ MySqlProjectDao 클래스는 SqlSession 객체에게 SQL 실행을 요청한다.

④ SqlSession 객체는 SQL이 저장된 맵퍼 파일에서 SQL을 찾는다.

⑤ SqlSession 객체는 JDBC 드라이버를 통해 데이터베이스에 질의를 실행한다.

⑥ SqlSession 객체는 데이터베이스로부터 가져온 데이터로 Project 목록을 생성하여 반환한다.

⑦ MySqlProjectDao 클래스는 사용이 끝난 SqlSession 객체를 닫는다.

앞의 시나리오를 보면 데이터베이스로부터 데이터를 가져오는 것은 mybatis 프레임워크의 몫이다. 개발자는 더 이상 JDBC 프로그래밍을 하지 않는다. 대신 DAO에 있는 SQL 문을 별도의 파일로 분리해야 한다.

 

2. mybatis 프레임워크의 핵심 컴포넌트

프레임워크를 사용할 때는 그 프레임워크의 핵심을 담당하는 컴포넌트를 먼저 파악하는 것이 중요하다. 다음은 mybatis의 핵심 컴포넌트를 정리한 표이다.

컴포넌트 설명
SqlSession 실제 SQL을 실행하는 객체. 이 객체는 SQL을 처리하기 위해 JDBC 드라이버를 사용함.
SqlSessionFactory SqlSession 객체를 생성함.
SqlSessionFactoryBuilder mysql 설정 파일의 내용을 토대로 SqlSessionFactory를 생성함.
mysql 설정 파일 데이터베이스 연결 정보, 트랜잭션 정보, mybatis 제어 정보 등의 설정 내용을 포함하고 있음. SqlSessionFactory를 만들 때 사용됨.
SQL 맵퍼 파일 SQL문을 담고 있는 파일. SqlSession 객체가 참조함.

 

3. DAO에서 SqlSessionFactory 사용

먼저 SqlSession 객체를 사용하는 DAO를 만들어본다. spms.dao.MySqlProjectDao 클래스를 다음과 같이 변경한다.

package spms.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

import spms.annotation.Component;
import spms.vo.Project;

//mybatis적용
@Component("projectDao")
public class MySqlProjectDao implements ProjectDao {
	
	//SqlSessionFactory 인터페이스
	SqlSessionFactory sqlSessionFactory;
	
	/**
	 * SqlSessionFactory 인터페이스 객체 주입
	 * @param sqlSessionFactory
	 */
	public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
		this.sqlSessionFactory = sqlSessionFactory;
	}
	
	/**
	 * 프로젝트 목록 조회
	 * @return sqlSession.selectList("spms.dao.ProjectDao.selectList")
	 */
	public List<Project> selectList() throws Exception {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		try {
			return sqlSession.selectList("spms.dao.ProjectDao.selectList");
		} finally {
			sqlSession.close();
		}
	}

	/**
	 * 프로젝트 등록
	 * @param project
	 * @return count
	 */
	public int insert(Project project) throws Exception  {
		SqlSession sqlSession = sqlSessionFactory.openSession();
		try {
			int count = sqlSession.insert("spms.dao.ProjectDao.insert", project);
			sqlSession.commit();
			return count;
		} finally {
			sqlSession.close();
		}
	}
	
	/**
	 * 프로젝트 상세정보 조회
	 * @param no
	 * @return sqlSession.selectOne("spms.dao.ProjectDao.selectOne", no)
	 */
	public Project selectOne(int no) throws Exception { 
		SqlSession sqlSession = sqlSessionFactory.openSession();
		try {
			return sqlSession.selectOne("spms.dao.ProjectDao.selectOne", no);
		} finally {
			sqlSession.close();
		}
	}

	/**
	 * 프로젝트 수정
	 * @param project
	 * @return count
	 */
	public int update(Project project) throws Exception { 
		SqlSession sqlSession = sqlSessionFactory.openSession();
		try {
			int count = sqlSession.update("spms.dao.ProjectDao.update", project);
			sqlSession.commit();
			return count;
		} finally {
			sqlSession.close();
		}
	}  

	/**
	 * 프로젝트 삭제
	 * @param no
	 * @return count
	 */
	public int delete(int no) throws Exception {  
		SqlSession sqlSession = sqlSessionFactory.openSession();
		try {
			int count = sqlSession.delete("spms.dao.ProjectDao.delete", no);
			sqlSession.commit();
			return count;
		} finally {
			sqlSession.close();
		}
	}
	
}

이전 코드와 비교하면 코드의 양이 매우 줄었다. JDBC 관련 코드는 눈 씻고 찾아봐도 없다. 앞의 코드를 하나씩 살펴본다.

 

- 의존 객체 SqlSessionFactory

이전에는 데이터베이스 커넥션을 얻기 위해서 DataSource 객체가 필요했다. 그래서 다음과 같이 DataSource에 대한 인스턴스 변수와 셋터 메서드를 선언하였다.

//DataSource 인터페이스
DataSource ds;

//DataSource 인터페이스 객체 주입
public void setDataSource(DataSource ds) {
    this.ds = ds;
}

그러나, mybatis를 사용한다면 DataSource 객체는 더 이상 필요 없다. 대신 SqlSessionFactory 객체가 필요하다. 다음은 SqlSessionFactory 객체를 저장할 인스턴스 변수와 셋터 메서드를 선언한 것이다.

//SqlSessionFactory 인터페이스
SqlSessionFactory sqlSessionFactory;

/**
 * SqlSessionFactory 인터페이스 객체 주입
 * @param sqlSessionFactory
 */
public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
    this.sqlSessionFactory = sqlSessionFactory;
}

SqlSessionFactory 객체는 SQL을 실행할 때 사용할 도구를 만들어 준다.

 

참고도서 : https://freelec.co.kr/book/1674/

 

[열혈강의] 자바 웹 개발 워크북

[열혈강의] 자바 웹 개발 워크북

freelec.co.kr

댓글