1. Sequence

ID 값을 숫자가 아닌 다양한 방식으로 저장하고 싶은 경우 사용합니다. Thread-safety 하게 ID를 발급 받을 수 있으며, AUTO_INCREMENT 대신 사용할 수 있습니다.
Sequence는 값을 캐시하므로 경우에 따라 AUTO_INCREMENT 보다 빠를 수 있다고 합니다.

MariaDB의 Sequence 기능은 10.3버전 부터 지원됩니다.

 

2. Sequence 문법

CREATE [OR REPLACE] [TEMPORARY] SEQUENCE [IF NOT EXISTS] sequence_name
[ INCREMENT [ BY | = ] increment ]
[ MINVALUE [=] minvalue | NO MINVALUE | NOMINVALUE ]
[ MAXVALUE [=] maxvalue | NO MAXVALUE | NOMAXVALUE ]
[ START [ WITH | = ] start ] [ CACHE [=] cache | NOCACHE ]
[ CYCLE | NOCYCLE]
[table_options]

 

3. 간단한 Sequence 사용 방법

# 10.3 버전 이상인지 확인 
SELECT VERSION();

 

1) Sequence 생성

#시작값이 1이고 1씩 증가하는 "my_seq" Sequence를 생성
CREATE SEQUENCE my_seq START WITH 1 INCREMENT BY 1;

2) NEXTVAL

# 다음 sequence를 반환한다. 
# 처음 생성 한 것이면 start 값을 반환 
# thread-safety
SELECT NEXTVAL(my_seq);

3) LASTVAL

# 현재 sequence를 반환
# NEXTVAL을 한번도 실행시키지 않았다면 NULL 반환
SELECT LASTVAL(my_seq);

4) Sequence 초기화

# my_seq Sequence를 1로 초기화 한다.
# nextval를 실행하지 않은 상태로 lastval를 실행하면 초기화 전 값이 반환된다.
# 즉 한번이라도 nextval을 실행해야지 sequence가 초기화된다. 
ALTER SEQUENCE my_seq RESTART 1;

 


참조 

https://mariadb.com/kb/en/create-sequence/

1. Replace 함수란?

특정 문자열을 원하는 문자열로 변환하는 함수이다.

replace(컬럼명, '기존문자열', '변경문자열')

 

2. 사용 방법 

1) select

replace함수 실행 결과 추출하기

SELECT replace(url, 'http://' ,'https://') FROM file_info;

2) update 

'http://' 문자열이 포함된 컬럼을 'https://'로 변경

UPDATE file_info SET url = replace(url, 'http://' ,'https://');

1. ON DUPLICATE KEY UPDATE

데이터 삽입 시, PRIMERY KEY나 UNIQUE KEY가 중복되었을 경우 지정한 데이터만 UPDATE하는 명령어를 의미한다.
(중복된 키가 없을 경우 INSERT 로직을 수행한다.) 

1) member 테이블 생성

CREATE TABLE member (
	id INT AUTO_INCREMENT primary KEY,
	NAME VARCHAR(50) UNIQUE KEY,
	price INT NOT NULL DEFAULT 0,
	cnt INT NOT NULL DEFAULT 0
);

2) 데이터 삽입

INSERT INTO member (NAME, price, cnt) VALUES ('kim', 1000, 0) 
ON DUPLICATE KEY UPDATE 
  price = price * 2, 
  cnt = cnt + 1;

한번 더 데이터를 삽입 할 경우

새로운 행이 삽입 되지 않고, price와 cnt가 변경된 것을 볼 수 있다.

즉, 데이터 삽입 시, 중복키 제약조건에 위배 되면 ON DUPLICATE KEY UPDATE 아래에 지정한 필드가 수정된다.

위 테이블에 경우 name 값이 중복 되므로 price와 cnt 필드가 지정한 값으로 수정되었다.

2. INSERT IGNORE

중복키 제약조건에 위배되면 Insert를 무시한다.

INSERT IGNORE INTO member (NAME, price, cnt) VALUES ('kim', 1000, 0);

3. REPLACE INTO

중복키 제약조건에 위배되면 해당 레코드를 삭제하고 다시 삽입한다.

REPLACE INTO member (NAME, price, cnt) VALUES ('kim', 1000, 0);

레코드가 삭제되고 다시 삽입되기 때문에 AUTO_INCREMENT로 ID(PK)값을 지정했을 경우 ID값이 변하게 된다.

1. GROUP_CONCAT 명령어

SELECT의 결과로 나온 여러 행의 특정 컬럼을 한줄로 출력할 때 사용한다.
(NULL 값은 제외된다.)

2. 사용 방법

GROUP_CONCAT([DISTINCT] [expr, column] [ORDER BY column DESC] [SEPARATOR '구분자'])

3. 사용 예제

 1) member 테이블

CREATE TABLE `member` (
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	`NAME` VARCHAR(30) NULL DEFAULT NULL
	`age` INT(11) NULL DEFAULT NULL,
	PRIMARY KEY (`id`)
)

 2) member 데이터

INSERT INTO `member` (`NAME`, `age`) VALUES ('kim', 30);
INSERT INTO `member` (`NAME`, `age`) VALUES ('hong', 30);
INSERT INTO `member` (`NAME`, `age`) VALUES ('go', 31);
INSERT INTO `member` (`NAME`, `age`) VALUES ('lee', 33);
INSERT INTO `member` (`NAME`, `age`) VALUES ('son', 35);
INSERT INTO `member` (`NAME`, `age`) VALUES ('chang', 32);
INSERT INTO `member` (`NAME`, `age`) VALUES ('chei', 33);
INSERT INTO `member` (`NAME`, `age`) VALUES ('ho', 31);
INSERT INTO `member` (`NAME`, `age`) VALUES ('gu', 36);
INSERT INTO `member` (`NAME`, `age`) VALUES ('sang', 38);
INSERT INTO `member` (`NAME`, `age`) VALUES ('jang', 39);

 3) 쿼리

SELECT GROUP_CONCAT(name ORDER BY age DESC SEPARATOR ',') AS 'members'
FROM member

 4) 결과

jang,sang,gu,son,chei,lee,chang,ho,go,hong,kim

MariaDB에 일반로그 및 에러로그를 남기는 설정을 진행하겠습니다.

테스트 환경

OS MariaDB Version
CentOS 7 10.4.12

1. MariaDB 로그 설정 및 저장경로 확인

MariaDB에 로그인 후, 다음과 같은 명령어를 입력해줍니다.

SHOW VARIABLES LIKE '%general%';
>
일반 로그의 파일 명과 일반 로그 활성화 유무를 확인합니다

show variables like 'datadir';
>
mariadb의 저장소를 확인합니다.

일반 로그의 파일 명은 galera03.log입니다. 기본적으로 datadir 경로 아래에 저장되어 있습니다. 하지만 로그 설정이 활성화되어 있지 않기 때문에 로그 파일을 활성화시켜주어야 합니다.


2. general_log 활성화

> set global general_log = ON;
Query OK, 0 rows affected (0.002 sec)

> SHOW VARIABLES LIKE '%general%';

 

general_log가 ON으로 변경된 시점부터 /var/lib/mysql/galera03.log 파일에 로그가 쌓이게 됩니다.

general_log 영구 활성화

# vi /etc/my.cnf
...
[mysqld]
general_log=ON
...

MariaDB 종료 시, general_log는 OFF 상태로 변하게 됩니다. 하지만 위와 같이 설정해 두면 MariaDB 리부팅 해도 general_log ON 상태를 유지합니다. 


3. error.log 설정

# vi /etc/my.cnf

...
[mysqld]
general_log=ON
log-error=/var/lib/mysql/error.log

에러로그 파일의 경로를 지정합니다.

# touch /var/lib/mysql/error.log
# chown mysql:mysql /var/lib/mysql/error.log
# systemctl restart mariadb

error.log 파일을 생성하고 mysql에게 소유권을 부여합니다. 그리고 mariadb를 재시작 해줍니다.

위와 같이 설정했다면 바로 error.log가 쌓이는 것을 볼 수 있습니다. 

1. Galera Cluster 란? 

  • 오픈소스이다.
  • 동기 방식의 복제를 지원한다.
  • 노드간 통신을 위해 wsrep API를 사용한다.
  • Active-Active 방식의 다중 Master 구성 및 모든 노드에서 Read/Write가 가능하다.
  • 노드의 추가와 제거가 간단하고, 특정 노드에서 장애가 발생하면 자동으로 해당 노드가 제거된다.
  • InnoDB 만 지원한다.
  • Mysql 및 MariaDB 5.5 이상 버전에서 사용가능하다.
wsrep(Write Set REPlication) 란?
MySQL의 InnoDB 스토리지 엔진 내부에서 Write Set을 추출하고 기능을 구현합니다. 
(Write Set은 트랜잭션을 기록하는 모든 논리적 데이터 집합이다.)

노드간 Write Set을 송수신하기 위해서 별도의 복제 플러그인을 사용하며 wsrep에 정의된 call/callback 함수에 의해 동작하는 모듈입니다.

 

Galera Cluster 구성도

각 노드 마다 wsrep 모듈이 존재합니다. 이 모듈은 데이터베이스 복제를 위한 범용 모듈로 여기에 Galera Replication을 연결해주면 데이터베이스 변경이 있을 때 마다 다른 노드로 데이터를 복사합니다.


2. Galera Cluster 설치

System Information

HostName galera03 galera04 galera05
IP Address 192.168.152.143 192.168.152.144 192.168.152.145
OS CentOS 7 CentOS 7 CentOS 7
MariaDB Version MariaDB 10.4 MariaDB 10.4 MariaDB 10.4

 

MariaDB 설치

root 계정으로 MariaDB yum repo를 설치합니다.

[root@galera03 ~]# curl -sS https://downloads.mariadb.com/MariaDB/mariadb_repo_setup | bash

mariaDB 최신버전이 다운되므로 10.4버전이 아닐 수도 있습니다. 
10.4 버전을 받고 싶다면 /etc/yum.repos.d/mariadb.repo를 수정해주세요.

모든 repo에 대한 캐시 빌드

[root@galera03 ~]# yum makecache fast

MariaDB 및 Galera 설치

[root@galera03 ~]# yum install -y mariadb-server galera

3. 방화벽 설정 및 Galera Cluster 설정

Galera Cluster에서 사용하는 포트 설명

프로비저닝 포트

클러스터에서 개별 노드로 데이터를 복제하여 노드를 클러스터와 동기화하는 프로세스를 프로비저닝이라고합니다. 
Galera Cluster에는 노드를 프로비저닝하기 위해 사용할 수 있는 두 가지 방법을 제공합니다.

4444 (SST , State Snapshot Transfer)
새 노드가 클러스터에 참여하면 SST를 실행해 다른 노드와 동기화합니다.

4568 (IST , Incremental State Transfer) 
기준 노드와 비교할 때, 누락된 트랜잭션이 존재하면 동기화합니다.

나머지 포트

4567 (Galera Cluster)
각 노드의 연동 상태를 체크하고, 멀티 캐스트 복제 시, 이 포트에서 UDP 전송과 TCP를 모두 사용합니다.

3306 (Maria DB)
MariaDB 클라이언트 연결 및 상태 스냅 샷 전송

mysql 및 4567,4568,4444 포트 허용하기

[root@galera03 ~]# firewall-cmd --state  (방화벽이 실행되지 않았을 경우 systemctl start firewalld 입력)
running
[root@galera03 ~]# firewall-cmd --permanent --add-service=mysql
success
[root@galera03 ~]# firewall-cmd --permanent --add-port={4567,4568,4444}/tcp
success
[root@galera03 ~]# firewall-cmd --reload
success
[root@galera03 ~]# firewall-cmd --list-all

SELinux를 허용 모드로 설정

[root@galera03 ~]# setenforce 0
[root@galera03 ~]# sestatus

Current mode가 permissive 상태여야 합니다.

(MariaDB 클러스터에 대한 모든 작업이 끝나면 SELinux 정책을 1(강제모드)로 변경해주어야 합니다.)

Galera Cluster 설정

[root@galera03 ~]# vi /etc/my.cnf.d/server.cnf
...
[galera]
# Mandatory settings
wsrep_on=ON
wsrep_provider=/usr/lib64/galera-4/libgalera_smm.so
wsrep_cluster_address=gcomm://192.168.152.143,192.168.152.144,192.168.152.145
binlog_format=row
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
...

위 옵션들을 [galera] 아래에 입력해주고, wsrep_cluster_address에는 모든 노드의 IP를 입력해주세요.

(주의할 점은 galera 버전마다 /usr/lib64/galera-4/libgalera_smm.so 경로가 바뀔 수 있습니다.
실제 해당 파일이 존재하는지 확인 후에 설정해주세요.)

여기까지가 galera cluster의 설치 및 설정입니다. galera03과 같이 나머지 galera04, galera05에도 똑같이 작업해줍니다.


4. galera cluster 실행

galera03에서 다음 명령어를 입력해주세요.

[root@galera03 ~]# galera_new_cluster

galera_new_cluster 명령어는 기준 DB를 설정하는 동시에 mariadb를 실행하는 명령어입니다.

(나머지 node들이 실행되면 기준 DB를 기준으로 복제를 시작합니다.)

galera04, galera05 또한 mariadb를 실행해줍니다.

[root@galera04 ~]# systemctl start mariadb.service
[root@galera05 ~]# systemctl start mariadb.service

실행이 완료되었다면 각 노드 마다 Mariadb 비밀번호를 변경해줍니다.

[root@galera03 ~]# /usr/bin/mysqladmin -u root password '변경할 비밀번호 입력'

Mariadb root 계정으로 로그인합니다.

[root@galera03 ~]# mysql -u root -p 
Enter password: 설정한 비밀번호 입력

5. galera 연동 확인

> show global status like 'wsrep_cluster_size';

노드가 모두 연동되었다면 Value에 3이 출력되야합니다.

각 노드에서 위 명령어를 입력해 연동되었는지 확인해주세요.

wsrep 정보를 보고싶다면 다음 명령어를 입력해주세요.

> show status like 'wsrep_%';

여기서 유심히 봐야할 속성은  wsrep_local_state_uuid 속성입니다. 각 노드마다 해당 속성 값이 같은지 확인해주세요.


6. DB 생성 및 테이블 생성

Galera Cluster는 모든 노드가 Read/Write를 지원하기 때문에 기준 노드가 아닌 galera04노드에서 DB생성 및 테이블 생성이 진행되어도 다른 노드에 복제가 이루어집니다.

[ galera04 Node ]

> create database test_db;

Query OK, 1 row affected (0.005 sec)
> use test_db;
Database changed
> create table test_tb ( id int primary key );
Query OK, 0 rows affected (0.021 sec)
> insert into test_tb values(1);
Query OK, 1 row affected (0.020 sec)

위 명령어 실행 후 galera03, galera05에서 각각 test_db, test_tb가 생성되었는지 확인하고 test_tb에 데이터 복제가 되었는지 확인해주세요.

galera03, galera05에서 test_tb를 조회


7. galera cluster 복구 시나리오

1) MariaDB 데몬이 모두 죽었을 경우

SELINUX 허용 설정

setenforce 0

모든 노드의 /var/lib/mysql/grastate.dat 파일을 열어서 safe_to_bootstrap 속성이 1인 값을 찾습니다. 

# vi /var/lib/mysql/grastate.dat

# GALERA saved state version: 2.1
uuid: 2e39d6a4-5df7-11ea-a29f-e38a9ebb7084
seqno: 115
safe_to_bootstrap: 1

safe_to_bootstrap 값이 1인 경우 마지막으로 죽은 노드를 의미하기 때문에 해당 기준 노드로 실행합니다.

galera_new_cluster

실행이 완료 되면 나머지 노드도 실행해줍니다.

systemctl start mariadb

여기까지 완료되었다면 모든 노드에서 MariaDB 로그인 후 연결된 노드 개수가 맞는지 확인합니다.

> show global status like 'wsrep_cluster_size';

각 노드에서 위 명령어 입력 시, 예상했던 노드 개수와 일치하지 않다면, 해당 노드는 동기화 상태가 아닐 확률이 높습니다. 이때, 사용하고 있는 DB의 테이블을 SELECT 해봅니다. 

WSREP has not yet prepared node for application use

위와 같은 오류가 발생하면 동기화 상태가 아니므로 WSREP의 pc.bootstrap 옵션을 YES로 바꾸어주어야 합니다.

> SET GLOBAL wsrep_provider_options='pc.bootstrap=YES';
Query OK, 0 rows affected (0.000 sec)

위 옵션을 적용하고 나서 MariaDB를 옵션을 적용한 노드를 재시작해주어야 합니다.
재시작 후에 test_tb가 잘 조회되는지 확인해주고
show global status like 'wsrep_cluster_size'; 명령어를 입력하여 클러스터 사이즈가 3인지 확인해줍니다.

모든 복구가 완료되면 setenforce 1 명령어를 실행해줍니다.


8. gelera Cluster Test

테스트 환경 

HostName galera03 galera04 galera05
IP Address 192.168.152.143 192.168.152.144 192.168.152.145
OS CentOS 7 CentOS 7 CentOS 7
MariaDB Version MariaDB 10.4 MariaDB 10.4 MariaDB 10.4

 

테스트 설명

Case 1
로그 데이터 10만건 삽입 테스트  

Case 2
새로운 노드 추가 및 동기화 테스트

 

Case 1 - 로그 데이터 10만건 삽입 테스트 

테스트 방법

  • Java에서 Galera Cluster로 이중화된 galera03, galera04을 JDBC를 이용해 연결한다.
  • Galera Cluster에 로그 데이터 10만 건을 삽입한다.

JDBC 연결 URL

jdbc:mariadb:loadbalance://192.168.152.143:3306,192.168.152.144:3306/test_galera

테스트 결과

  • 로그 데이터 10만건 삽입하는데 13분정도 소요되며,  galera03, galera04 동기화 속도가 매우 빠름
  • 로그 삽입 시, 각 노드에 데이터 부하 분산이 골고루 이루어짐

Case 2 - 새로운 노드 추가 및 동기화 테스트 

테스트 내용

  • 기존에 동작하던 galera cluster에 새로운 노드 galera05(192.168.152.145)를 추가해준다. 
  • 데이터 동기화 속도를 측정한다.

테스트 결과

  • 새로운 노드를 galera cluster에 추가 시 모든 데이터베이스, 테이블, 레코드가 복제되며, 이전 테스트에서 삽입한 10만건의 로그데이터가 복제되는데 약 2~5초 정도 소요된다.  

참조 : https://bcho.tistory.com/1062

https://www.centlinux.com/2019/02/install-mariadb-galera-cluster-on-centos-7.html

안녕하세요. 이번에는 CentOS7에 MaraDB 설치 및 설정에 대한 포스팅을 진행하겠습니다.

MariaDB는 오픈 소스의 관계형 데이터베이스 관리 시스템(RDBMS)이다. MySQL과 동일한 소스 코드를 기반으로 하며, GPL v2 라이선스를 따른다.

출처 : https://ko.wikipedia.org/wiki/MariaDB

 

1. MariaDB yum repo 등록

vi /etc/yum.repos.d/MariaDB.repo
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.4/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1

mariadb 10.4 버전을 baseurl로 등록하였습니다. 다른 버전을 다운받고 싶다면 baseurl을 수정해주세요.


2. MariaDB 설치 및 확인

yum install MariaDB
# rpm -qa | grep MariaDB
MariaDB-compat-10.4.12-1.el7.centos.x86_64
MariaDB-client-10.4.12-1.el7.centos.x86_64
MariaDB-common-10.4.12-1.el7.centos.x86_64
MariaDB-server-10.4.12-1.el7.centos.x86_64

# mariadb --version
mariadb Ver 15.1 Distrib 10.4.12-MariaDB, for Linux (x86_64) using readline 5.1

3. MariaDB 실행 및 비밀번호 변경

//mariadb 실행
# systemctl start mariadb

//비밀번호 변경
# /usr/bin/mysqladmin -u root password '변경할 비밀번호 입력'

//포트 및 데몬 이름 확인
# netstat -anp | grep 3306


4. CharaterSet utf8mb4로 변경

# vi /etc/my.cnf
[mysqld]
default_storage_engine=innodb

init-connect='SET NAMES utf8mb4'
lower_case_table_names=1
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci


[client]
port=3306
default-character-set = utf8mb4

[mysqldump]
default-character-set = utf8mb4

[mysql]
default-character-set = utf8mb4

mariadb 재시작

systemctl restart mariadb

5. mariaDB 로그인 및 CharacterSet 확인

# mysql -u root -p
Enter password: 설정한 비밀번호 입력

characterSet이 utf8mb4로 변경되었는지 확인합니다.

> show variables like 'c%';


6. linux 리부팅 시 자동으로 실행되도록 설정

# systemctl enable mariadb
# systemctl is-enabled mariadb
enabled

참조 : https://ignorabilis.tistory.com/4


도움이 되셨다면 공감버튼을 눌러주세요!

안녕하세요. 밤둘레입니다.

MariaDB 연동 및 Mybatis 사용법 정리 글입니다.

Spring Boot Project를 생성하려면 아래 URL로 이동해서 프로젝트를 생성해주세요.

https://start.spring.io/

위와 같이 Spring Boot 프로젝트를 생성 하면 됩니다.


1. pom.xml

...
<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.0.1</version>
        </dependency>

        <dependency>
            <groupId>org.mariadb.jdbc</groupId>
            <artifactId>mariadb-java-client</artifactId>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
</dependencies>
...

2. application.properties

spring.datasource.hikari.maximum-pool-size = 4
spring.datasource.url = URL
spring.datasource.username = username
spring.datasource.password = password

mybatis.type-aliases-package = com.example.bamdule.model
mybatis.mapper-locations = mapper/xml/*.xml  
  • mybatis.type-aliases-package : Model Class Package 경로를 적어주시면 됩니다.
    사용하지 않으면 생략 해도 됩니다. 대신 mapper.xml 작성 시, Model의 모든 경로를 적어주셔야 합니다.
  • mybatis.mapper-locations : mapper.xml 경로를 적어주시면 됩니다.

3. Model Class 생성

import java.time.LocalDateTime;

public class Student {

    private Integer id;
    private String name;
    private String code;
    private LocalDateTime saveDate = LocalDateTime.now();
	
    //setter, getter, toString 생략
	
}

4. Mapper interface 생성

import com.example.bamdule.model.Student;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface StudentMapper {

    public List<Student> findList();

    public Student findOneByCode(String codes);

    public void save(Student student);

    public void update(Student student);

    public void deleteById(Integer id);
}

5. mapper-student.xml

<!DOCTYPE mapper
	PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
	"http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.example.bamdule.mapper.StudentMapper">
    <select id="findList" resultType="student">
        SELECT 
            id,
            name,
            code,
            save_date as 'saveDate'
        FROM student
    </select>
    
    <select id="findOneByCode" parameterType="String" resultType="student">
        SELECT
            id,
            name,
            code,
            save_date as 'saveDate'
        FROM student
        WHERE code = #{code}
    </select>    
    
    <insert id="save" parameterType="student">
        INSERT INTO student (
            name,
            code,
            save_date
        ) VALUES (
            #{name},
            #{code},
            #{saveDate}
        )
    </insert>
    
    <update id="update" parameterType="student">
        UPDATE student
        SET 
            name = #{name},
            code = #{code},
            save_date = #{saveDate}
        WHERE id = #{id}
    </update>
    
    <delete id = "deleteById" parameterType="int">
        DELETE FROM student WHERE id = #{id}
    </delete>
</mapper>
  • src/main/resources/mapper/xml/mapper-student.xml 위치에 생성해주시면 됩니다.
  • DB Query를 정의해 놓은 xml입니다.
  • namaspace는 Mapper Interface Package를 적어주시면 됩니다.

6. Table Create Query

CREATE TABLE `student` (
	`id` INT(11) NOT NULL AUTO_INCREMENT,
	`name` VARCHAR(20) NULL DEFAULT NULL,
	`save_date` DATETIME NULL DEFAULT NULL,
	`code` VARCHAR(30) NOT NULL,
	PRIMARY KEY (`id`),
	UNIQUE INDEX `CODE_UK` (`code`)
)

Test 하기전 Student Table을 생성해줍니다.


7. Test

import com.example.bamdule.mapper.StudentMapper;
import com.example.bamdule.model.Student;
import java.time.LocalDateTime;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@SpringBootTest
@RunWith(SpringRunner.class)
class BamduleApplicationTests {

    @Autowired
    private StudentMapper studentMapper;

    @Test
    void 학생_생성() {
        String code = "S20200102154530";
        String name = "Son";
        Student student = studentMapper.findOneByCode(code);

        if (student == null) {
            student = new Student(name, code);
            studentMapper.save(student);
        } else {
            student.setSaveDate(LocalDateTime.now());
            studentMapper.update(student);
        }
    }

    @Test
    void 학생_리스트_출력() {
        studentMapper.findList().forEach(data -> System.out.println(data));
    }

}

8. 결과

위와 같이 출력되었다면 성공입니다.


도움이 되셨다면 공감 한번씩 눌러주시면 감사하겠습니다.

+ Recent posts