마이바티스(MyBatis) 개요
마이바티스(Mybatis)는 2001년 클린턴 비긴이 만든 아이바티스(ibatis) 프로젝트의 3.0에서 포크된 프로젝트로 아파치 라이센스(Apache License) 2.0에 따라 배포되는 무료 소프트웨어[1]이다.
MyBatis(ibatis 포함)의 특징은 기존 ORM 프레임워크와 달리 Java 개체를 데이터베이스 테이블에 매핑하지 않고, Java 메소드를 SQL에 매핑한다[2]. 그러다보니 자바 소스는 매우 간결해지고, 핵심은 SQL문을 포함한 XML 코드에 모두 포함이 되어 있다. 국내의 대형 SI들과 함께 단체로 개발을 할 때, Mybatis를 사용하는 가장 큰 이유는 바로 SQL문이 독립되어 유지보수가 편리해지고, 개발자 수준별로 코드를 분리할 수 있기가 용이하기 때문이다.
이처럼 국내 SI업체를 포함하여 국가 표준인 전자정부프레임워크(eGovFramework)에서는 MyBatis를 Java 프로젝트의 표준으로 사용하고 있지만, 세팅 및 오류가 발생할 경우 에러를 잡는게 쉽지 않으며, SI를 경험해보지 못한 개발자의 경우 복잡한 RDB 사용이 익숙하지 않기 때문에 간단한 언어를 선호하며, RDB 사용을 최소화하고, 마이크로 아키텍쳐(Micro Architecture)가 트렌드인 최근 개발자들에게는 관심사가 멀어지고 있는 추세이긴 하다.
스프링부트 프로젝트 생성
스프링 스타터 프로젝트(Spring Start Project)를 사용하여, 스프링 프로젝트를 생성한다. 여기서는 Maven으로 설명하고 있으니, 그레이들(Gradle)일 경우 본인 설정에 맞게 변경하면 된다.
프로젝트를 설정했으면, 사용할 디펜던시(Dependencies)들을 아래와 같이 설정한다.
여기서는 롬복(Lombok)을 추가적으로 설정하였지만 롬복을 사용하지 않을 경우 제외하며, 웹으로 개발하지 않을 경우 Spring Web도 제외한다.
설정이 완료하였으면, Finish를 눌러서 프로젝트를 생성한다.
스프링부트 초기 세팅
프로젝트를 생성하였으면, 이제 추가적으로 세팅 작업을 진행해야 한다.
application.properties
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
## MySQL
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/my_place
spring.datasource.username=root
spring.datasource.password=needjarvis
spring.datasource.driver-class-name: com.mysql.cj.jdbc.Driver
# mybatis
mybatis.mapper-locations=classpath:mybatis/mapper/**/**.xml
위 DB 설정의 경우 당연히 필자의 설정이기 때문에 자신에게 맞게 url과 username, password를 변경한다.
spring.mvc.view의 경우, 웹개발을 하기 위한 설정이며 웹개발이 아니라 JSON으로 전송하는 API가 목적이라 한다면 당연히 해당 설정은 사용하지 않아도 상관 없다.
mapper 폴더 생성
src/main/resources로 가서, mybatis 폴더와 하위 폴더로 mapper 폴더를 생성한다. 이 폴더에는 앞으로 SQL 문이 담겨져 있는 mapper xml 코드가 담겨져 있을 것이다.
pom.xml
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
본 포스팅에서는 mysql을 DB로 사용하기 때문에 mysql-connector-java를 pom.xml에 추가로 dependency를 설정하였다.
위와 같이 초기 세팅을 완료하였다면 이제 본격적으로 코드를 채워 넣도록 해보자.
조회(Select) 예시
세팅이 제대로 되었는지 확인을 위해서 조회 예제를 진행해보도록 한다.
테스트는 뉴스를 랜덤으로 2개를 지정하여, news 테이블(table)에 저장을 하였고 뉴스제목(title), 기자(journalist), 등록일(reg_dt), 신문사(publisher)라는 4개의 컬럼이 존재한다.
NewsEntity.java
우선 데이터를 저장할 객체를 생성한다. 본 포스팅에서는 롬복을 사용하였기 때문에 getter, setter를 만들지 않았는데 롬복을 사용하지 않을 경우 직접 getter & setter를 생성하도록 한다.
package dev.zeronelab.mybatis.vo;
import lombok.Data;
@Data
public class NewsEntity {
private String title;
private String journalist;
private String publisher;
private String reg_dt;
}
INewsDAO.java (인터페이스)
뉴스의 SQL 코드와 매핑되는 껍데기 메소드를 인터페이스(interface)로 생성하며, 인터페이스에 Mapper라는 어노테이션을 지정한다.
package dev.zeronelab.mybatis.dao;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import dev.zeronelab.mybatis.vo.NewsEntity;
@Mapper
public interface INewsDAO {
public List<NewsEntity> listNews();
}
NewsController.java
조회를 실행 할, NewsController를 아래와 같이 생성한다.
package dev.zeronelab.mybatis.web;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import dev.zeronelab.mybatis.dao.INewsDAO;
import dev.zeronelab.mybatis.vo.NewsEntity;
@Controller
public class NewsController {
private Logger logger = LoggerFactory.getLogger(NewsController.class);
@Autowired
private INewsDAO newDAO;
@RequestMapping("/news")
public @ResponseBody Map<String, Object> news() throws Exception {
Map<String, Object> rtnObj = new HashMap<> ();
List<NewsEntity> newsList = newDAO.listNews();
logger.info("news->" + newsList.toString());
rtnObj.put("news_list", newsList);
return rtnObj;
}
}
News.xml
마지막으로 핵심이 되는 SQL 문과 설정이 담겨져 있는 News.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">
<mapper namespace="dev.zeronelab.mybatis.dao.INewsDAO">
<!-- 뉴스 조회 -->
<select id="listNews" resultType="dev.zeronelab.mybatis.vo.NewsEntity">
select title, journalist, publisher, reg_dt from news
</select>
</mapper>
mapper namespace는 이 매퍼코드와 1:1 매핑을 시킬 객체를 지정하며(INewsDAO), INewsDAO에 있는 listNews 메소드명과 동일한 이름(id)을 가진 select를 생성한다.
resultType의 경우 결과를 어떤 Entity로 받을 것인지를 나타내며, 여기서는 News만을 위한 NewsEntity 클래스가 있기에 해당 클래스를 지정한다. 그리고 select xml안에는 결과를 조회할 쿼리를 지정한다.
조회 결과
모든 설정이 완료되었다면 아래와 같이 localhost:8080/news를 호출하여, 뉴스 결과를 뿌려보도록 한다.
결과가 정상적으로 나오는 것을 확인하였다. 다음 포스팅에서는 Mybatis의 다양한 예제를 통해서 조회(select), 삽입(insert), 갱신(update)를 알아보도록 한다.
참고자료
[1] https://blog.mybatis.org/p/about.html
[2] https://en.wikipedia.org/wiki/MyBatis
연관 포스팅
'프로그램언어 > 스프링(Spring)' 카테고리의 다른 글
[Spring boot] 스프링부트 jdbcTemplate 세팅 및 예제 (0) | 2022.04.28 |
---|---|
[Springboot] 스프링부트로 부트스트랩(bootstrap) 붙이기 (0) | 2021.06.20 |
[Spring] 스프링에서 Scheduler 사용하기 (0) | 2021.02.03 |
[Spring] WAS 환경별 @Value 변경 방법 (0) | 2020.10.23 |
[Spring] @value(value annotation) 사용 방법 (0) | 2020.10.23 |