[Spring Boot] MyBatis 설정 및 사용법


 

Spring Boot에서 MyBatis 설정 방법 및 간단 사용법에 대해 알아보겠다.MyBatis는 java에서 쿼리를 실행을 돕는 라이브러리다.


[수행 환경]

Windows 10
IntelliJ 2020.3.4
MariaDB 10.11
java 11
gradle-7.6


[Gradle 설정]
// MyBatis
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.3.1'

 

[Yml 설정]
mybatis:
  type-aliases-package: com.test.main.data.mapper
  mapper-locations: static/mapper/*.xml   #해당 위치에 xml 파일을 둬야 한다. 밑에서 다시 설명하겠다.

 

[테이블 생성]
CREATE TABLE `agree` (
  `SEQ` int(11) NOT NULL AUTO_INCREMENT COMMENT '시퀀스',
  `MEM_ID` varchar(50) NOT NULL COMMENT '아이디',
  `PHONE` varchar(50) DEFAULT NULL COMMENT '전화번호',
  `EMAIL` varchar(50) DEFAULT NULL COMMENT '이메일',
  `CONTENTS_SEQ` int(11) NOT NULL COMMENT '동의서 컨텐츠 아이디',
  `AGREE_YN` varchar(1) DEFAULT NULL  COMMENT '동의여부',
  `SYS_CREATE_DT` datetime DEFAULT current_timestamp() COMMENT '등록한시간',
  `SYS_CREATE_USR` varchar(50) NULL COMMENT '등록한사람',
  `SYS_UPDATE_DT` datetime DEFAULT current_timestamp() COMMENT '등록한시간',
  `SYS_UPDATE_USR` varchar(50) NULL COMMENT '수정한사람',
  PRIMARY KEY (`SEQ`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci;

 

[디렉토리 구조 확인하기]
아래 부터 Mybatis를 구동하는데 필요한 맵퍼를 살펴볼 것인데 파일 저장 위치는 위와 같다.
AgreeMapper.xml은 위에 YML에 설정 한 것 처럼 resources/static/mapper에 뒀다. 
둘다 위치가 같지 않으면 실행이 되지 않으니 주의 하여야 한다.

 

[AgreeMapper.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="com.test.main.data.mapper.AgreeMapper">
    <select id="findAgree" resultType="com.test.main.data.dto.AgreeDto">
        <![CDATA[
            SELECT
            AGREE_YN AS agreeYn,
            CONTENTS_SEQ As contentsSeq
            FROM AGREE
            WHERE MEM_ID = #{memId}
        ]]>
    </select>
</mapper>

 

[Agree Mapper interface 작성]
package com.test.main.data.mapper;

import com.test.main.data.dto.AgreeDto;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
@Mapper
public interface AgreeMapper {
    List<AgreeDto> findAgree(@Param("memId") String memId);
}

 

[Generate POJOs.groovy 파일 내용 작성]
import com.intellij.database.model.DasTable
import com.intellij.database.util.Case
import com.intellij.database.util.DasUtil

/*
 * Available context bindings:
 *   SELECTION   Iterable<DasObject>
 *   PROJECT     project
 *   FILES       files helper
 */

packageName = "com.main.service.data.entity;"
typeMapping = [
  (~/(?i)int/)                      : "long",
  (~/(?i)float|double|decimal|real/): "double",
  (~/(?i)datetime|timestamp/)       : "LocalDateTime",
  (~/(?i)date/)                     : "LocalDateTime",
  (~/(?i)time/)                     : "LocalDateTime",
  (~/(?i)/)                         : "String"
]

FILES.chooseDirectoryAndSave("Choose directory", "Choose where to store generated files") { dir ->
  SELECTION.filter { it instanceof DasTable }.each { generate(it, dir) }
}

def generate(table, dir) {
  def className = javaName(table.getName(), true)
  def fields = calcFields(table)
  new File(dir, className + ".java").withPrintWriter { out -> generate(out, className, fields) }
}

def generate(out, className, fields) {
    out.println "package $packageName"
    out.println ""
    out.println "import lombok.*;"
    out.println "import javax.persistence.*;"
    out.println "import java.time.LocalDateTime;"
    out.println "import java.math.BigDecimal;"
    out.println ""
    out.println "@Entity"
    out.println "@Getter"
    out.println "@Setter"
    out.println "@Builder"
    out.println "@NoArgsConstructor"
    out.println "@AllArgsConstructor"
    out.println "public class $className {"
    out.println ""
    fields.each() {
        out.println "  /**"
        out.println "  * "
        out.println "  */"
        if (it.annos != "") out.println "  ${it.annos}"
        out.println "  private ${it.type} ${it.name};"
        out.println ""
    }
    out.println "}"
}

def calcFields(table) {
  DasUtil.getColumns(table).reduce([]) { fields, col ->
    def spec = Case.LOWER.apply(col.getDataType().getSpecification())
    def typeStr = typeMapping.find { p, t -> p.matcher(spec).find() }.value
    fields += [[
                 name : javaName(col.getName(), false),
                 type : typeStr,
                 annos: ""]]
  }
}

def javaName(str, capitalize) {
  def s = co  m.intellij.psi.codeStyle.NameUtil.splitNameIntoWords(str) 
    .collect { Case.LOWER.apply(it).capitalize() }
    .join("")
    .replaceAll(/[^\p{javaJavaIdentifierPart}[_]]/, "_")
  capitalize || s.length() == 1? s : Case.LOWER.apply(s[0]) + s[1..-1]
}
[서비스 클래스 작성]
package com.test.main.domain.agree;

import com.test.main.data.dto.AgreeDto;
import com.test.main.data.mapper.AgreeMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.List;

@Slf4j                      //로그 기능 추가 Annotation
@Service                    //서비스 컴포넌트로 spring boot에 등록하는 Annotation
@RequiredArgsConstructor    //final로 지정된 맴버변수에 대해서 생성자 자동 생성
public class AgreeService {

    final private AgreeMapper agreeMapper;

    public List<AgreeDto>  findAgree(String memId) {

        List<AgreeDto> agrees = null;

        try {
            agrees = agreeMapper.findAgree(memId);
        } catch (Exception e) {
            log.error(e.getMessage());
        }
        return agrees;
    }
}
[Controller 클래스 작성]
package com.test.main.domain.agree;

import com.test.main.data.dto.AgreeDto;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@Slf4j                      //로그 기능 추가 Annotation
@RequestMapping("/v1")
@RestController             //RestController 컴포넌트로 spring boot에 등록하는 Annotation
@AllArgsConstructor         //final로 지정된 맴버변수에 대해서 생성자 자동 생성
@Api(tags = {"20.동의 API"})
public class AgreeController {

    private final AgreeService agreeService;
    
    @GetMapping("/agree")
    @ApiOperation(value = "동의 조회")
    public List<AgreeDto> selAgree (String memId) {
        return agreeService.findAgree(memId);
    }
}

 

반응형

+ Recent posts