이제 웹 애플리케이션에 mybatis를 적용해 본다. 이전 절에서는 mybatis를 사용하는데 필요한 라이브러리 파일(JAR)을 준비하였고, 이번 절에서는 그 라이브러리에 들어있는 클래스를 사용하여 데이터를 처리해 본다.
1. mybatis 구동하기
다음 그림은 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
'교재 실습 > 자바 웹 개발 워크북' 카테고리의 다른 글
105. mybatis 적용 (3) (1) | 2022.08.30 |
---|---|
104. mybatis 적용 (2) (0) | 2022.08.29 |
102. mybatis 소개 (2) | 2022.08.27 |
101. 퍼시스턴스 프레임워크의 도입 도입부 및 환경설정 (0) | 2022.08.25 |
100. 실력 향상 훈련 (6) (0) | 2022.08.24 |
댓글