web

코드로 배우는 스프링 웹프로젝트 - 스프링과의 연동처리

늉_늉 2020. 9. 30. 20:34

SQLSessionFactory를 이용해서 코드를 작성해도 직접Connection을 얻어 JDBC코딩이 가능하지만

 편하게 하기위해서는 SQL을 어떻게 처리할 것인지를 별도의 설정을 분리, 자동으로 처리되는 방식을 이용하는것이 좋다.

 

 

->MyBatis의 Mapper를 작성해줘야 한다.

 

 

Mapper란?

 

SQL과 그에대한 처리를 지정하는 역할

 

 

- MyBatis-Spring을 이용하는경우 - Mapper를 XML과 인터페이스 + 어노테이션의 형태로 작성 할 수있다.

 

 

Mapper 인터페이스

 

interface를 작성해준다.

 

package org.zerock.mapper;

import org.apache.ibatis.annotations.Select;

public interface TimeMapper {
	
	@Select("SELECT sysdate FROM dual")
	public String getTime();

}

 

 

Mapper설정

 mapper작성 후에는 Mybatis가 동작할대 Mapper를 인식 할 수있도록

root-context.xml에 추가적인 설정을 해 주어야 한다.

 

<mybatis:scan>이라는 간단한 방식을 이용하도록 하자

 

 

root-context.xml 열어서 namespace탭의 mybatis-spring 항목을 체크해준다.

 

 

 

source탭을 눌러 

		<mybatis-spring:scan base-package="org.zerock.mapper"/>

 

 

추가해 준다.

 

 

 

<mybatis-spring:scan> 태그의 base속성은 지정된 패키지의 모든 MyBatis 관련 어노테이션을 찾아서 처리

 

이렇게 처리하면 자동으로 org.zerock.mapper 패키지를 인식하는 방법

 

 

 

 

 

java 설정을 이용한 방법 [jex00]

 

RootConfig에 

 

@MapperScan(basePackages = {"org.zerock.mapper"})

      추가해 준다.

 

 

전체코드

 

package org.zerock.config;

import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

@Configuration
@ComponentScan(basePackages = {"org.zerock.sample"})
@MapperScan(basePackages = {"org.zerock.mapper"})
public class RootConfig {
	
	@Bean
	public DataSource dataSource() {
		HikariConfig hikariConfig = new HikariConfig();
		hikariConfig.setDriverClassName("oracle.jdbc.driver.OracleDriver");
		hikariConfig.setJdbcUrl("jdbc:oracle:thin:@localhost:1521:XE");
		hikariConfig.setUsername("book_ex");
		hikariConfig.setPassword("book_ex");
		
		HikariDataSource dataSource = new HikariDataSource(hikariConfig);
		
		return dataSource;
	}
	
	
	
	@Bean
	public SqlSessionFactory sqlSessionFactory() throws Exception{
		SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();
		
		sqlSessionFactory.setDataSource(dataSource());
		return (SqlSessionFactory) sqlSessionFactory.getObject();
		
		
	}

}

 

 

 

 

Mapper 테스트

 

 

 

 

test/java/org/zerock/persistence 밑에 

 

 

TimeMapperTests.java를 작성한다.

package org.zerock.persistence;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.zerock.mapper.TimeMapper;

import lombok.Setter;
import lombok.extern.log4j.Log4j;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xmlSSS")
@Log4j
public class TimeMapperTests {
	@Setter(onMethod_ = {@Autowired} )
	private TimeMapper timeMapper;
	
	@Test
	public void testGetTime() {
		log.info(timeMapper.getClass().getName());
		log.info(timeMapper.getTime());
	}
	

}

 

 

 

정상적으로 실행된다면 스프링 내부에서는 TimeMapper타입으로 만들어진 스프링객체(Bean)가 존재 한다는 뜻.

 

 

 

 

 

 

 

 

 

 

java설정의 경우 

 

ContextConfiguration을 아래와 같이 변경해 준다.

 

@ContextConfiguration(classes = {org.zerock.config.RootConfig.class})

 

 

 

 

 

XML 매퍼와 같이 쓰기

 

 

 

MyBatis - Spring은 Mapper인터페이스와 XML을 동시에 이용할 수 있다.

 

 

XML을 작성해서 사용할때

    

     - XML파일의 위치, XML파일에 저장하는 namespace속성이 중요

 

     - XML파일의 위치 : 1. Mapper인터페이스가 있는곳에 같이 작성 2. src/main/resource구조에 XML을 저장할 폴더를 생성 할 수 있다.

 

 

 

XML파일을 만들땐 Mapper인터페이스와 같은 이름을 사용하자

 

 

src/main/resource에 

 

org > zerock> mapper폴더를 만들어준다

 

TimeMapper.xml파일을 생성한다.

 

 

 

XML파일에는 MyBatis의 XML 매퍼에서 이용하는 태그에 대한 설정이 필요

 

 

Mapper 인터페이스와 XML을 같이 이용해 보기 위해 기존의 TimeMapper 인터페이스에 추가적인 메서드를 선언

 

 

 

 

package org.zerock.mapper;

import org.apache.ibatis.annotations.Select;

public interface TimeMapper {
	
	@Select("SELECT sysdate FROM dual")
	public String getTime();
	
    public String getTime2(); //추가된 코드
    
}

 

코드를 추가해주고

 

 

 

 

 

해석 -> getTime2에는 @Select 와 같이 MyBatis 어노테이션이 존재하지 않고, SQL역시 존재하지 않는다.

왜냐면 이번엔 SQL을 XML을 이용해서 처리할 것이므로 

 

 

xml 파일에는

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
	PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
	"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
	<mapper namespace="org.zerock.mapper.TimeMapper">
	
	<select id="getTime2" resultType="String">
		SELECT sysdate FROM dual
	</select>
</mapper>

이렇게 작성해 준다.

 

 

 

XML 매퍼를 이용하면 <mapper>태그의 namespace속성 값을 신경써야한다.

 

MyBatis는 Mapper 인터페이스의 XML을 인터페이스의 이름과 namespace 속성값을 가지고 판단한다.

 

 

 

 

 

 

위와같이 org.zerock.mapper.TimeMapper 인터페이스가 존재하고, XML의 <mapper namespace="org.zerock.mapper.TimeMapper"> 와 같이 동일한 이름이 존재한다면

 

이를 병합해서 처리한다.

 

따라서 메서드 선언은 인터페이스에 존재하고 SQL에 대한 처리는 XML을 이용하는 방식이다.

 

 

<select>태그의  id 속성값은 메서드의 이름과 동일 해야한다.

 

또한 <select>태그의 경우 resultType을 가지는데 이 값은 인터페이스에 선언된 메서드의 리턴턴 타입과 동일 해야한다.

 

 

이제 최종 확인을 위해 TimeMapperTest클래스를 이용해 테스트를 진행해 보자

 

 

 

TimeMapperTests 파일에

 

	@Test
	public void tesGetTime2() {
		log.info("getTime2");
		log.info(timeMapper.getTime2());
		
	}

코드를 추가해 주고 test를 돌리면

 

 

log를 통해 확인할 수있다.

 

 

 

github.com/hjjju/codeProject