-
Servlet-JSP MVC05 - JDBC to MybatisWeb/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
'Web > Servlet-JSP' 카테고리의 다른 글
Servlet-JSP MVC04 (2) - handlerMapping and viewResolver (0) 2023.06.16 Servlet-JSP MVC04(1) - FrontController and POJO (0) 2023.06.16 Servlet-JSP MVC05 - mybatis 설치 및 기본설정 (0) 2023.06.14 Servlet - JSP MVC03 - JSTL and EL (1) 2023.06.13 Servlet-JSP MVC03 (1) - forward and Redirect (0) 2023.06.13