내가 보려고 작성
저는 로컬 전역에 MySql 설치하는것 싫어서, 도커로 합니다. 다만, 클라우드의 DB(예: AWS - RDS) 등등 아무거나 상관없습니다.
참고로, DB 인스턴스는 도커로 잘 관리하지는 않습니다.
이고잉님의 비유를 참고하면
docker pull mysql
docker ls
도커 데스크탑 사용한다면 목록에 나옵니다.
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
지금 여름이니까 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;
새로운 프로젝트를 생성
프로젝트 명 - hello-mybatis
추가한 의존성
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 연동 해줘야한다.
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);
}
}
개인적으로 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
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>
package com.example.hellomybatis.domain;
import lombok.Data;
@Data
public class User {
private long id;
private String loginId;
}
<?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>
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();
}
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();
}
}
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();
}
}
스프링 부트를 실행하고 다음 URL에 접속하면 유저 목록이 나옵니다.
http://localhost:8080/api/v1/user
mybatis의 mapUnderscoreToCamelCase
설정을 추가했기 때문에 ResultMapper 없이 lombok 기능만으로 camelCase
로 반환 가능합니다.