SpringBoot 에서 Mybatis 연동하기

김종태·2021년 11월 3일
0

Mybatis 왜 쓰는걸까?

나에게 던지는 질문이다, 기껏 ORM 표준인 JPA를 공부하고 잘 사용해 오다가
뭐하러 불편하고 오래된 기술인 Mybatis를 사용할까?

'JPA' 너무나도 편리하게 사용이 가능하며 데이터중심의 DB모델링을 객체지향적으로 사용할 수 있는 혁신적인 JAVA 표준 ORM기술이다
하지만 SI/솔루션 분야에서 아직까지도 Mybatis를 많이 요구한다는 이야기를 많이 들었고 실제로도 많이 사용되는것 같다 기존의 JDBC를 사용하는것 보다 간편한 테이블 매핑을 지원한다. 하지만 ORM 개념이 아니기 때문에 NativeSQL을 활용해서 쿼리를 작성해야 한다 Mybatis를 사용하며 직접 DB를 제어하며 데이터베이스와 SQL의 이해를 높일 생각이다

SpringBoot에서 Mybatis 적용하기

사전작업 ( Table, ResultType(class) )

필자는 Gradle 환경에서 진행하였다.

테이블 구조 ( board )

boardVO.class (ResultType)

package com.example.demo.domain;

import java.util.Date;

import lombok.Data;

@Data
public class BoardVO {
	private long boardNo;
	private String title;
	private String content;
	private Date regDate;
	private Date modDate;
	private String writerId;
}

미리 설정해 두었기 때문에 언더스코어 -> 카멜케이스 변환이 가능하다.
(2. application.properties 세팅 참고)

(culum)board_no -> (class)boardNo

1. Mybatis Dependency 추가

file: build.gradle

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
	implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.0'
    }

위와같이 JDBC와 Mybatis 의존성을 추가한 후 Gradle을 Refresh 해준다

2. application.properties 설정

//datasource 세팅을

#사용하는 DB에 맞춰 값을 입력한다
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
#DB접속 주소와 테이블을 입력
spring.datasource.url=jdbc:mariadb://192.168.0.1:3306/test
#접속 계정과 비밀번호 입력
spring.datasource.username=test
spring.datasource.password=test

# model 프로퍼티 camel case 설정 
mybatis.configuration.map-underscore-to-camel-case=true 
# xml파일 result type에 패키지명을 생략할 수 있도록 alias 설정
mybatis.type-aliases-package=com.example.demo.domain 

추가적으로 Mybatis에서는 훨씬 다양한 설정을 제공한다

3. Mapper interface 생성

컴포넌트 스캔 영역 안에 패키지를 만들고 Mapper interface를 추가한다

package com.example.demo.mapper;

import ...

//@Mapper 어노테이션을 추가하여 스캔대상에 추가한다
//Mybatis 에서 제공하는 @Mapper를 사용한다
@Mapper
public interface BoardMapper {
	
    	// 메서드에 @Select,Insert,Update....등 어노테이션을 활용하여 SQL을 정의할 수 있다.
	@Select("SELECT * FROM board")
	public List<BoardVO> getBoard();
	
    	// 아래는 메서드만 선언하고 SQL을 정의하지 않았다.
        // XML파일을 생성해서 한번에 SQL들을 정의하고 관리할 예정이다
	public List<BoardVO> getBoard2();
	
}

4.(선택) Mapper의 xml파일 생성


1. resources 폴더 하위에 패키지명과 동일한 디렉터리 구조에 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">

<!--namespace= Mapper의 interface 바인딩(패키지명 포함) -->
<mapper namespace="com.example.demo.mapper.BoardMapper">
  
<!-- id=매칭할 메서드의 이름, resultType="매핑받을 객체"  -->
<!-- 미리 설정을 했기 때문에 패키지명 생략이 가능하다-->
	<select id="getBoard2" resultType="boardVO">
		SELECT * FROM board
	</select>
  
</mapper>
  1. Mapper 인터페이스와 메서드를 매칭하고 SQL을 정의한다. 이제 이파일 하나에 BoardMapper의 모든 메서드의 쿼리를 정의 하여 관리가 가능하다 때문에 나도 XML방식을 선호 하는 편이다

    resultType 속성에 지정된 boardVO.class에 테이블의 컬럼명과 동일한 이름과 타입의 필드를 생성해 두면 Mybatis가 알아서 값을 set 해주어 결과를 반환한다

    boardVO.class의 필드들의 Setter를 정의해 두어야 한다
    @Data를 통해 생성 완료

5. 테스트

SpringBootTest를 활용하여 테스트 코드를 작성 하였다
@SpringBootTest
@Log4j2
class BoardMapperTests {
	
	@Autowired
	private BoardMapper boardMapper;	

	@Test
	void getBoard() {
    //[BoardVO(boardNo=23, title=제목, content=내용, regDate=Wed Nov 03 13:30:57 KST 2021, modDate=Wed Nov 03 13:56:00 KST 2021, writerId=kjt407),BoardVO(boardNo=24, title=제목, content=내용, regDate=Wed Nov 03 13:30:57 KST 2021, modDate=Wed Nov 03 13:56:00 KST 2021, writerId=kjt407)]
		log.info(boardMapper.getBoard());
    //[BoardVO(boardNo=23, title=제목, content=내용, regDate=Wed Nov 03 13:30:57 KST 2021, modDate=Wed Nov 03 13:56:00 KST 2021, writerId=kjt407),BoardVO(boardNo=24, title=제목, content=내용, regDate=Wed Nov 03 13:30:57 KST 2021, modDate=Wed Nov 03 13:56:00 KST 2021, writerId=kjt407)]
		log.info(boardMapper.getBoard2());
	}

}

결과값이 BoardVO에 잘 담겨서 반환된 것을 확인할 수 있다
이처럼 Mybatis를 사용할 경우 JDBC를 사용할때 처럼 결과값을 일일이 불러들여 set 해주는 작업이 생략된다 이외에도 ResultMap, Collection 등 다양한 매핑작업을 지원하는데

https://mybatis.org/mybatis-3/ko/index.html
위 공식문서를 참고하면 큰 도움이 될것 같다.

profile
기록하며 성장하는 개발자 김종태

0개의 댓글