@Mapper 인터페이스 생성
Mybatis Mapper.xml 파일 생성 및 CRUD 쿼리 추가
<?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">
<!-- dtd: document type definition / xml의 구조, element, attributes 정의 -->
properties 파일에 칼럼명 규칙 자동 바인딩 설정, DB의 _스네이크_케이스_ 와 자바의 camelCase
mybatis.configuration.map-underscore-to-camel-case=true
Config 클래스에 MyBatis 설정을 읽어 오는 factoryBean.setConfiguration, Mapper 경로 설정 factoryBean.setMapperLocations 추가
게시글id를 자동 채번하기 위해 Sequence와 프로시저를 만들었는데, 순번이 순서대로 증가하지 않아 확인한 결과 Sequence에 cache 옵션이 설정되어 있어 발생한 것을 확인함. cache 옵션 비활성화로 해결 함.
ALTER SEQUENCE POSTID_SEQ NOCACHE;
BEGIN
DECLARE postid_body INT;
DECLARE postid_head VARCHAR(10);
DECLARE result_postid_seq VARCHAR(30);
DECLARE critm_char VARCHAR(4);
SET critm_char='A';
dup_check_loop: LOOP
SELECT NEXTVAL(POSTID_SEQ) INTO postid_body;
SELECT CONCAT(SUBSTR(now(),1,4), critm_char) INTO postid_head;
SELECT CONCAT(postid_head, LPAD(postid_body, 7, '0')) INTO result_postid_seq;
IF NOT EXISTS (SELECT 1 FROM ENTIRE_BOARD_TB WHERE post_id = result_postid_seq) THEN
LEAVE dup_check_loop;
END IF;
END LOOP dup_check_loop;
RETURN result_postid_seq;
END
INSERT 테스트 까지 완료 했으나, DB에 INSERT된 시간이 PC 시간과 일치하지 않는 문제 발생.
-- MariaDB에서 확인해보니 SYSTEM의 시간을 따라가게 되어있음
SELECT @@global.time_zone, @@session.time_zone;
원인은 Docker 컨테이너의 서버 시간이 다르게 설정되어있었기 때문이었음.
앞으로 도커 컨테이너를 생성할 때는 TZ 값도 설정할 필요가 있음.
docker run -d -p 8080:8080 -e TZ=Asia/Seoul docker_image_name
이미 컨테이너를 생성한 경우에는 컨테이너 cmd에서
ln -snf /usr/share/zoneinfo/Asia/Seoul /etc/localtime
명령어로 변경 가능
Mapper.xml의 CRUD 쿼리들 JUnit Test 진행
Test 중간에 DB에 컬럼을 추가했는데, 이 때문에 Mapper.xml, VO, DTO를 일일이 바꿔줘야하는 번거로움이 있었음. MyBatis의 단점 중 하나를 겪음.
MyBatis 방식에서 쿼리 파라미터를 전달 할 때, ${param} 보다는 #{param} 을 사용 하는게 보안에 더 유리함.
Test 중 Select 구문의 결과에서 NULL이 나오는 문제가 있었는데, 그 이유는 JAVA와 DB 간의 컬럼규칙 자동 설정을 해놨음에도 VO 객체에 DB 컬럼명의 스네이크 케이스를 그대로 사용해서 였음.
DTO, VO의 멤버들을 모두 CamelCase 형식으로 재명명하여 해결.