티스토리 뷰

[JAVA]/Mybatis

[Spring] Mybatis 사용

춘햄 2021. 6. 29. 17:47

이제 Mybatis 프레임워크의 기본 사용법을 익혔으니, 바로 Spring 프로젝트에 활용해보자.

거의 모든 부분이 동일하지만, Spring 프로젝트는 Java App이 아닌 Web App이기 때문에 SqlSession객체를 직접 생성하는 것이 아닌 bean 객체로 Spring 설정 파일에 등록하여 사용한다는 점이다. 

 

바로 확인해보자.


우선, 동일하게 Mybatis 라이브러리를 사용하기 위해 dependency 를 추가한다. 이때, 기존에 사용했던 Mybatis이외에 Spring에서 제공하는 Mybatis 라이브러리를 함께 설치한다.

 

◎pom.xml

<!--  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>

이런 dependency를 직접 작성하여 추가하기 번거롭다면, maven의 repository 링크를 이용해도 된다.

 

repository: https://mvnrepository.com/


다음으로 직전 포스팅까지 사용했던 mapping.xml, sql-map-config.xml 파일을 복사하여 Spring 프로젝트 내부로 가져오자.

이때, dataSource는 스프링 설정 파일에서 이미 생성했으므로 삭제해준다.

 

◎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.freeflux.biz.board.BoardVO"/>
	</typeAliases>
	
	<!--  Sql Mapper 설정 -->
	<mappers>
		<mapper resource="mappings/board-mapping.xml"/>
	</mappers>
</configuration>

이제, 비즈니스 로직을 담당하는 스프링 설정 파일인 application-context.xml 문서에 SqlSession을 bean 객체로 등록해줘야 한다.

 

◎application-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:p="http://www.springframework.org/schema/p"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
		http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd">

	<context:component-scan base-package="com.freeflux.biz"></context:component-scan>
	
	<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
	
	<!-- DataSource Configuration -->
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"></property>
		<property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:XE"></property>
		<property name="username" value="choonham"></property>
		<property name="password" value="6725"></property>
	</bean>
	
	<!-- Spring JdbcTemplate Configuration  -->
	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	
	<!--  SqlSessionFactory -->
	<bean id = "sessionFactory" class = "org.mybatis.spring.SqlSessionFactoryBean">
		<property name = "dataSource" ref = "dataSource"/>
		<property name = "configLocation" value = "classpath:sql-map-config.xml"/>
	</bean>
	
	<!-- Transaction Registration -->
	<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	
	<!-- Transaction Configuration -->
	<tx:advice id="txAdvice" transaction-manager="txManager">
		<tx:attributes>
			<tx:method name="get*" read-only="true"/>
			<tx:method name="*"/>
		</tx:attributes>
	</tx:advice>
	
	<!-- Transaction Advisor Configuration -->
	<aop:config>
		<aop:pointcut expression="execution(* com.freeflux.biz..*Impl.*(..))" id="txPointcut"/>
		<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
	</aop:config>
	
</beans>

 

이제 Mybatis를 이용하여 DAO 클래스를 구현해야 하는데, 방법은 크게 두 가지 이다.

 

1. SqlSessionDaoSupport 클래스 상속

 

◎BoardDAOBybatis

package com.freeflux.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.freeflux.biz.board.BoardVO;

@Repository
public class BoardDAOMybatis extends SqlSessionDaoSupport{
	
	@Autowired
	public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory){
		super.setSqlSessionFactory(sqlSessionFactory);
	}
	
	public void insertBoard(BoardVO vo) {
		super.getSqlSession().insert("BoardDAO.insertBoard", vo);
		super.getSqlSession().commit();
	}
	
	public void updateBoard(BoardVO vo) {
		super.getSqlSession().update("BoardDAO.updateBoard", vo);
		super.getSqlSession().commit();
	}

	public void deleteBoard(BoardVO vo) {
		super.getSqlSession().delete("BoardDAO.deleteBoard", vo);
		super.getSqlSession().commit();
	}
	
	public BoardVO getBoard(BoardVO vo) {
		return (BoardVO) super.getSqlSession().selectOne("BoardDAO.getBoard", vo);
	}
	
	public List<BoardVO> getBoardList(BoardVO vo) {
		return super.getSqlSession().selectList("BoardDAO.getBoardList", vo);
	}
	
}

이때, 기본 생성자 메서드에 @Autowired 를 작성하여 스프링 컨테이너가 자동으로 호출할 수 있도록 해준다.

 

2. SqlSessionTemplate 클래스를 bean 객체로 등록

 

◎application-context.xml

<!--  SqlSessionFactory -->
<bean id = "sessionFactory" 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="sessionFactory"></constructor-arg>
</bean>

위와 같이 bean 객체로 SqlSessionTemplate을 등록하여 DAO 클래스를 생성할 수도 있다. 하지만, SqlSessionTemplate 클래스에는 Setter 메서드가 없기 때문에 따로 property를 사용하여 inject 할 수 없으므로 위와 같이 constructor-arg를 사용하여 주입하는 것이다.

 

마찬가지로 @Autowired 를 사용하여 컨테이너가 객체를 생성할 수 있게 해준 뒤, DAO 를 구성하면 다음과 같다.

 

◎BoardDAOBybatis

package com.freeflux.biz.board.impl;

import java.util.List;

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

import com.freeflux.biz.board.BoardVO;

@Repository
public class BoardDAOMybatis{
	
	@Autowired
	private SqlSessionTemplate mybatis;
	
	public void insertBoard(BoardVO vo) {
		mybatis.insert("BoardDAO.insertBoard", vo);
		mybatis.commit();
	}
	
	public void updateBoard(BoardVO vo) {
		mybatis.update("BoardDAO.updateBoard", vo);
		mybatis.commit();
	}

	public void deleteBoard(BoardVO vo) {
		mybatis.delete("BoardDAO.deleteBoard", vo);
		mybatis.commit();
	}
	
	public BoardVO getBoard(BoardVO vo) {
		return (BoardVO) mybatis.selectOne("BoardDAO.getBoard", vo);
	}
	
	public List<BoardVO> getBoardList(BoardVO vo) {
		return mybatis.selectList("BoardDAO.getBoardList", vo);
	}
	
}

 

 

이제 ServiceImpl에서 위 클래스를 선언하여 사용하면 끝!

'[JAVA] > Mybatis' 카테고리의 다른 글

[Mybatis] SQL 쿼리문을 실행하는 두가지 방법  (0) 2021.07.01
[Mybatis] JavaORM plugin  (0) 2021.06.30
[Mybatis] Dynamic SQL  (0) 2021.06.30
[Mybatis] Mapper Elements  (0) 2021.06.29
[Mybatis] Mybatis 프레임워크 기초  (0) 2021.06.29
Comments