본문 바로가기

Spring Framework 개발 일지/Spring으로 게시판 만들기

FirstSpringBoard#2]마이바티스와 연동하기

반응형

안녕하세요.

오늘은 마이바티스와 연동해서 SqlSession 객체를 생성하는 시간입니다.

아마 여러분들은 JDBC나 JDBCTemplate를 주로 이용하셨을 겁니다.

마이바티스는 SQL Mapper입니다.

쉽게 말해서 객체의 필드, 원시 타입을 SQL과 연결해주는 거에요.

Jdbc를 사용할때 prepareStatement.set(1, name)나 rs.getString("name")과 같이 SQL에 넣어줄 파라미터나 DB에서 반환받는 값을 개발자가 직접 설정했었는데.

SQL Mapper는 이 작업을 자동으로 해줍니다.

그리고 마이바티스는 sql문과 DB연동 정보를 자바코드와 분리시켜주는 역할을 합니다.

여태까지 SQL문을 String type으로 소스코드 안에서 선언해줬었는데.

이제는 그럴 필요가 없습니다. SQL문을 xml 파일(매퍼 설정 파일) 안에 모아서 관리해줘요.

거기다가 Spring과 연동한다면 손쉽게 DB와 연결할 수 있고, 트랙잭션 관리까지 해주는 장점이 있습니다.

마이바티스는 스프링과 연동할 수 있도록 mybatis-spring 모듈을 제공합니다.

우선 이번 시간에는 spring과 연동없이 마이바티스를 이용해서 DB와 연결하겠습니다.

마이바티스는 DB연결 정보를 가진 SqlSessionFactory를 이용해서 SqlSession를 불러옵니다.

SqlSession은 JDBC에서 Connection이라고 생각하면 되요.


1.우선 STS에서 mybatis 설정 파일을 손쉽게 작성할 수있게 도와주는 Java ORM Plugin for eclipse을 설치할 것입니다.

Help > Eclipse Marketplace를 눌러주세요.  Java ORM Plugin for eclipse를 설치하고 깔아주세요. 리스타트 해줘야합니다.


2.  다 설치되었으면 Ctrl + N을 누르고 mybatis를 검색해서 설치되었는지 확인해주세요. 아래의 사진과 같이 나오면 설치가 된 것입니다.


3. Mybatis Configuration Xml를 선택해주세요. Mybatis와 연결설정을할 수 있는 설정파일입니다.

Next를 누르고 프로젝트를 지정해줘야합니다. 파일명은 건드리지 않을게요. Browse를 눌러서 현재 본인의 프로젝트를 선택하고 Finish를 눌러주세요.


4. 프로젝트의 src폴더를 열어보세요.

db.properties 파일과 mybatis-config.xml 파일이 만들어져있을거에요.

mybatis-config.xml는 우리가 만든건데 db.properties는 뜬금없이 왜 만들어졌나 싶은 분들도 많을거에요.

db.properties는 db연결 설정이 저장되어있는 파일입니다.

Driver와 db url이 저장되어있어요.

JDBC에서 class.forName(Driver 주소), DriverManager.getConnectrion("db 주소", "사용자 id", "password")를 넣어서 DB연동을 해주잖아요.

거기에 해당하는 정보가 들어있어요.

물론 mybatis-config.xml에도 DB연동과 관련된 정보를 넣을 수 있어요. 하지만 개발과정에서 Database를 여러개 사용할 수 있잖아요.

테스트할때는 H2 Database를 쓰다가 실제 서비스에서는 Mysql이나 Oracle을 사용할 수 있어요.. 그럴 경우에 config 파일을 수정하지 않고 여러개의 DB정보를 가진 파일을 이용해서 mybatis-config에서는 파일의 경로만 지정해서 참조해주면 설정을 간단하게 바꿀 수 있겠죠.


5. 파일 두개를 src/main/java/resources로 옮겨주세요.

6. mybatis-config.xml파일을 열어볼게요. 아래와 같은 화면이 나올거에요.

7. 아래와 같이 고쳐주세요.


	 
	
	
	
	
		
			
			
				
				
				
				
			
		
	
	
	
        

8. db.propertise를 열어주세요. mysql을 기준으로 기본적인 세팅이 되어있어요. 본인의 개발환경에 맞게 변경해주세요.

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=1234

9. db.propertise와 mybatis-config를 비교했을 때 value값과 propertise파일의 키값이 동일한 것을 확인할 수 있어요.

10. 이제 설정이 잘됐는지 확인해볼게요. 우선 SqlSession을 얻어올 수 있는 Util 클래스를 생성해줄거에요.

아래와 같은 경로로 생성해주세요.

11. 코드는 아래와 같아요. 클래스 멤버들을 Static으로 선언했는데. Util클래스라서 그렇습니다.

그리고 if(sqlSessionFactory == null)이라는 조건문이 들어갔는데.

그 이유는 SqlSessionFactory 객체는 어플리케이션 구동 중에는 한번만 생성되는게 안전하기 떄문입니다.

SqlSessionFactory는 DB연동과 관련된 설정을 가지고 있어서 생성할 때 마다 시스템에 큰 부하를 줍니다.

그래서 싱글톤 패턴을 적용했습니다.

SqlSession은 단일 스레드에서 작동하기 때문에 하나의 요청에 대해서 불러오고 작업을 처리한 후 닫아줍니다. 

하나의 메소드 안에서 생성되고 소멸해야합니다.

package com.SpringBoard.util; import java.io.IOException; import java.io.InputStream; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class MybatisSqlSessionFactory { private static SqlSessionFactory sqlSessionFactory; private static final Logger logger = LoggerFactory.getLogger(MybatisSqlSessionFactory.class); //디버깅을 위해서 logger를 사용합니다. 본 프로젝트에서는 System.out.println을 사용하지 않아요.          public static SqlSessionFactory getSqlSessionFactory() { if (sqlSessionFactory == null) { InputStream inputStream; try { inputStream = Resources.getResourceAsStream("mybatis-config.xml"); //스트림으로 설정파일을 받아옵니다. sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //SessionFactoryBuilder를 이용해서 SessionFactory를 가져옵니다. logger.debug("세션 팩토리 생성 완료"); } catch (IOException e) { throw new RuntimeException(e.getMessage()); } } return sqlSessionFactory; } public static SqlSession openSession() { return getSqlSessionFactory().openSession(); //Session을 얻어오는 부분 } }

12. 이제 sqlSession을 제대로 생성할 수 있는지. DB와 연동되는지 확인해볼게요. Junit을 이용할 것입니다. 아래의 화면을 따라해주세요.




13. 테스트 코드를 작성해주세요.

package com.SpringBoard.util; import org.apache.ibatis.session.SqlSession; import org.junit.Before; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class MybatisSqlSessionFactoryTest { SqlSession session; private static final Logger logger = LoggerFactory.getLogger(MybatisSqlSessionFactoryTest.class); @Before //모든 테스트 코드가 실행되기 전에 작동하는 메소드입니다. @Before 애노테이션으로 설정해줄 수 있어요. public void tearDown() throws Exception { session = MybatisSqlSessionFactory.openSession(); logger.info("세션을 성공적으로 불러왔습니다."); } @Test //테스트 코드를 등록해주는 애노테이션입니다. public void test() { } }

14. 테스트 코드를 실행해줍니다.

실행하고픈 메소드를 클릭해주고 ctrl - F11을 눌러주세요.


15. 아래와 같이 성공적으로 실행됩니다. JUnit 탭에서도 오류없이 Sqlsession 객체를 생성한 것을 알 수 있고요.

디버깅을 위해서 설정했던 logging 메시지도 콘솔에 출력되는 것을 확인할 수 있어요.

혹시 안 되면 댓글로 알려주세요.

마이바티스 연동 설정을 완료했습니다.

정말 지난한 과정이었는데요.

이제 Mapper 파일만 설정해주면 Mybatis와 연동과 관련된 설정이 끝납니다.

이제 필요한 기능들을 하나하나 테스트코드를 작성하면서 Mybatis를 이용한 DAO클래스를 구현할 것입니다.

반응형