-
Spring + MyBatis + MySQL 설정Spring 2022. 7. 1. 18:19
** 구멍가게 코딩단님의 책을 참고 하여 작성 하였습니다.
- 스프링이랑 mybatis 연동 하기 위한 라이브러리 설정
- 데이터베이스와의 연결을 담당하는 datasource 객체 설정
- mybatis의 핵심인 SqlSessionFactory 객체 설정 및 테스트
개발 초기에 한번 설정 해두고 개발 초기에 반드시 해 주어야 하는 설정이다.
스프링은 다른 프레임워크랑 연동 작업을 위한 별도의 하위 모듈을 많이 가지고 있는데 우리는 SPRING-JDBC랑 SPRING-TEST 모듈을 사용 할 것이다.
spring-jdbc만으로도 개발을 할 수 있지만 좀더 편리하게 사용하기 위해서는 mybatis가 필요하다.
mybatis의 장점
- 간결한 코드 처리
- sql 문의 분리 운영
- spring과의 연동으로 자동화 된 처리
- 동적 sql을 이용한 제어 기능
등이 있다.
설정이 완성되면

이러한 구조를 가지게 될 것이다.
우선 해당 라이브러리들을 사용하기 위해서는 pom.xml 파일에 라이브러리들을 추가 해 줘야한다.
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.2.8</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.2.2</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>${org.springframework-version}</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>${org.springframework-version}</version> </dependency>spring-test는 스프링과 마이바티스가 제대로 연동되었는지 확인하기 위해 사용된다.
추가한 라이브러리들이 정상 작동한다면 root-context 파일에서 좀 더 다양한 태그를 사용 할 수 있다.
이제 root-context.xml 파일을 조금 수정 해 줘야한다.
root-context란 STS가 프로젝트 생성시에 src/main/webapp/WEB-INF/spring/root-context.xml 해당 경로에 생성 해 주는 파일로 가장 중요한 파일이다.
스프링과 관련된 모든 설정을 해 줄 수 있따.
root-context.xml에서 스프링 프레임워크에 다양한 설정을 하기 위해서는 sts 상에서 namespace 탭을 이용하여 사용 가능한 xml 태그의 폭을 넓혀 줘야 한다.

aop, beans, context, jdbc, mybatis-spring 을 체크 해준다,
저장 후 root-context source를 보면 상단에 xml 네임스페이스가 추가 된 것을 확인 할 수 있다.

** MySQL과의 연결을 담당하는 DataSource 설정하기
스프링과 mybatis를 같이 사용하는 경우에는 주로 스프링의 설정으로 JDBC 연결을 처리하는 경우가 많기 때문에 조금전에 추가한 spring-jdbc 모듈의 클래스를 이용해서 root-context.xml에 datasource를 추가 해 준다.
(DataSource는 JDBC의 커넥션을 처리하는 기능을 가지고 있기 때문에 데이터베이스와 연동 작업이 반드시 필요하다.)
root-context에 설정 코드를 작성 해 준다.
<bean id = "dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value ="com.mysql.jdbc.Driver"></property> <property name="url" value="jdbc:mysql://localhost:3306/book_ex"></property> <property name="username" value ="root"></property> <property name="password" value ="~~~~~"></property> </bean>설정에 보이는 class 속성의 값은 'org ~~~'로 시작하는데 이 속성의 값에 해당하는 클래스가 존재해야 하기 때문에 이전 단계에서 spring-jdbc 모듈을 추가 해 준 것이다. MySQL 연결 설정에 사용 된 정보를 보면 MySQL tool에서 설정 한 값과 동일한 정보를 넣어주었다.
id라는 속성은 스프링 내에서 특정 객체인 bean을 찾기 위해서 사용하는 일종의 alias이다. datasource의 값을 그대로 사용하게 되면 개발을 할 때 여러 에러가 발생 할 가능성이 있기 때문이다.
이제 datasource의 테스트를 진행 해 보자.
스프링은 하나의 설정에 문제가 발생하면 정상적으로 작동하지 않기 때문에 최대한 빨리 변경 된 설정에 대한 테스트를 진행하는 것이 좋다.
src/java/test 폴더에 DataSourceTest 클래스를 생성 해 준다.
package com.jae.web; import java.sql.Connection; import javax.inject.Inject; import javax.sql.DataSource; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration( locations = {"file:src/main/webapp/WEB-INF/spring/**/*.xml"}) public class DataSourceTest { @Inject private DataSource ds; @Test public void testConection()throws Exception{ try(Connection con = ds.getConnection()){ System.out.println(con); }catch(Exception e) { e.printStackTrace(); } } }RunWith / ContextConfiguration 어노테이션은 현재 테스트 코드를 실행 할 떄 스프링이 로딩 되도록 하는 부분이다.
@ContextConfiguration 의 locations 속성 경로에 xml 파일을 이용해서 스프링이 로딩이 되는 것이다.
인스턴스 변수의 @Inject 어노테이션이 처리된 DataSource는 스프링이 생성해서 주입해주는 것으로 개발자가 객체 생성 혹은 다른 작업을 하지 않아도 된다.
이제 마우스 우클릭 > run as > junit test 를 돌려보면

위의 코드가 정상적으로 실행이 된다면 콘솔 창에서 connection 객체가 생성 된 것을 확인 할 수 있다.

junit 창도 에러 없이 돌아가는 것을 확인 할 수 있다.
-mybatis 연결
datasource의 연결은 mtbatis의 설정과도 연관이 있기 때문에 datasource의 연결이 선행 되었다.
datasource가 정상적으로 설정 된 후에 mybatis와 mysql을 연동 해 주는 작업을 진행하게 된다.(스프링은 하나의 설정이라도 잘 못 되면 실행이 안되기 때문에 설정을 마치고 나면 테스트 하는 습관을 들여 주는 것이 좋다.)
--SqlSessionFactory 객체 설정
mybatis와 스프링 연동 작업에서의 핵심은 connection을 생성, 처리 해 주는 SqlSessionFactory의 존재이다.
SqlSessionFactory는 db와의 연결과 sql 실행에 대한 모든 가진 가장 중요한 객체이다.
스프링을 이용 할 때에는 SqlSessionFactory를 생성 해 주는 SqlSessionFactoryBean이라는 클랙스를 사용한다.
SqlSessionFactoryBean은 root-context.xml 파일에 설정을 해 줘야 한다.
<bean id = "sqlSessionFactory" class= "org.mybatis.spring.SqlSessionFactoryBean"> <property name= "dataSource" ref="dataSource" /> </bean>추가 된 객체(bean)의 class 속성값을 보면 "org.mybatis.spring.xxx" 클래스인데 이 클래스는 Mybatis-Spring 모듈을 다운 받아야지만 사용 할 수 있다.
--mybatis-config.xml 파일 추가
mybatis는 sql mapping 프레임워크로 별도의 설정 파일을 가질 수 있다. 이 별도의 설정 파일을 사용하면 스프링의 설정과 별도로 사용하는 모든 mybatis의 설정 기능을 활용 할 수 있기 때문에 mybatis-config.xml 파일을 생성 해서 설정하도록 하자.
이 파일의 위치는 쉽게 알아 볼 수 있게 src/main/resources에 만들도록 하자
<?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>지금 당장은 사용하지 않더라도 나중에 사용 할 일이 있기 때문에 미리 위와 같은 코드를 작성 한 후 저장 해 준다.
위의 파일이 스프링이 동작 할 때 같이 작동 할 수 있도록 root-context.xml 파일을 수정 해 줘야 한다.
<bean id = "sqlSessionFactory" class= "org.mybatis.spring.SqlSessionFactoryBean"> <property name= "dataSource" ref="dataSource" /> <property name = "configLocation" value= "classpath:/mybatis-config.xml"></property> </bean>-Mybatis 연결 테스트
이제 설정이 완료 되었으니 스프링에서 mybatis 그리고 mysql까지 모든 연결이 제대로 되었는지 테스트가 필요하다.
test 폴더 안에 MyBatisTest라는 클래스를 생성 해 준 후 아래의 테스트 코드를 작성 해 준다.
package com.jae.web; import javax.inject.Inject; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {"file:src/main/webapp/WEB-INF/spring/**/*.xml"}) public class MyBatisTest { @Inject private SqlSessionFactory sqlFactory; @Test public void testFactory() { System.out.println(sqlFactory); } @Test public void testSession()throws Exception{ try(SqlSession session = sqlFactory.openSession()) { System.out.println(session); }catch(Exception e) { e.printStackTrace(); } } }클래스 아래에 선언 된 인스턴스 변수 SqlFactory에는 스프링이 정상적으로 동작 할 경우 SqlSessionFactory를 주입시키도록 한다. 만약 앞에 root-context.xml 에서 설정한 SqlSessionFactory에 문제가 있다면 이 코드에서 에러가 발생하게 될 것이다.
testSession에서는 try-with 구문을 활용하여 실제 데이터베이스와의 연결을 담당하는 객체인 SqlSession을 생성 하는 부분인데 이 코드의 실행 결과는 'org.apache.ibatis.session.defaults.DefaultSqlSession...'과 같은 메세지가 보여지면 정상적으로 작동 하는 것이다.


정상적으로 작동하는 모습이다.
'Spring' 카테고리의 다른 글