[태그:] ALTER

  • 데이터베이스의 뼈대를 세우다: 데이터 정의어(DDL) 완벽 정복

    데이터베이스의 뼈대를 세우다: 데이터 정의어(DDL) 완벽 정복

    모든 잘 만들어진 애플리케이션의 이면에는 체계적으로 설계된 데이터베이스가 존재하며, 이 데이터베이스의 구조를 만들고, 수정하고, 제거하는 언어가 바로 ‘데이터 정의어(DDL, Data Definition Language)’입니다. DDL은 데이터를 담을 그릇의 형태와 규칙을 정의하는, 데이터베이스 세계의 ‘청사진’ 또는 ‘설계도’와 같습니다. 만약 데이터베이스를 하나의 거대한 건물에 비유한다면, 건물 안에 가구를 배치하고 사람들을 입주시키는 행위(데이터 조작, DML)를 하기 전에, 먼저 건물의 층수, 방의 개수, 창문의 위치, 그리고 각 방의 용도를 결정하는 설계 과정이 반드시 필요합니다. DDL은 바로 이 설계 과정에 사용되는 핵심적인 도구입니다.

    DDL은 데이터베이스 관리자(DBA)나 백엔드 개발자에게는 가장 기본적이면서도 강력한 권한을 부여하는 언어입니다. DDL 명령어를 통해 데이터베이스 스키마(Schema)라는 구조적 뼈대를 세우고, 데이터가 지켜야 할 무결성 제약조건을 명시하며, 전체 데이터베이스의 논리적 구조를 관리할 수 있습니다. 하지만 강력한 힘에는 큰 책임이 따르듯, DDL 명령어는 실행 즉시 영구적으로 반영되며 되돌리기 어렵다는 특징이 있어 사용에 신중을 기해야 합니다. 이 글에서는 데이터베이스의 기초를 세우는 DDL의 핵심 명령어인 CREATE, ALTER, DROP을 중심으로 그 기능과 사용법, 그리고 주의사항까지 완벽하게 파헤쳐 보겠습니다.

    DDL의 핵심 명령어: 생성, 수정, 그리고 삭제

    DDL의 역할은 명확합니다. 데이터베이스 객체(Object)의 구조를 정의하는 것입니다. 여기서 데이터베이스 객체란 데이터를 저장하거나 참조하는 모든 구조물, 즉 테이블(Table), 뷰(View), 인덱스(Index), 스키마(Schema) 등을 의미합니다. 이 객체들을 다루는 가장 대표적인 DDL 명령어는 CREATE, ALTER, DROP 세 가지입니다.

    CREATE: 무(無)에서 유(有)를 창조하다

    CREATE 명령어는 데이터베이스에 새로운 객체를 생성할 때 사용합니다. 가장 대표적인 용도는 새로운 테이블을 만드는 CREATE TABLE 구문입니다. 테이블을 생성할 때는 단순히 데이터를 담을 공간을 만드는 것을 넘어, 해당 테이블의 각 열(Column)에 어떤 이름과 데이터 타입(Data Type)을 부여할지, 그리고 어떤 제약조건(Constraint)을 설정할지를 상세하게 정의해야 합니다.

    예를 들어, 학생 정보를 저장하기 위한 STUDENTS 테이블을 생성하는 SQL 구문은 다음과 같습니다.

    CREATE TABLE STUDENTS ( student_id INT PRIMARY KEY, student_name VARCHAR(100) NOT NULL, major VARCHAR(50), entry_date DATE DEFAULT CURRENT_DATE, email VARCHAR(100) UNIQUE );

    위 구문은 다섯 개의 열을 가진 테이블을 생성합니다. student_id는 정수(INT) 타입이며, 각 학생을 고유하게 식별하는 기본 키(PRIMARY KEY)로 설정되었습니다. student_name은 100자까지의 문자열(VARCHAR)이며, 반드시 값이 입력되어야 하는 NOT NULL 제약조건이 있습니다. email 열에는 중복된 값이 들어올 수 없도록 UNIQUE 제약조건이 설정되었습니다. 이처럼 CREATE 문을 통해 우리는 데이터가 저장될 구조뿐만 아니라, 데이터가 지켜야 할 규칙까지 명시하여 데이터의 무결성을 보장할 수 있습니다.

    ALTER: 변화에 대응하는 유연함

    ALTER 명령어는 이미 존재하는 데이터베이스 객체의 구조를 수정할 때 사용됩니다. 소프트웨어는 계속해서 변화하고 발전하기 때문에, 초기에 완벽하게 설계했다고 생각했던 테이블 구조도 시간이 지나면서 변경해야 할 필요가 생깁니다. 예를 들어, 학생 정보에 연락처를 추가해야 하거나, 전공명의 최대 길이를 늘려야 하는 경우가 발생할 수 있습니다. 이때 ALTER TABLE 구문을 사용하여 유연하게 대응할 수 있습니다.

    • 열 추가 (ADD): ALTER TABLE STUDENTS ADD phone_number VARCHAR(20);
    • 열 수정 (MODIFY): ALTER TABLE STUDENTS MODIFY major VARCHAR(100); (데이터 타입이나 크기 변경)
    • 열 삭제 (DROP COLUMN): ALTER TABLE STUDENTS DROP COLUMN entry_date;
    • 열 이름 변경 (RENAME COLUMN): ALTER TABLE STUDENTS RENAME COLUMN student_name TO s_name;

    ALTER 명령어는 시스템을 중단하지 않고 데이터베이스 스키마를 변경할 수 있게 해주므로, 서비스의 연속성을 유지하며 시스템을 발전시켜 나가는 데 필수적인 역할을 합니다. 하지만 이미 대용량의 데이터가 저장된 테이블의 구조를 변경하는 작업은 시스템에 큰 부하를 줄 수 있으므로, 서비스 이용자가 적은 시간에 신중하게 진행해야 합니다.

    DROP: 구조물을 영구히 해체하다

    DROP 명령어는 데이터베이스 객체를 완전히 삭제할 때 사용합니다. DROP TABLE STUDENTS; 와 같이 명령을 실행하면 STUDENTS 테이블의 구조뿐만 아니라 그 안에 저장된 모든 데이터가 영구적으로 삭제됩니다. 이 명령어는 매우 강력하고 위험하므로 사용에 각별한 주의가 필요합니다. 실수로 중요한 테이블을 DROP하는 사고는 데이터베이스 재앙으로 이어질 수 있으며, 복구는 사전에 받아둔 백업 파일에 의존하는 수밖에 없습니다.

    또한, 테이블 간의 관계(참조 무결성)도 고려해야 합니다. 만약 다른 테이블이 STUDENTS 테이블의 student_id를 외래 키(FOREIGN KEY)로 참조하고 있다면, 기본적으로 해당 테이블은 삭제되지 않습니다. 의존 관계에 있는 다른 객체들까지 함께 삭제하고 싶을 때는 DROP TABLE STUDENTS CASCADE; 와 같이 CASCADE 옵션을 사용할 수 있지만, 이는 의도치 않은 대규모 객체 삭제로 이어질 수 있어 그 영향을 명확히 알고 사용해야 합니다.

    특별한 DDL 명령어, TRUNCATE

    테이블의 구조는 그대로 둔 채 내부의 모든 데이터 행(Row)만 삭제하고 싶을 때 사용하는 명령어로 TRUNCATE가 있습니다. 이는 데이터를 다룬다는 점에서 DML(데이터 조작어)인 DELETE와 혼동하기 쉽지만, 내부 동작 방식과 특징이 완전히 달라 DDL로 분류됩니다.

    TRUNCATE TABLE STUDENTS;

    TRUNCATE와 DELETE FROM STUDENTS;는 결과적으로 테이블의 모든 데이터를 삭제한다는 점에서 동일해 보이지만, 다음과 같은 결정적인 차이가 있습니다.

    • 실행 속도: TRUNCATE는 테이블을 삭제하고 새로 만드는 것과 유사한 방식으로 동작하여, 각 행을 개별적으로 기록하는 DELETE보다 훨씬 빠릅니다. 대용량 테이블을 비울 때 그 차이는 극명하게 드러납니다.
    • 롤백 (ROLLBACK) 가능 여부: DELETE는 DML이므로 트랜잭션 로그를 기록하여 ROLLBACK 명령어로 작업을 취소할 수 있습니다. 하지만 TRUNCATE는 DDL이므로 실행 즉시 자동 커밋(Auto-Commit)되어 작업을 되돌릴 수 없습니다.
    • 시스템 부하: DELETE는 삭제되는 모든 행에 대해 로그를 남기므로 시스템에 상대적으로 큰 부하를 주지만, TRUNCATE는 최소한의 로깅만 수행하여 시스템 부하가 적습니다.

    따라서 테이블의 구조는 유지하되 모든 데이터를 빠르고 효율적으로 비워야 할 때는 TRUNCATE를, 특정 조건에 맞는 행만 선별적으로 삭제하거나 삭제 작업을 되돌릴 가능성을 열어두고 싶을 때는 DELETE를 사용해야 합니다.

    SQL 언어의 역할 구분: DDL, DML, DCL

    SQL은 그 기능과 목적에 따라 크게 DDL, DML, DCL로 나뉩니다. 이들의 역할을 명확히 구분하여 이해하는 것은 데이터베이스를 체계적으로 관리하는 데 매우 중요합니다.

    구분DDL (Data Definition Language)DML (Data Manipulation Language)DCL (Data Control Language)
    목적데이터베이스 객체의 구조(스키마) 정의 및 관리데이터의 검색, 삽입, 수정, 삭제데이터 접근 권한 및 트랜잭션 제어
    대표 명령어CREATE, ALTER, DROP, TRUNCATESELECT, INSERT, UPDATE, DELETEGRANT, REVOKE, COMMIT, ROLLBACK
    실행 방식실행 즉시 자동 커밋 (Auto-Commit)수동 커밋 필요 (COMMIT/ROLLBACK으로 제어)수동 커밋 필요 (트랜잭션 제어)
    비유건물의 설계 및 건축, 리모델링, 철거건물에 가구를 들이고, 배치하고, 빼는 행위건물 출입 권한 부여, 작업 내용 확정 및 취소

    이처럼 DDL은 데이터베이스의 뼈대를 만드는 역할을, DML은 그 뼈대 안에서 실제 데이터를 다루는 역할을, DCL은 보안과 무결성을 위한 통제 역할을 담당하며 서로의 영역을 명확히 구분하고 있습니다.

    결론: 신중하고 명확하게 데이터의 집을 짓다

    데이터 정의어(DDL)는 데이터베이스라는 거대한 정보 시스템의 가장 기초적인 구조를 설계하고 관리하는 강력한 언어입니다. 잘 정의된 DDL을 통해 만들어진 견고한 스키마는 데이터의 일관성과 무결성을 보장하는 첫걸음이며, 향후 애플리케이션의 확장성과 유지보수성을 결정하는 핵심적인 요소가 됩니다. CREATE, ALTER, DROP이라는 간단해 보이는 세 가지 명령어를 통해 우리는 복잡한 데이터의 세계에 질서를 부여하고, 변화하는 요구사항에 유연하게 대응할 수 있는 힘을 갖게 됩니다.

    하지만 DDL 명령어는 실행 즉시 영구적인 변경을 초래하며 쉽게 되돌릴 수 없다는 점을 항상 명심해야 합니다. 따라서 DDL 작업을 수행하기 전에는 변경 사항이 시스템 전체에 미칠 영향을 면밀히 검토하고, 만일의 사태에 대비하여 반드시 데이터를 백업하는 신중한 자세가 필요합니다. 결국, DDL을 정확하고 책임감 있게 사용하는 능력이야말로 데이터를 안전하게 보관하고 가치 있게 활용할 수 있는 훌륭한 데이터의 집을 짓는 건축가의 기본 소양일 것입니다.