ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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...'과 같은 메세지가 보여지면 정상적으로 작동 하는 것이다.

    정상적으로 작동하는 모습이다. 

     

     

Designed by Tistory.