- [트러블 슈팅] 개발 서버와 배포 서버 사이에 DB 불일치 해결2025년 03월 31일 19시 21분 42초에 업로드 된 글입니다.작성자: do_hyuk
문제의 시작은 서버 배포 후 서비스를 운영하며 새로운 기능을 만들고 있던 때 부터인 것으로 확인되었다.
첫번째 상황으로는 추가 기능인 댓글&대댓글을 개발 서버에만 적용을 하고 배포 서버에는 적용을 하지 않았기 때문에 배포 DB에 comment 관련 테이블이 존재하지 않다는 것이다.
이 부분은 flyway로 script.sql에 comment 테이블이 존재하지 않을 시 생성하도록 명령어를 작성해 놓았기 때문에 문제 해결
두번째 상황으로는 member 테이블에 role 컬럼 타입 불일치 문제가 발견되었다.
이 또한 서버 배포 후 다른 팀원이 role 이라는 enum 클래스에 Converter 를 적용하게 되면서 발생한 것이다.
이를 해결하기 위해서는 아래와 같이 수정해야한다.
@Converter public class MemberConverter implements AttributeConverter<Role, Byte> { // Integer -> Byte 변환 ... }
또한 flyway를 적용하기 전 개발 서버의 ddl-auto 옵션이 update 였기 때문에 role 컬럼이 이미 int로 변경되었다.
또한 개발 서버에 이미 int로 타입지정 되어있기 때문에 수정해주었다.
-- 프로시저 정의 DROP PROCEDURE IF EXISTS ModifyRoleColumn; CREATE PROCEDURE ModifyRoleColumn() BEGIN DECLARE column_type VARCHAR(64); -- 현재 role 컬럼의 데이터 타입을 확인 SELECT DATA_TYPE INTO column_type FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'member' AND COLUMN_NAME = 'role' AND TABLE_SCHEMA = '데이터베이스 이름'; -- role 컬럼이 TINYINT가 아닐 경우에만 수정 IF column_type IS NULL OR column_type != 'tinyint' THEN ALTER TABLE member MODIFY COLUMN role TINYINT; END IF; END; -- 프로시저 호출 CALL ModifyRoleColumn();
배포 서버와 개발 서버 유니크 제약 조건 불일치 발생
배포 서버에서는 email 컬럼에 유니크 제약 조건을 걸지 않았지만
이 후에 변경사항이 적용되면서 개발 서버에만 적용이 되었다. 물론 제약 조건을 배포 서버 DB에 직접 접근하여 수정 할 수 있지만
Flyway를 사용하면서 데이터베이스에 직접 접근하는 방식은 지양해야한다 생각되어서 최대한 flyway를 통해 해결하고자 한다.
이때 발생하게 될 문제가 바로 이미 제약 조건이 존재하는 개발 DB에는 적용이 되면 안되고 배포 DB에는 적용이되야 한다는 점이다.
IF문을 사용할 생각을 했지만 테이블 구조를 바꾸는 Alter Table 명령어에서는 조건문을 사용할 수 없기 때문에 프로시저를 생성하여 해당 제약 조건이 존재하면 1 아니면 0을 호출하여 0일 경우에 제약조건을 생성하도록 했다.
-- 기존 프로시저 삭제 DROP PROCEDURE IF EXISTS AddUniqueConstraintIfNotExists; -- 프로시저 정의 CREATE PROCEDURE AddUniqueConstraintIfNotExists() BEGIN DECLARE constraint_exists INT DEFAULT 0; -- 유니크 제약 조건 존재 여부 확인 SELECT COUNT(*) INTO constraint_exists FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME = '테이블 이름' AND CONSTRAINT_NAME = '유니크 제약 조건 이름' AND TABLE_SCHEMA = '데이터베이스 이름'; -- 제약 조건이 존재하지 않으면 추가 IF constraint_exists = 0 THEN ALTER TABLE '테이블' ADD CONSTRAINT '유니크 제약 조건 이름' UNIQUE (email); END IF; END; -- 프로시저 호출 CALL AddUniqueConstraintIfNotExists();
'포트폴리오 > AutoReview' 카테고리의 다른 글
Join 연산 무조건 피해야 하나? (0) 2025.03.24 [트러블 슈팅] 2개 이상의 데이터베이스 초기화 기능은 사용하지 말자 (0) 2025.03.22 Flyway_Schema_History 테이블 자동 복구하기 (0) 2025.03.20 배포된 데이터베이스의 스키마를 변경해보자(2) (0) 2025.03.15 배포된 데이터베이스의 스키마를 변경해보자(1) (0) 2025.03.11 댓글