풀스택 백엔드 2026.06.23

syyu21b·2026년 6월 23일

풀스택 - 백엔드

목록 보기
35/49
post-thumbnail

[SECTION03. DDL 심화와 제약조건]

  • DDL(Data Definition Language) = 테이블이나 데이터베이스의 구조 자체를 정의하는 명령어. CREATE TABLE도 DDL에 속함

ALTER TABLE — 컬럼 추가

ALTER TABLE member ADD COLUMN phone VARCHAR(20);

기본값을 지정하면서 추가할 수도 있습니다.

ALTER TABLE member ADD COLUMN is_active BOOLEAN DEFAULT TRUE;

컬럼을 추가하면 기존에 저장되어 있던 행들은 새 컬럼 값이 NULL(또는 DEFAULT 값)로 채워집니다.


ALTER TABLE — 컬럼 삭제 / 수정

-- 컬럼 삭제
ALTER TABLE member DROP COLUMN phone;

-- 컬럼 타입 변경 (H2 기준)
ALTER TABLE member ALTER COLUMN name VARCHAR(100);

-- 컬럼 이름 변경 (H2 기준)
ALTER TABLE member RENAME COLUMN phone TO mobile;

컬럼을 삭제하면 그 컬럼에 저장되어 있던 데이터도 함께 사라집니다. 운영 중인 서비스에서는 컬럼 삭제 전에 반드시 백업하거나 신중하게 검토해야 합니다.


DROP TABLE vs TRUNCATE TABLE

명령어데이터구조되돌리기
DROP TABLE삭제됨테이블 자체가 사라짐다시 CREATE TABLE 필요
TRUNCATE TABLE삭제됨테이블 구조는 유지구조는 남아있어 바로 INSERT 가능
DELETE FROM (조건 없이)삭제됨구조 유지TRUNCATE와 비슷하지만 속도가 더 느림
CREATE TABLE comment (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    content VARCHAR(500) NOT NULL,
    board_id BIGINT NOT NULL,
    member_id BIGINT NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (board_id) REFERENCES board(id),
    FOREIGN KEY (member_id) REFERENCES member(id)
);
-- 테이블 자체를 삭제
DROP TABLE comment;

-- 테이블은 남기고 데이터만 전체 삭제
TRUNCATE TABLE comment;

FK로 참조되고 있는 테이블은 참조하는 테이블을 먼저 DROP/TRUNCATE 해야 에러가 나지 않습니다. (예: comment가 board를 참조한다면 comment를 먼저 처리)


제약조건 (Constraint) 심화

CHECK — 값의 범위를 제한

CREATE TABLE member (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    age INT CHECK (age >= 0 AND age <= 150)
);

age 컬럼에는 0~150 사이의 값만 들어갈 수 있습니다. 범위를 벗어나면 INSERT/UPDATE 시 에러가 발생합니다.

DEFAULT — 값을 넣지 않았을 때 자동으로 채워지는 기본값

CREATE TABLE board (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(200) NOT NULL,
    view_count INT DEFAULT 0,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

게시글을 등록할 때 view_count를 따로 지정하지 않으면 자동으로 0이 들어갑니다.

복합키 (Composite Key) — 2개 이상의 컬럼으로 PK 구성

게시글 “좋아요” 기능을 예로 들면, “한 회원이 한 게시글에 좋아요를 한 번만 누를 수 있다”는 규칙이 필요합니다.

CREATE TABLE member (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    email VARCHAR(100) NOT NULL UNIQUE,
    password VARCHAR(100) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE board (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(200) NOT NULL,
    content TEXT NOT NULL,
    member_id BIGINT NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (member_id) REFERENCES member(id)
);
CREATE TABLE board_like (
    board_id BIGINT NOT NULL,
    member_id BIGINT NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (board_id, member_id),
    FOREIGN KEY (board_id) REFERENCES board(id),
    FOREIGN KEY (member_id) REFERENCES member(id)
);

board_idmember_id를 합쳐서 PK로 지정하면, 같은 (board_id, member_id) 조합은 두 번 들어갈 수 없습니다. 즉 같은 회원이 같은 게시글에 좋아요를 두 번 누르는 것을 DB 차원에서 막을 수 있습니다.

0개의 댓글