[이슈] SQL로 DB 스키마 변경

HwangBaco·2023년 12월 28일
0

ISSUE

운영중인 서버의 DB 스키마를 변경해야 했다. 로직을 수정하다보니 기존 스키마에 불필요한 칼럼이 존재함을 알게 된 것이다. 경우에 따라서는 칼럼을 추가해야 하는 경우도 있었다.

현재 운영 서버는 ddl-auto : none 으로 설정하고 사용하고 있다. 따라서 스키마 수정만을 위해 ddl-auto : update 처리하고 restart하는건 벼룩 잡겠다고 집을 태우는 것과 유사한 느낌이라고 판단했다. 잘 운영되고 있는 서버를 로직 수정도 아닌 상황에서 내려야 하며, ddl-auto에 의존하게 되면 어떻게 sql이 작성될지 알기 어렵다는 게 문제다. 즉, 리스크가 있는 선택이라는 거다.

SQL 몇 줄 쓰는게 어려운 일도 아닌데, 참 바보같게도 과거에는 ddl-auto에 의존적으로 스키마 구성을 해왔던 것 같다. 하지만 운영 과정에서는 이야기가 많이 다름을 이해하게 됐다. (사실, 다 떠나서 이런 작은 작업은 당연히 필요한 ddl문을 개발자가 SQL로 주입하는게 맞다. 굳이 risk-taking을 할 필요가 없으니까. 그러니까 JPA를 사용하더라도 SQL은 반드시 알고 있어야 한다.)

AS-IS

create table post_like
(
    id            bigint auto_increment
        primary key,
    user_id       bigint   not null,
    post_id       bigint   null,
	is_canceled   bit      not null,
    constraint FK45h2j5kl43l532l4h52lk341m
        foreign key (user_id) references user (id),
    constraint FK54hl2k3j5hk43hkh5l43kl53l
        foreign key (post_id) references post (id)
);

위와 같이 table 구조를 설정해 두었다고 예시를 들어보자.

두 가지 변경사항 확인

  1. 기존에는 좋아요 로직상에서 soft delete로만 관리하고자 했기에 is_canceled라는 필드를 사용하려고 했다. 하지만 이후 나는 is_canceled 필드를 관리하기보다 바로 지우는 로직으로 변경하고자 했다. count 쿼리 관리에 bit 필드를 필터링하는 로직을 추가해야 하고, 내가 운영하는 서버에서는 데이터를 전부 보존하면서 얻는 가치 대비 비용이 크다는 판단에서였다.

  2. 또한, 나의 실수로 인해 BaseTimeEntity를 상속하지 않은 채 엔티티 생성을 해버려서 관련 필드를 추가해야 한다.

TO-BE

나는 저기서 두 가지 작업을 하려고 한다.
1. is_canceled column을 지우기
2. created_date, modified_date column 추가하기

이를 수행하기 위한 SQL은 아래와 같다.

  • is_canceled 칼럼 지우기
alter table post_like
drop column is_canceled;
  • created_date, modified_date column 추가하기
alter table post_like
add column created_date datetime,
add column modified_date datetime;

위 sql문을 datebase console에서 실행을 하면 내가 원하는 결과를 얻게 된다.

create table post_like
(
    id            bigint auto_increment
        primary key,
    user_id       bigint   not null,
    post_id       bigint   null,
    created_date  datetime null,
    modified_date datetime null,
    constraint FK45h2j5kl43l532l4h52lk341m
        foreign key (user_id) references user (id),
    constraint FK54hl2k3j5hk43hkh5l43kl53l
        foreign key (post_id) references post (id)
);
profile
알고리즘 풀이 아카이브

0개의 댓글