Web/Servlet-JSP

Servlet-JSP MVC05 - JDBC to Mybatis

now0204 2023. 6. 14. 17:58

이제 기존 JDBC를 Mybatis로 교체해보자.

 

1. SqlSessionFactory(Connection Pool) 객체 얻기

 

Mybatis의 중요한 특징 중 하나는 Connection Pool을 이용하여 DB 연결과 해제 시간을 줄여준다는 것이다.

다음과 같은 방법으로 Connection Pool을 얻을 수 있다.

public class MemberDAO {
 private static SqlSessionFactory sqlSessionFactory; //Connection Pool을 가리킬 참조변수
 	//초기화 블럭
 	static {
 		try {
 		String resource = "kr/bit/mybatis/config.xml"; // 미리만들어둔 config.xml파일 (경로/로구분)
 		InputStream inputStream = Resources.getResourceAsStream(resource); //파일 읽기 위한 io 객체 얻기
 		sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //생성완료
 		}catch(Exception e) {e.printStackTrace();}
 		
 		}
 
}

 * try - catch는 InputStream을 만드면서 파일이 존재하지 않을 경우 발생하는 error을 처리하기 위함이다.

 * sqlSessionFactory에는 sqlsession들이 있으며, 이는 JDBC에 Connection+Statement의 역할을 동시에 하는 객체이다.

 

2. MemberList 얻기 

 

먼저 memberList를 DB로 부터 받아오는 메서드를 작성해보자

public List<MemberVO> memberList(){
   //sqlsession을 얻고
  	SqlSession session = sqlSessionFactory.openSession();
    
   //sql발생시키고 전달받은 결과 담고 return
   List<MemberVO> list = session.selectList("sql문장과 관련된?");
   
   return list;
}

selectList()는 sql문장을 통해 전달받은 결과를 List형태로 묶어서 return하는 역할을 한다.

그렇다면 sql은 어떻게 실행해야할까?

만약 sql문장을 여기에 그냥 넣는다면, JDBC와 다를바가 없다.

mapper파일로부터 sql문장을 얻어오도록 하자.

 

Mapper.xml파일 mapper태그 밑에 다음을 추가하자
 <select id="memberList" resultType="kr.bit.model.MemberVO">select * from member</select>

 다음과 같이 html태그 형식으로 sql문을 작성해 둘 수 있다.

- id는 맵퍼파일과 모델파일 (sql-자바코드) 사이에서 맵핑을하는 key의 역할을 한다.  

- resultType은 sql결과로 얻어온 값을 담을 그릇을 설정한다. member테이블에 모든 속성값을 행단위로 읽어서 MemberVO객체에 담아서 return하겠다는 의미이다. 

- 위 과정을 JDBC에서는 for문을 돌려가면서 하나하나 MemberVo객체에 엮었지만, mybatis는 이를 자동으로 처리해준다.

 

(자동으로 처리하는 과정은 JDBC와 다를바가 없다 따라서 VO객체는 JavaBeans형식을 잘 지키고,

VO 멤버변수의 이름과 member테이블의 속성명칭을 잘 맞춰두자..)

 

* resultType에 모든 경로를 매번 적어주는 것은 귀찮다 config.xml MemberVO의 경로를 추가해두자

<configuration>
<properties resource="kr/bit/mybatis/db.properties"/>

  클래스 경로 미리 추가하는 부분
 <typeAliases>
 <typeAlias type="kr.bit.model.MemberVO" alias="memberVO"/>
 <typeAlias type="class경로" alias="Mapper에서 사용할 별칭"/>
 </typeAliases>
 ----------------------------------
 
<environments default="development">
    <environment id="development">

이제 마무리 해보면

public List<MemberVO> memberList(){

SqlSession session = sqlSessionFactory.openSession();
List<MemberVO> list = session.selectList("memberList");
session.close() // Connection반납
return list
}

위와 같이 mapper파일에 id를 넣어서 처리할 수 있다.

 

 

3. MemberInsert해보기 (commit 발생 트랜잭션)

 

3.1 메서드

public int memberInsert(MemberVO vo){

SqlSession session = sqlSessionFactory.openSession();
int cnt = session.insert("memberInsert",vo);    
session.commit();
session.close();
return cnt;
}

insert()는 파라미터로 id와 DB에 Insert할 데이터를 담은 VO같은 객체를 받아서 처리한다.

처리 후 성공시 1을 return한다.(실패시0)

insert()와 같이 DB에 영향을 주는 트랜잭션들은 commit()을 해야 정상작동한다.

 

3.2 mapper설정

<insert id="memberInsert" parameterType="memberVO">
insert into member(id,pass,name,age,email,phone) values(#{id},#{pass},#{name},#{age},#{email},#{phone})
</insert>

mapper에서 insert()에서 넘어온 parameter를 확인하고 sql문을 실행한다. 이때 MemberVO에 담긴 객체를 읽어올 때 

#{}을 통해 구분하여 읽어온다. (넘어온 파라미터 값들은 #{}을통해 처리)

 

 

 

 

마지막으로 정리해보면,

 

1- 먼저 Connection Pool을 만들기 위해 SqlSessionFactory객체를 얻어야한다. 이는 config.xml을 resource로 생성된다. 

 

2- Connection Pool을 통해 SqlSession객체를 얻고 이를 통해 DB작업을 할때 Mapper에 id를 매개변수로 전달

  (다른 매개변수도 메서드에 따라 전달가능)

 

3- Mapper파일에서 동일 id를 가진 태그에 sql문장을 실행

       * 이때 prameterType - SqlSession으로부터 전달받은 객체 , resultType - sql결과로 return할 객체등을 속성으로 설정              할 수 있다.

       *  parameter들은 #{}식으로 sql문장에 포함시킬 수 있다.

 

4- SqlSession에 메서드에 따라 insert,delete,select등이 자동으로 처리되고, 실행결과를 return한다.

       * API내부 실행과정은 JDBC의 것과 크게 다르지 않다

 

 

 

 참고자료: 나프2탄 (인프런) - 박매일

https://www.inflearn.com/course/%EB%82%98%ED%94%84-mvc-2

 

[NarP Series] MVC 프레임워크는 내 손에 [나프2탄] - 인프런 | 강의

본 과정은 WEB MVC 프레임워크가 무엇이고 WEB MVC 프레임워크가 어떻게 변형이 되면서 Spring WEB MVC 프레임워크로 넘어가는지 TPC(생각하고-표현하고-코딩하고) 기법을 통해 단계적으로 학습하고 이

www.inflearn.com