Search

PostgreSQL을 사용하면서 만났던 에러들

Tags
Database
Date
2024/03/20

1. 개요

MySQL, H2 가 아닌 PostgreSQL을 사용하면서 만났던 에러들을 정리해보겠습니다.
객체를 생성했는데 Long이 반환 안돼요
JPA를 이용하여 저장하는 메소드를 만들 때는 종종 Long 타입을 반환하도록 명시했습니다.
이번에 MyBatis를 접하면서 당연하게도 동일하게 작업을 했고 null 값이 반환되는 에러를 맞이 했습니다.
@Mapper public interface MemoMapper { Long insert(Memo memo);
Java
복사
알고보니 MyBatis에서는 Insert 되면서 자연스럽게 객체에 Long 값이 들어갑니다. 물론 반환 값은 void로 재설정해야 합니다. 추가적으로 mapper.xml에도 다음 설정을 진행해야 합니다.
<insert id="insert" useGeneratedKeys="true" keyProperty="id"> INSERT INTO TB_USER_MEMO (UID, ADMIN_ID, INFO, INS_DATE, MOD_DATE) VALUES (#{uid}, #{adminId}, #{info}, NOW(), NOW()) </insert>
Java
복사
테이블이 삭제가 안돼요
다른 테이블이 삭제하려는 테이블의 특정 값을 참조하고 있는 경우 삭제가 되지 않습니다. 이 경우 다른 테이블을 먼저 삭제하고 그 다음 참조되는 테이블을 삭제해야 합니다.
현재 작업하고 있는 경우에서는 notification_patient 중간 테이블이 notification 테이블을 참조하고 있었는데 다음과 같은 순서로 DB를 초기화 할 때면 애를 먹었습니다.
@BeforeEach void setup() { notificationMapper.deleteAll(); notificationMapper.deleteAllPatientNotifications(); }
Java
복사
따라서 반대로 삭제를 진행해주어야 합니다.
@BeforeEach void setup() { notificationMapper.deleteAllPatientNotifications(); notificationMapper.deleteAll(); }
Java
복사
테이블의 컬럼을 수정하거나 삭제하고 싶어요
SQL 문을 다시 한번 복습하고 갑시다.
ALTER TABLE public.tb_notification_1 add column is_enabled bool null; ALTER TABLE public.tb_patient_notification_1 RENAME COLUMN user_id TO patient_id;
Java
복사
추가적으로 중간 테이블을 생성하는 과정도 함께 보면 좋을 것 같습니다.
CREATE TABLE public.tb_patient_notification_1 ( notification_id BIGINT NOT NULL, patient_uid VARCHAR(500) NOT NULL, CONSTRAINT fk_patient_notification_notification_id FOREIGN KEY (notification_id) REFERENCES tb_notification_1 (id), CONSTRAINT fk_patient_notification_patient_uid FOREIGN KEY (patient_uid) REFERENCES tb_user (uid), CONSTRAINT uc_notification_patient UNIQUE (notification_id, patient_uid) );
Java
복사
startDate 부터 endDate 사이에 있는 메세지를 조회하고 싶은데 조회 되지 않아요
원래 SQL 쿼리는 다음과 같았습니다.
AND INS_DATE BETWEEN TO_DATE(#{startDate}, 'YYYYMMDD') AND ( TO_TIMESTAMP(#{endDate}, 'YYYYMMDD'))
Java
복사
문제는 endDate를 포함하고 사이에 있는 메세지들을 조회하는 것이 아닌 endDate 이전 즉 < endDate 로 값을 조회하고 있었습니다.
이 문제는 다음과 같이 해결했습니다.
<select id="findAllByUidBetweenStartDateAndEndDate" resultType="com.digitalpharm.admin.alcohol.data.entity.Message"> SELECT * FROM TB_USER_MSG WHERE UID = #{uid} AND INS_DATE BETWEEN TO_DATE(#{startDate}, 'YYYYMMDD') AND ( TO_TIMESTAMP(#{endDate}, 'YYYYMMDD') + INTERVAL '1 DAY' - INTERVAL '1 SECOND') </select>
Java
복사