온 코딩

[Spring](게시판 예제) 스프링과 MyBatis 연동, Dynamic SQL 본문

복습 ARCHIVE/모델별 프로젝트

[Spring](게시판 예제) 스프링과 MyBatis 연동, Dynamic SQL

SummerON 2021. 6. 29. 18:12

 

1. 라이브러리(dependency) 추가 (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>

저장 후 메이븐에 제대로 추가 되었는지 확인!

https://mvnrepository.com  메이븐 디펜던시 사이트 : 디펜던시 코드 생각 안 날 때 참고...

 

2. Mybatis 환경설정 파일 추가

2021.06.29 - [복습 ARCHIVE/모델별 프로젝트] - [Spring] Mybatis 설치 및 간단한 사용

 

[Spring] Mybatis 설치 및 간단한 사용

Mybatis 설치 방법 Help > Eclipse Marketplace > Mybatis 1.2.4 설치! 설치 후 뉴 프로젝트 생성 시, Mybatis MyBatis XML Mapper가 보이는 지 확인! Mybatis 한 두줄의 자바코드로 DB 연동을 처리 SQL 명령어를..

on-coding.tistory.com

여기서 사용했던 설정파일,. sql mapper파일 복붙~ 같은 위치에~

sql-map-config.xml에 DataSource 구문은 삭제한다 ==> 이미 applicationContext.xml에 있기 때문

applicationContext.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.hhw.biz"></context:component-scan>
	
	<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
	
	<!-- DataSource Configuration -->
	<context:property-placeholder location="classpath:config/database.properties"/>
	
	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
		<property value="${jdbc.driver}" name="driverClassName"/>
		<property value="${jdbc.url}" name="url"/>
		<property value="${jdbc.username}" name="username"/>
		<property value="${jdbc.password}" name="password"/>
	</bean>
	
	<!-- Spring JdbcTemplate Configuration  -->
	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	
	<!-- Spring + mybatis Way 2 : SqlSessionFactoryBean Registration -->
	<bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean" >
		<property name="configLocation" value="classpath:sql-map-config.xml" />
		<property name="dataSource" ref="dataSource"/>
	</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.hhw.biz..*Impl.*(..))" id="txPointcut"/>
		<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
	</aop:config>
	
</beans>

  > SqlSessionFactoryBean 클래스가 스프링에서 제공 됨 

 

3. DAO 클래스 구현 

방법 1. SqlSessionDaoSupport를 상속받는 DAO 작성

  • SqlSessionDaoSupport 클래스 상속 후, setSqlSessionFactory() 메서드 재정의
  • @Autowired를 통해 스프링컨테이너가 setSqlSessionFactory() 메서드 자동호출하면서 set
  • 설정파일 <bean>에 등록된 SqlSessionFactoryBean 객체를 인자로 받아 부모인 SqlDaoSupport에 setSqlSessionFactory()메소드로 설정 
  • set을 했기 때문에 getSqlSession() 메소드를 통해  SqlSession객체를 리턴받을 수 있다
package com.hhw.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.hhw.biz.board.BoardVO;

@Repository
public class BoardDAOMybatis extends SqlSessionDaoSupport {
	
	public BoardDAOMybatis() {
	}
	
	@Autowired
	public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory){
		super.setSqlSessionFactory(sqlSessionFactory);
	}
	
	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 getSqlSession().selectOne("BoardDAO.getBoard",vo);
	}
	
	public List<BoardVO> getBoardList(BoardVO vo){
		System.out.println("=======>Mybatis getBoardList() 기능처리");
		return getSqlSession().selectList("BoardDAO.getBoardList",vo);
	}
	
}

이 DAO클래스를 활용하여 ServiceImpl파일을 만들어 DB  접속

 

☆정리☆

  1. applicationContext.xml에 스프링제공  SqlSessionFactoryBean클래스 등록 
  2. SqlSessionDaoSupport를 상속받는 DAO 작성 (@Repository, @Autowired) : setSqlSessionFactory() 재정의
  3. BoardServiceImpl내부 맴버변수에서 사용하는 DAO에 위의 파일을 설정

방법 2. SqlSessionTemplate <bean>으로 등록

applicationcontext.xml

	<!-- Spring + mybatis Way 1 : SqlSessionFactoryBean Registration -->
	<bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean" >
		<property name="configLocation" value="classpath:sql-map-config.xml" />
		<property name="dataSource" ref="dataSource"/>
	</bean>
	
	<!-- Spring + mybatis Way 2 : SqlSessionTemplate -->
	<bean class="org.mybatis.spring.SqlSessionTemplate" >
		<constructor-arg ref="sqlSession"></constructor-arg>
	</bean>

BoardDAOmybatis.java

import org.springframework.stereotype.Repository;

import com.hhw.biz.board.BoardVO;

@Repository
public class BoardDAOMybatis{
	@Autowired
	private SqlSessionTemplate mybatis;
    //SqlSession객체
	
	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 mybatis.selectOne("BoardDAO.getBoard",vo);
	}
	
	public List<BoardVO> getBoardList(BoardVO vo){
		System.out.println("=======>Mybatis getBoardList() 기능처리");
		return mybatis.selectList("BoardDAO.getBoardList",vo);
	}

☆정리☆

  1. applicationContext.xml에 스프링제공  SqlSessionFactoryBean클래스, SqlSessionTemplate 등록
  2. SqlSessionDaoSupport를 상속받는 DAO 작성 (@Repository, @Autowired) : SqlSessionTempate 사용
  3. BoardServiceImpl내부 맴버변수에서 사용하는 DAO에 위의 파일을 설정

Dynamic SQL

SQL의 재사용성과 유연성을 향상 => 유지보수의 간편성 

사용자 입력값에 따라 SQL의 쿼리를 바꾸는 것  // SQL 내부에 IF구문을 사용할 수 있음 

 

board-mappling.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>

들어 온 값을 test하여 결과 값에 따라 출력되는 sql문이 다름!

 

Comments