기록3

LD·2024년 1월 4일
0

@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 형식으로 재명명하여 해결.


* DBeaver 사용 시 AutoCommit 설정되어 있으니 주의. 윈도우 > 연결 > 연결 유형에서 해제 가능

0개의 댓글

관련 채용 정보