운영중인 서버의 DB 스키마를 변경해야 했다. 로직을 수정하다보니 기존 스키마에 불필요한 칼럼이 존재함을 알게 된 것이다. 경우에 따라서는 칼럼을 추가해야 하는 경우도 있었다.
현재 운영 서버는 ddl-auto : none
으로 설정하고 사용하고 있다. 따라서 스키마 수정만을 위해 ddl-auto : update
처리하고 restart하는건 벼룩 잡겠다고 집을 태우는 것과 유사한 느낌이라고 판단했다. 잘 운영되고 있는 서버를 로직 수정도 아닌 상황에서 내려야 하며, ddl-auto에 의존하게 되면 어떻게 sql이 작성될지 알기 어렵다는 게 문제다. 즉, 리스크가 있는 선택이라는 거다.
SQL 몇 줄 쓰는게 어려운 일도 아닌데, 참 바보같게도 과거에는 ddl-auto에 의존적으로 스키마 구성을 해왔던 것 같다. 하지만 운영 과정에서는 이야기가 많이 다름을 이해하게 됐다. (사실, 다 떠나서 이런 작은 작업은 당연히 필요한 ddl문을 개발자가 SQL로 주입하는게 맞다. 굳이 risk-taking을 할 필요가 없으니까. 그러니까 JPA를 사용하더라도 SQL은 반드시 알고 있어야 한다.)
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 구조를 설정해 두었다고 예시를 들어보자.
기존에는 좋아요 로직상에서 soft delete로만 관리하고자 했기에 is_canceled
라는 필드를 사용하려고 했다. 하지만 이후 나는 is_canceled
필드를 관리하기보다 바로 지우는 로직으로 변경하고자 했다. count 쿼리 관리에 bit
필드를 필터링하는 로직을 추가해야 하고, 내가 운영하는 서버에서는 데이터를 전부 보존하면서 얻는 가치 대비 비용이 크다는 판단에서였다.
또한, 나의 실수로 인해 BaseTimeEntity
를 상속하지 않은 채 엔티티 생성을 해버려서 관련 필드를 추가해야 한다.
나는 저기서 두 가지 작업을 하려고 한다.
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)
);