2020. 8. 11. 02:21ㆍSpring/Spring
1. Mybatis 프레임워크
1) Mybatis 구조
Sql-Map-Config.xml 파일은 Mybatis의 메인 환경 설정 파일이다. Mybatis는 이 파일을 읽어 어떤 DBMS 연결을 할지, 어떤 SQL Mapper XML 파일들이 등록되어 있는지 알 수 있다. Mybatis는 board-mapping.xml 파일의 SQL 명령어를 Map 구조로 저장하여 관리한다.
2) Mapper XML 파일 구조
Mybatis 프레임워크에서 가장 중요한 SQL 명령어가 저장되는 파일로, <mapper>를 루트 엘리먼트로 가지는 XML 파일이다. <!DOCTYPE ...>으로 선언된 DTD로 시작하여 하위에 <mapper> 루트 엘리먼트가 선언된다. <mapper> 엘리멘트에는 네임스페이스 속성을 통해 쉽게 유일한 SQL 아이디를 만들 수 있다. SQL 명령어를 DAO 클래스에서 사용할 때에는 네임스페이스와 아이디를 결합하여 참조한다.
2. 엘리먼트
1) <select> 엘리먼트
<select> 엘리먼트의 resultType 속성은 SQL 실행 시 ResultSet이 반환이 될 때, ResultSet에 저장된 검색 결과를 어떤 자바 객체에 매핑할지 지정하는데 사용한다. parameterType과 동일하게 <typeAlias>로 설정된 Alias로 간결하게 처리할 수 있다. resultType 속성은 <select> 엘리먼트에서 생략될 수 없는 속성이다. 예외로 resultType 대신 resultMap 속성을 사용할 수 있다.
2) <insert> 엘리먼트
<insert>는 자식 요소로 <selectKey> 엘리먼트를 사용할 수 있다. Mybatis에서는 <selectKey>를 이용하여 Auto Increment로 생성된 키를 쉽게 가져올 수 있는 방법을 제공한다.
<insert id="insertBoard" parameterType="board">
<selectKey keyProperty="seq" resultType="int">
select board_seq.nextval as seq from dual
</selectKey>
insert into board(seq, title, writer, content)
values (${seq}, ${title}, ${writer}, ${content})
</insert>
3) <update> 엘리먼트
데이터 수정 시 사용하는 엘리먼트다.
4) <delete> 엘리먼트
데이터 삭제 시 사용하는 엘리먼트다.
5) 공통 속성
parameterType 속성은 SQL 실행에 필요한 데이터를 외부에서 받아야 할 때 사용한다. 일반적으로 기본형이나 VO 형태의 클래스(com.springbook.biz.board.BoardVO)를 지정한다. 만약 sql-map-config.xml에 <typeAlias>로 Alias가 설정되어 있을 경우 더 간결하게 처리할 수 있다. 대부분 parameterType 속성을 생략하는 경우가 많다. 하지만 JOIN문을 이용한 쿼리문을 포함하는 경우나 테이블의 칼럼명과 매핑에 사용될 자바 객체의 변수명이 다를 때 매핑될 수 없는 경우가 있다. 그때 사용하는 속성이 resultMap이다.
resultMap을 사용하기 위해서는 <resultMap> 엘리먼트를 이용하여 매핑 규칙을 정의해야한다. PK에 해당하는 SEQ 컬럼만 <id> 엘리먼트를 사용하고 나머지는 <result> 엘리먼트를 사용하여 결과값을 BoardVO 객체 변수에 매핑한다. 그리고 이를 resultMap 속성으로 참조하여 사용한다.
<mapper namespace="BoardDAO">
<resultMap id="boardResult" type="board">
<id property="seq" column="SEQ" />
<result property="title" column="TITLE" />
<result property="writer" column="WRITER" />
<result property="content" column="CONTENT" />
<result property="regDate" column="REGDATE" />
<result property="cnt" column="CNT" />
</resultMap>
<select id="getBoardList" parameterType="board" resultMap="boardResult">
select * from board
where title like '%'||#{searchKeyword}||'%'
order by seq desc
</select>
</mapper>
6) CDATA Section 사용
SQL 구문 내에 '<' 기호를 사용 시 태그의 시작으로 여겨 처리하기 때문에 에러가 발생한다. 따라서 CDATA Section으로 SQL 구문을 감싸주어 해결한다. CDATA Section은 Mybatis와 상관없는 xml의 고유 문법으로 영역에 작성된 내용은 문자 데이터로 인식되어 처리된다.
<select id="getBoard" resultType="board">
<![CDATA[
select *
from board
where seq <= #{seq}
]]>
</select>
7) SQL 명령어
대부분 Mapper 파일에 등록되는 SQL 구문은 일반적으로 대문자를 사용한다.
8) board-mapping.xml
/src/main/resources
board-mapping.xml
3. Mybatis JAVA API
1) SqlSessionFactoryBuilder 클래스
모든 Mybatis 설정 이후 MyBatis 프레임워크가 제공하는 API를 통해 DAO 클래스를 구현한다. Mybatis로 DAO 클래스를 구현하기 위해서 SqlSession 객체를 사용해야한다. 또한 SqlSession 객체는 SqlSessionFactory로 부터 얻을 수 있기 때문에 SqlSessionFactory 객체를 먼저 생성해야한다.
SqlSessionFactory 객체는 SqlSessionFactoryBuilder의 build() 메서드를 통해 생성된다. 이 메서드는 Mybatis의 설정 파일인 sql-map-config.xml 파일을 로딩시켜 SqlSessionFactory 객체를 생성하고, sql-map-config.xml 파일을 로딩하기 위해 입력 스트림 Reader 객체를 사용한다.
Reader reader = Resources.getResourceAsReader("sql-map-config.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
2) SqlSessionFactory 클래스
SqlSession 객체의 공장 역할로 openSession 메서드를 이용하여 SqlSession 객체를 얻을 수 있도록한다.
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = sessionFacotry.openSession();
session.insert("BoardDAO.insertBoard", vo);
3) 유틸리티 클래스
데이터베이스 연동을 쉽게 처리하기 위해 Mybatis가 제공하는 SqlSession 객체를 이용해야한다. DAO 클래스에서 쉽게 객체를 획득할 수 있도록 공통으로 제공할 클래스를 만들어야한다. 현재까지 직접 SqlSessionFactoryBean 클래스를 생성하였지만, 추후에 스프링과 연동 시 프레임워크에서 제공하는 클래스를 이용하면 된다.
4) SqlSession
SqlSession 객체는 Mapper XML에 등록된 SQL을 실행하기 위한 다양한 API를 제공한다. 하나의 데이터를 검색하는 SQL 구문을 실행할 때 사용하는 selectOne() 메서드, 여러개의 데이터를 검색하는 SQL 구문을 실행할 때 사용하는 selectList() 메서드, 그 외 insert(), update(), delete() 메서드를 사용할 수 있다.
[참고] 스프링 퀵 스타트
'Spring > Spring' 카테고리의 다른 글
[Spring] Dynamic SQL 검색 처리 (0) | 2020.08.12 |
---|---|
[Spring] Mybatis 스프링 연동 (0) | 2020.08.12 |
[Spring] Mybatis 프레임워크 (1) (0) | 2020.08.08 |
[Spring] JSON 변환 (0) | 2020.08.07 |