구리

TIL_210629_Spring & MyBatis 연동 본문

카테고리 없음

TIL_210629_Spring & MyBatis 연동

guriguriguri 2021. 6. 29. 16:59

목차

1. 라이브러리 다운
2. Mybatis 설정 파일 복사 및 수정
3. 스프링 연동 설정
4-1. DAO 클래스 구현 (SqlSessionDaoSupport 클래스 상속)
4-2. DAO 클래스 구현 (SqlSessionTemplate를 <bean> 등록하여 사용)
5. Dynamic SQL로 검색 처리

 

 

 

1. 라이브러리 다운

pom.xml에 추가 (BoardWeb)(mybatis-3.3.1.jar : 순수하게 Mybatis 관련 라이브러리, mybatis-spring-1.2.4.jar : Mybatis 와 스프링 연동하기 위한 라이브러리)

<!-- MyBatis -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.3.1</version>
		</dependency>
		
		<!-- MyBatis Spring -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>1.2.4</version>
		</dependency>

 

2. Mybatis 설정 파일 복사 및 수정

 

Mybatis 설정 파일 복사

sql-map-config.xml 파일 수정

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	
	<!-- Alias 설정 -->
	<typeAliases>
		<typeAlias alias="board" type="com.springbook.biz.board.BoardVO" />
	</typeAliases>
	
	<!-- SQL Mapper 설정 -->
	<mappers>
		<mapper resource="mappings/board-mapping.xml" />
	</mappers>
</configuration>

 

3. 스프링 연동 설정

스프링 설정 파일에 SqlSessionFactoryBean 클래스를 Bean 등록 => SqlSessionFactoryBean 객체로부터 DB 연동 구현에 사용할 SqlSession 객체 얻을 수 있습니다.

SqlSessionFactoryBean 객체가 SqlSession 객체를 생성하려면 DataSourceSQL Mapper 정보가 필요합니다.

applicationContext.xml
<bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource"/>
		<property name="configLocation" value="classpath:sql-map-config.xml" />
	</bean>

 

4-1. DAO 클래스 구현 (SqlSessionDaoSupport 클래스 상속)

package com.springbook.biz.board.impl;

import java.util.List;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.springbook.biz.board.BoardVO;

// DAO
@Repository
public class BoardDAOMybatis extends SqlSessionDaoSupport{
	@Autowired
	public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory){
		super.setSqlSessionFactory(sqlSessionFactory);
	}
	
	public BoardDAOMybatis() {	}
	
	// 글 등록
	public void insertBoard(BoardVO vo){
		System.out.println("===> Mybatis로 insertBoard() 기능 처리");
		getSqlSession().insert("BoardDAO.insertBoard", vo);
	}
		
	// 글 수정
	public void updateBoard(BoardVO vo){
		System.out.println("===>Mybatis로 updateBoard() 기능 처리");
		getSqlSession().update("BoardDAO.updateBoard", vo);
	}
		
	// 글 삭제
	public void deleteBoard(BoardVO vo){
		System.out.println("===>Mybatis로 deleteBoard() 기능 처리");
		getSqlSession().delete("BoardDAO.deleteBoard", vo);
	}
		
	// 글 상세 조회 
	public BoardVO getBoard(BoardVO vo){
		System.out.println("===>Mybatis로 getBoard() 기능 처리");
		return (BoardVO)getSqlSession().selectOne("BoardDAO.getBoard", vo);
	}
		
	// 글 목록 조회
	public List<BoardVO> getBoardList(BoardVO vo){
		System.out.println("===>Mybatis로 getBoardList() 기능 처리");
		return getSqlSession().selectList("BoardDAO.getBoardList", vo);
	}
}

@Autowired로 스프링 컨테이너가 setSqlSessionFactory() 메소드를 자동으로 호출 => <bean> 등록한 SqlSessionFactoryBean 객체를 인자로 받게 됩니다.

SqlSessionDaoSupport 클래스로부터 상속된 getSqlSession() 호출하여 SqlSession 객체를 리턴받아 CRUD 관련 메소드를 이용하여 DB 연동을 처리합니다.

 

4-2. DAO 클래스 구현 (SqlSessionTemplate를 <bean> 등록하여 사용)

applicationContext.xml
<!-- Spring & Mybatis 연동 설정(2) -->
	<bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource"/>
		<property name="configLocation" value="classpath:sql-map-config.xml" />
	</bean>
	
	<bean class="org.mybatis.spring.SqlSessionTemplate">
		<constructor-arg ref="sqlSession"></constructor-arg>
	</bean>

SqlSessionTemplate 클래스는 setter 메소드가 없기에 생성자 메소드를 이용한 의존성 주입으로 처리 후 DAO 클래스 구현시 SqlSessionTemplate 객체를 @Autowired 이용하여 의존성 주입 처리합니다.

 

BoardDAOMybatis 및 BoardServiceImpl 클래스 코드 수정

package com.springbook.biz.board.impl;

import java.util.List;

import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import com.springbook.biz.board.BoardVO;

// DAO
@Repository
public class BoardDAOMybatis{
	@Autowired
	private SqlSessionTemplate mybatis;
	
	public BoardDAOMybatis() {	}
	
	// 글 등록
	public void insertBoard(BoardVO vo){
		System.out.println("===> Mybatis로 insertBoard() 기능 처리");
		mybatis.insert("BoardDAO.insertBoard", vo);
	}
		
	// 글 수정
	public void updateBoard(BoardVO vo){
		System.out.println("===>Mybatis로 updateBoard() 기능 처리");
		mybatis.update("BoardDAO.updateBoard", vo);
	}
		
	// 글 삭제
	public void deleteBoard(BoardVO vo){
		System.out.println("===>Mybatis로 deleteBoard() 기능 처리");
		mybatis.delete("BoardDAO.deleteBoard", vo);
	}
		
	// 글 상세 조회 
	public BoardVO getBoard(BoardVO vo){
		System.out.println("===>Mybatis로 getBoard() 기능 처리");
		return (BoardVO)mybatis.selectOne("BoardDAO.getBoard", vo);
	}
		
	// 글 목록 조회
	public List<BoardVO> getBoardList(BoardVO vo){
		System.out.println("===>Mybatis로 getBoardList() 기능 처리");
		return mybatis.selectList("BoardDAO.getBoardList", vo);
	}
}
@Service("boardSerivce")
public class BoardServiceImpl implements BoardService {
	@Autowired
	private BoardDAOMybatis boardDAO;
}

 

위와 같이 코드 수정 후 test 코드 실행시 결과가 정상적으로 출력됩니다.

package com.springbook.biz.board;

import java.util.List;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;

public class BoardServiceClient {

	public static void main(String[] args) {
		// 1. Spring Container 구동
		AbstractApplicationContext container = new GenericXmlApplicationContext("applicationContext_aop.xml");
		
		// 2. Spring Container로부터 BoardServiceImpl 객체를 요청(lookup)
		BoardService boardService = (BoardService) container.getBean("boardSerivce");
	
		// 3. 글 등록 기능 테스트
		BoardVO vo = new BoardVO();
//		vo.setTitle("mybatis 임시 제목!");
//		vo.setWriter("MyBatis");
//		vo.setContent("MyBatis Coding Test!!");
//		boardService.insertBoard(vo);
		
		// 4. 글 목록 검색 기능 테스트
		vo.setSearchKeyword("");
		List<BoardVO> boardList = boardService.getBoardList(vo);
		for(BoardVO board : boardList){
			System.out.println("---> " + board.toString());
		}
		
		// 5. 자원 해제
		container.close();
	}
}

결과 사진

 

5. Dynamic SQL로 검색 처리

Dynamic SQL : SQL의 재사용성과 유연성을 향상하고자 다양한 쿼리를 DB에 전송하는 기능 제공 (SQL 중복 문제 해결)

board-mapping.xml
<select id="getBoardList" resultMap="boardResult">
			SELECT * 
			FROM BOARD 
			WHERE 1 = 1
			<if test="searchCondition == 'TITLE'">
				AND TITLE LIKE '%'||#{searchKeyword}||'%' 
			</if>
			<if test="searchCondition == 'CONTENT'">
				AND CONTENT LIKE '%'||#{searchKeyword}||'%' 
			</if>
			ORDER BY SEQ DESC
</select>

<if>라는 동적 요소를 사용하여 조건에 따른 분기 처리를 하고 있습니다. 이렇게 동적 엘리먼트를 이용해 SQL을 처리할 수 있으므로 검색과 관련된 쿼리는 1개만 존재해도 됩니다. 그리고 새로운 검색 조건이 추가되어도 BoardDAOMybatis의 코드를 수정할 필요가 없게 되기에 유지보수가 더 편해집니다.