ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Servlet-JSP MVC05 - JDBC to Mybatis
    Web/Servlet-JSP 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

     

Designed by Tistory.