springboot - mybatis - MySql 연동

skyepodium·2022년 6월 3일
1
post-thumbnail

내가 보려고 작성

1. 환경

  • 자바 11
  • springboot
  • gradle
  • mybatis (camelCase 옵션 추가)
  • MySql(도커 - 내가 편하려고 도커 사용한것이고, 아무거나 상관없음, 혹시라도 도커 몰라서 거부감 ㄴㄴ)
  • 도커
  • yml

깃허브 모든 코드

2. MySql

저는 로컬 전역에 MySql 설치하는것 싫어서, 도커로 합니다. 다만, 클라우드의 DB(예: AWS - RDS) 등등 아무거나 상관없습니다.

참고로, DB 인스턴스는 도커로 잘 관리하지는 않습니다.

이고잉님의 비유를 참고하면

  • 도커 이미지 - 스마트폰 앱
  • 도커 컨테이너 - 스마트폰 앱을 실행한 프로세스

1) 이미지 다운로드

docker pull mysql

docker ls

도커 데스크탑 사용한다면 목록에 나옵니다.

2) 이미지 기반으로 컨테이너 생성 및 실행

name: default 로 지정했습니다.
MySql 컨테이너 생성할때 1. password, 2. 포트 있어야 합니다.

docker run --name default -e MYSQL_ROOT_PASSWORD=a389fh12j48 -d -p 3306:3306 mysql

참고, 패스워드 root로 하지 마세요. 로컬에서 잠시 돌릴려고 root/root로 지정했다가 해킹당했습니다. 비트코인 주면 풀어주겠다고 함

실행중인 컨테이너 목록 확인

docker ps -a

3) workbench 확인

  • 로컬에서 mysql 실행
  • 포트 - 3306
  • username - root
  • 패스워드 - 이것만 넣으면 접속 가능합니다.

4) 데이터베이스, 테이블 생성

지금 여름이니까 DB 이름은 summer로 생성
테스트를 위한 user 테이블 생서

# 1. 새로운 데이터베이스 생성, 이름 - summer
CREATE DATABASE summer;

# 2. summer 데이터베이스 사용 명시 
USE summer;

# 3. 유저 테이블 생성
CREATE TABLE `summer`.`user` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `login_id` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE INDEX `idnew_table_UNIQUE` (`id` ASC) VISIBLE,
  UNIQUE INDEX `login_id_UNIQUE` (`login_id` ASC) VISIBLE);

# 4. 유저 테이블에 값 삽입
INSERT INTO user (login_id)
values ('hello'), ('world');

# 5. 확인
SELECT
		id
	,	login_id
FROM 
	user
ORDER by
	id asc;

3. SpringBoot

1) 프로젝트 생성

새로운 프로젝트를 생성
프로젝트 명 - hello-mybatis

추가한 의존성

  • web - tomcat, MVC
  • lombok - getter, setter 편하게 하려고
  • mybatis - mapper
  • MySQL Driver - mysql 연동 위함
plugins {
    id 'org.springframework.boot' version '2.7.0'
    id 'io.spring.dependency-management' version '1.0.11.RELEASE'
    id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.2'
    compileOnly 'org.projectlombok:lombok'
    runtimeOnly 'mysql:mysql-connector-java'
    annotationProcessor 'org.projectlombok:lombok'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

tasks.named('test') {
    useJUnitPlatform()
}

롬복 사용했으니까 Enable annotation processing 체크해준다.

일단 여기서 바로 실행못한다, DB 연동 해줘야한다.

2) DB config

package com.example.hellomybatis.config;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

@Configuration
@MapperScan(value = "com.example.hellomybatis", sqlSessionFactoryRef = "SqlSessionFactory")
public class DbConfig {

    @Value("${spring.datasource.mapper-locations}")
    String mPath;

    // mybatis 설정 파일을 따로 작성해서 임포트할 예정 - snake_case -> camelCase 를 위함
    @Value("${mybatis.config-location}")
    String mybatisConfigPath;


    @Bean(name = "dataSource")
    @ConfigurationProperties(prefix = "spring.datasource")
    public DataSource DataSource() {
        return DataSourceBuilder.create().build();
    }


    @Bean(name = "SqlSessionFactory")
    public SqlSessionFactory SqlSessionFactory(@Qualifier("dataSource") DataSource DataSource, ApplicationContext applicationContext) throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(DataSource);
        sqlSessionFactoryBean.setMapperLocations(applicationContext.getResources(mPath));
        sqlSessionFactoryBean.setConfigLocation(applicationContext.getResource(mybatisConfigPath));
        return sqlSessionFactoryBean.getObject();
    }

    @Bean(name = "SessionTemplate")
    public SqlSessionTemplate SqlSessionTemplate(@Qualifier("SqlSessionFactory") SqlSessionFactory firstSqlSessionFactory) {
        return new SqlSessionTemplate(firstSqlSessionFactory);
    }

}

3) application.yml

개인적으로 application.properties를 yml로 바꿔서 사용합니다. 그냥 개취고, yml 사용하면 더 보기 편하고 중복된 부분도 작성안해도 되어서

spring:
  datasource:
    username: root
    password: a389fh12j48
    mapper-locations: classpath:/mapper/**/*.xml
    jdbc-url: jdbc:mysql://localhost:3306/summer?&serverTimezone=UTC&autoReconnect=true&allowMultiQueries=true&characterEncoding=UTF-8
    driver: com.mysql.cj.jdbc.Driver

mybatis:
  configuration:
    map-underscore-to-camel-case: true
  config-location: classpath:/mybatis/mybatis-config.xml

4) mybatis-config.xml

DB 조회결과를 snake_case -> camelCase 변환해주는 옵션이고, 이거 설정해야 lombok 사용하기 편합니다.

.yml 파일에서 넣으면 이유는 모르지만 잘 안되어서 .xml파일에 넣고 읽도록 합니다.

<?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>
    <settings>
        <!-- DB 조회결과 snake_case -> camelCase 변환 -->
        <setting name="mapUnderscoreToCamelCase" value="true" />
    </settings>
</configuration>

5) domain

package com.example.hellomybatis.domain;

import lombok.Data;

@Data
public class User {
    private long id;
    private String loginId;
}

6) UserMapper.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.example.hellomybatis.mapper.UserMapper">

    <select id="getUserList" resultType="com.example.hellomybatis.domain.User">
        SELECT
                id
             ,	login_id
        FROM
            user
        ORDER by
            id asc
    </select>
</mapper>

7) UserMapper

package com.example.hellomybatis.mapper;

import com.example.hellomybatis.domain.User;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

@Mapper
public interface UserMapper {

    List<User> getUserList();
}

8) UserService

package com.example.hellomybatis.service;

import com.example.hellomybatis.domain.User;
import com.example.hellomybatis.mapper.UserMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.List;

@RequiredArgsConstructor
@Service
public class UserService {

    private final UserMapper userMapper;

    public List<User> getUserList() {
        return userMapper.getUserList();
    }
}

9) UserController

package com.example.hellomybatis.controller;

import com.example.hellomybatis.domain.User;
import com.example.hellomybatis.service.UserService;
import lombok.RequiredArgsConstructor;
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;

@RequiredArgsConstructor
@RequestMapping("/api/v1/user")
@RestController
public class UserController {

    private final UserService userService;

    @GetMapping
    public List<User> getUserList () {
        return userService.getUserList();
    }
}

4. 확인

스프링 부트를 실행하고 다음 URL에 접속하면 유저 목록이 나옵니다.
http://localhost:8080/api/v1/user

mybatis의 mapUnderscoreToCamelCase 설정을 추가했기 때문에 ResultMapper 없이 lombok 기능만으로 camelCase로 반환 가능합니다.

profile
callmeskye

0개의 댓글