본문 바로가기
Database

운영환경에서 안전하게 테이블 칼럼을 추가하려면 어떤 방법이 좋을까?

by Jammini 2025. 1. 12.
728x90

목차

  1. 개요
  2. 한 번에 처리하는 방법
  3. 왜 3단계로 나눠서 작업해야 할까?
  4. 결론

1. 개요

진행하고 있는 프로젝트는 게시판 프로젝트인데, 한 번에 생각으로 설계하고 만드는 것이 아닌 요구사항이 추가된다고 생각하고 점진적인 게시판을 만드는 프로젝트이다.

 

기본적인 게시판에 필요한 API를 만들었고 해당 테이블의 칼럼은 아래와 같다.

 

 

post 테이블의 식별자인 id, 제목인 title, 내용인 content 만 가지고 있었다.

 

근데 클라이언트 측에서 조회 수 기능이 있으면 좋겠다고 하면서 요구사항을 던져주셨다.

 

Client : “post 테이블에 조회수 칼럼 넣어주세요~”

Server : “네~”

Server : 뚜따뚜따 “ALTER TABLE post ADD COLUMN view_count”

Server : “반영했습니다~”

Client : “????”

 

실제 운영하는 프로젝트에서는 빈번하게 일어날 수 있는 일이다.

간단한 게시글 프로젝트에서 post테이블에 viewCount칼럼을 추가하는 예시를 통해서 확인해보자.

2. 한 번에 처리하는 방법

만약 테이블이 작아서 단일 ALTER 문으로 처리해도 부담이 없거나, 짧은 다운타임이 허용되는 환경이라면, 아래처럼 한 번에 처리할 수도 있다.

ALTER TABLE post ADD COLUMN view_count INT UNSIGNED NOT NULL DEFAULT 0;
  • 다만, 아주 큰 테이블에서는 DDL이라 하더라도 잠금이 발생하거나, 예기치 못한 성능 저하가 있을 수 있으므로 반드시 테스트 환경에서 검증 후 진행해야 한다.
  • 예기치 못한 사항을 방지하기 위해 우리는 한번에 처리했던 내용을 3단계로 나누어서 처리해야 한다.

3. 왜 3단계로 나눠서 작업해야 할까?

1. ADD COLUMN (DDL)

  • 새로운 칼럼을 추가하는 것은 테이블 구조 자체를 바꾸는 작업이다.
ALTER TABLE post ADD COLUMN view_count INT UNSIGNED NULL;

 

  • 대규모 테이블일수록, 한 번에 NOT NULL + DEFAULT까지 설정하면 DB가 전체 데이터를 잠글 수 있으므로 장애(락) 시간이 길어질 수 있다.
  • 따라서 일단 칼럼을 “NULL 허용” 상태로만 추가해두면, 기존 레코드를 즉시 변경할 필요가 없어 락 시간을 단축할 수 있다.

2. 기존 데이터 채우기 (DML)

  • 새 칼럼을 추가한 뒤, 기존 레코드들에 대해 적절한 값을 채운다.
UPDATE post SET view_count = 0 WHERE view_count IS NULL;
  • 이 과정에서 한 번에 모든 레코드를 업데이트하면, 대량의 트랜잭션이 발생해 DB에 부하가 걸릴 수 있다.
  • 운영 환경이라면 배치(Batch) 단위로 나누어서 천천히 업데이트하는 것이 안전하다.

3. 칼럼 제약 조건 + 기본값 설정 (DDL)

  • 기존 레코드가 모두 적절한 값 (0)으로 채워졌다면, 더 이상 NULL이 들어갈 일이 없으므로 최종적으로 NOT NULL과 DEFAULT를 설정해준다.
ALTER TABLE post MODIFY COLUMN view_count INT UNSIGNED NOT NULL DEFAULT 0;
  • 이때 이미 view_count가 0으로 채워져 있으므로, NOT NULL 제약이 걸려도 무리가 없다.

4. 결론

  • 운영 환경에서 안전하게 칼럼을 추가하려면, 가급적 (1) [DDL] 칼럼만 추가 DDL→ (2) [DML] 기존 데이터 채우기 → (3) [DML]NOT NULL & DEFAULT 설정 식으로 나누어 작업하는 것이 좋다.
  • 작은 규모의 테이블이거나 다운타임을 짧게 허용할 수 있다면, 한 번에 처리하는 방법도 가능하다.
  • 핵심은 DB 락(Lock)을 최소화하고, 기존 데이터 정합성을 유지하며, 장애 상황에 대한 롤백 전략을 미리 마련하는 것이다.
반응형