spring mybatis 설정

이동명·2023년 5월 26일
0
post-thumbnail
  1. 메이븐 "pom.xml"에 DB연동에 필요한 라이브러리 의존 설정 추가
  • MySQL Connector
  • Mybatis
  • Mybatis-spring (스프링에서 Mybatis 연동을 위한 모듈)
  • spring-jdbc (기본 자바 JDBC가 아닌 스프링의 JDBC)
  • common-dbcp2 (톰캣에서 커넥션풀을 이용할 수 있도록 아파치에서 제공해주는 라이브러리)
  • spring-test (스프링에 Mybatis가 정상적으로 연동되었는지 확인 용도)
		<!-- Mysql Connector -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.39</version>
		</dependency>

		<!-- Mybatis -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>3.2.8</version>
		</dependency>

		<!-- Mybatis-Spring -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis-spring</artifactId>
			<version>1.2.2</version>
		</dependency>

		<!-- Spring-JDBC -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>

		<!-- common-dbcp -->
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-dbcp2</artifactId>
			<version>2.7.0</version>
		</dependency>

		<!-- Spring Test -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
  1. 루트 컨테이너에 "BasicDataSource" 클래스의 빈(Bean) 객체 의존 설정 (커넥션풀 사용)

스프링 MVC 구조에서 다뤘듯이 root-context.xml 파일을 참조해 생성되는(다른 xml 파일을 param으로 추가할 수도 있음) 루트 컨테이너는 웹과 관련 없는 자원을 빈(Bean)으로 관리해주는 용도로 주로 사용됩니다. DB 또한 웹과 관련이 없는 자원이므로 루트 컨테이너에 자원을 생성해 관리합니다. 물론 다른 컨테이너를 이용해도 되지만 루트 컨테이너 사용이 일반적입니다.

BasicDataSource 클래스는 아파치에서 제공해주는 클래스로 커넥션풀을 사용할 수 있도록 해줍니다. 스프링에서 제공해주는 DataSource 클래스보다 커넥션풀을 사용하는 것이 나을 수 있습니다. 라이브러리는 아래 링크에서 찾으면 됩니다.

https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2

일단 DB와 연결작업을 담당할 객체를 루트 컨테이너에 생성하도록 합니다. 이렇게 해두면 어플리케이션 내 딱 하나(싱글톤)의 DataSource 객체만 빈(Bean)으로  생성되어 사용됨으로써 DB작업 시 계속 새로운 객체를 생성하지 않아도 됩니다. 이는 생명주기가 어플리케이션과 동일하게 맞춰진 다른 컨테이너를 사용해도 마찬가지입니다.

  • root-context.xml 파일에 의존 설정 (Bean 등록)

먼저 NameSpaces 탭에서 아래와 같이 필요한 부분들을 체크해줍니다. xml 파일을 'Spring configure Editor'로 열어야 탭이 보입니다.

  • 추가로 체크할 곳 : jdbc, mybatis

그리고 DataSource 클래스를 빈(Bean) 객체로 등록해줍니다. Property로 전달할 매개변수 값도 넣어줍니다.

DriverClassName의 값으로 넣어주는 "mysql.jdbc" 라이브러리는 "pom.xml"에서 의존설정 해줬으므로 자동으로 받아줍니다. 메이븐 사용 전에는 직접 파일을 받아서 넣어줘야 했었는데 메이븐은 역시 짱입니다. 혹시 테스트하다 빈생성 실패와 같은 예외가 발생하면 해당 클래스가 실제로 잘 있는지 확인해봐야 합니다.

그리고 url의 값과 접속 계정 또한 자신의 환경에 맞게 설정해줘야 합니다. DB서버의 IP와 포트, 그리고 접속할 데이터베이스 이름을 기입해주고 계정 정보를 넣어줍니다. 그냥 복사해서 그대로 쓰면 안됩니다.

나중에 실제 사용할 때는 프로퍼티 파일을 이용해서 연결 정보를 저장한 뒤, xml에서 가져다 쓰는 방식으로도 사용하면 좋습니다. 프로퍼티 파일 사용법을 참조하시면 됩니다.

[Spring MVC/- 기본 문법] - 스프링에서 외부 환경 변수 정보 읽어오기 (Properties 파일)

	<!-- 커넥션풀 DataSource 객체 -->
	<bean id="dataSource"
		class="org.apache.commons.dbcp2.BasicDataSource">
		<property name="driverClassName" value="com.mysql.jdbc.Driver" />
		<property name="url" value="jdbc:mysql://localhost:3306/hsdb?characterEncoding=UTF-8" />
		<property name="username" value="codevang" />
		<property name="password" value="codevang1!" />

		<property name="initialSize" value="0"/>
		<property name="minIdle" value="0"/>
		<property name="maxIdle" value="10"/>
		<property name="maxTotal" value="10"/>
		<property name="maxWaitMillis" value="1000"/>
	</bean>

password 아래의 프로퍼티 속성은 커넥션풀의 기본 설정들입니다. 생략하면 디폴트 값이 적용됩니다. 아래 커넥션풀에 대한 링크를 참조하시면 됩니다.

[JSP & Servlet/- 기본 문법] - JDBC를 이용한 DB작업_커넥션풀(Connection Pool) [3/3]

그리고 'url' 에는 뒤에 꼭 인코딩 타입을 지정해줍니다. web.xml 등에서 설정한 인코딩 타입은 클라이언트와 통신하는 부분에 대한 인코딩입니다. 이와는 별개로 어플리케이션과 DB가 통신하는 부분이기 때문에 커넥션을 관리하는 Datasource 객체에 인코딩 타입을 알려줘야 합니다.


  1. 루트 컨테이너에 생성된 DataSource 빈(Bean) 객체 작동 테스트

이제 실제 DB 커넥션이 잘 이루어지는지 테스트를 해봅니다. junit을 이용해서 테스해볼 수 있겠지만 DB 연결을 처음 하는 상황이면 어차피 거의 코드가 없는 상태일테니 그냥 컨트롤러에서 커넥션 객체를 만들어서 잘 만들어지는지 확인해보겠습니다. 예외가 발생하지 않고 커넥션 객체가 잘 생성됐다면 정상적으로 DB에 연결된 것입니다.

@Inject 어노테이션을 사용하면 루트 컨테이너에서 생성된 빈(Bean)을 자동으로 주입받을 수 있습니다. 또는 스프링에서 지원해주는 @Autowired를 사용해도 됩니다. 아래 링크를 참조하시면 됩니다.

[Spring MVC/- 기본 문법] - @Resource, @Inject, @Autowired 사용 (자동 의존성 주입)

주입받는 DataSource 객체에서 실제 DB 커넥션 객체를 생성합니다.

package com.hsweb.springweb;

import javax.inject.Inject;
import javax.sql.DataSource;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;

import com.mysql.jdbc.Connection;
import com.mysql.jdbc.Statement;

@Controller
@RequestMapping(value = "/board")
public class HomeController {

	// 루트컨테이너에서 빈(Bean)을 받아와서 자동으로 넣어줌
	@Inject
	private DataSource dataSource;

	// "/list" URI에 대한 요청 처리
	@RequestMapping(value = "/list")
	public String home2(@ModelAttribute Test test) {

		try {
		Connection conn = (Connection) dataSource.getConnection();
		System.out.println("성공 : " + conn);

		} catch (Exception ex){
			System.out.println("실패..!");
			ex.printStackTrace();
		}

		return "/board/list";
	}
}

  1. Mybatis 설정

이제 Mybatis를 사용할 수 있게 설정할 차례입니다. Mybatis는 위에서 생성한 DataSource 객체를 가지고 가서 알아서 DB 연결을 해놓고 개발자가 편하게 DB 작업을 할 수 있도록 해줍니다.

먼저 환경설정 정보를 담을 설정 파일과, SQL 쿼리문을 관리할 매퍼 파일을 만들어줍니다.

4-1. src/main/resources 폴더 내에 mapper 파일 생성하기

쉽게 Mybatis 매핑 파일을 만들고 싶다면 이클립스에서 Mybatis 플러그인을 설치해주면 됩니다. "Help - Eclipse MarketPlace"에 들어가서 "Mybatis"를 검색해 아래 플러그인을 설치하면 됩니다. 그럼 이클립스 우클릭으로 파일 생성할 때 Mybatis 설정 파일 템플릿이 생깁니다.

우클릭 후 "new - other"를 클릭하면 템플릿이 생김

<?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="mybatis.mybatisConfig">

</mapper>

4-2. src/main/resources 폴더 내에 환경설정 파일 생성하기

일단 껍데기만 만들어둡니다. 아래 코드로 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>

</configuration>

4-3. 루트 컨테이너에 SqlSessionFactoryBean 클래스 빈(Bean) 등록

그리고 Mybatis를 사용할 수 있게 해주는 SqlSessionFactoryBean 클래스를 루트 컨테이너에 빈(Bean) 객체로 등록해줍니다. 등록할 때 프로퍼티로 위에서 생성한 DataSource 빈(Bean)과 위에서 만든 매핑 설정 파일 위치를 넣어주면 이 객체가 생성될 때 스프링에서 DB 작업을 편하게 할 수 있도록 제반 준비를 자동으로 해줍니다.

추가로 "sqlSessionTemplate"이라는 클래스도 있는데, "sqlSessionFactory" 객체를 가져가서 동기화 처리 등 추가 기능을 제공하는 클래스입니다. 이 객체도 같이 만들어줍니다.

	<!-- 스프링 DataSource 객체 -->
	<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
		<property name="driverClassName" value="com.mysql.jdbc.Driver" />
		<property name="url" value="jdbc:mysql://엔드포인트:포트/db이름" />
		<property name="username" value="id" />
		<property name="password" value="pass" />
	</bean>

	<!-- sqlSessionFactory -->
	<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="configLocation" value="classpath:/mybatis/mybatisConfig.xml" />
		<property name="mapperLocations" value="classpath:/mybatis/mybatisMapper.xml" />
	</bean>

	<!-- SqlSessionTemplate -->
	<bean id="sqlSessoinTemplate" class="org.mybatis.spring.SqlSessionTemplate">
		<constructor-arg name="sqlSessionFactory" ref="sqlSessionFactory" />
	</bean>

  1. Mybatis 최종 테스트

위에서 사용한 코드를 약간 바꿔서 Mabatis의 SqlSessionFactory 객체가 정상적으로 DB 세션을 만들 수 있는지 확인해봅니다.

package com.hsweb.springweb;

import javax.inject.Inject;
import javax.sql.DataSource;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;

import com.mysql.jdbc.Connection;
import com.mysql.jdbc.Statement;

@Controller
@RequestMapping(value = "/board")
public class HomeController {

	// 루트컨테이너에서 빈(Bean)을 받아와서 자동으로 넣어줌
	@Inject
	private SqlSessionFactory sqlFactory;

	// "/list" URI에 대한 요청 처리
	@RequestMapping(value = "/list")
	public String home2(@ModelAttribute Test test) {

		try {

			SqlSession session = sqlFactory.openSession();
			System.out.println("성공 : " + session);

		} catch (Exception ex){
			System.out.println("실패..!");
			ex.printStackTrace();
		}

		return "/board/list";
	}
}
profile
Web Developer

0개의 댓글