일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- JavaScript
- 주니어개발자
- type assertion
- prettier-plugin-tailwindcss
- 명시적 타입 변환
- Render Queue
- CS
- 좋은 PR
- TypeScript
- Sparkplug
- docker
- React.memo
- react
- Event Loop
- useLayoutEffect
- Headless 컴포넌트
- AJIT
- useMemo
- linux 배포판
- 암묵적 타입 변환
- 타입 단언
- Microtask Queue
- useCallback
- useEffect
- Dockerfile
- task queue
- Custom Hook
- Compound Component
- 프로세스
- prettier
- Today
- Total
구리
TIL_210629_Spring & MyBatis 연동 본문
목차
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 설정 파일 복사 및 수정
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 객체를 생성하려면 DataSource와 SQL 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의 코드를 수정할 필요가 없게 되기에 유지보수가 더 편해집니다.