테이블을 만들기 전에, 각 컬럼에 어떤 자료형을 쓸지 알아야 합니다.
| 타입 | 설명 | 예시 |
|---|---|---|
| INT | 정수 | 1, 25, 100 |
| BIGINT | 큰 정수 (자동증가 PK에 자주 사용) | 1, 1000000 |
| VARCHAR(n) | 길이가 가변적인 문자열, n은 최대 길이 | '홍길동', 'hong@test.com' |
| TEXT | 길이 제한이 거의 없는 긴 문자열 | 게시글 본문처럼 긴 글 |
| DATE | 날짜만 (연-월-일) | 2026-06-21 |
| TIMESTAMP | 날짜+시간 | 2026-06-21 14:30:00 |
| BOOLEAN | 참/거짓 | TRUE, FALSE |
이름(name)이나 이메일(email)처럼 짧은 문자열은 VARCHAR, 게시글 본문처럼 긴 글은 TEXT를 사용하는 것이 일반적입니다.
CREATE TABLE 테이블명 (
컬럼명1 데이터타입 제약조건,
컬럼명2 데이터타입 제약조건,
...
);
| 제약조건 | 의미 |
|---|---|
| PRIMARY KEY | 기본키 지정 |
| NOT NULL | 빈 값을 허용하지 않음 |
| UNIQUE | 중복된 값을 허용하지 않음 |
| AUTO_INCREMENT (H2에서는 보통 IDENTITY 사용) | 값이 자동으로 1씩 증가 |
| DEFAULT 값 | 값을 넣지 않으면 기본값 사용 |
| FOREIGN KEY | 다른 테이블의 PK를 참조 |
DDL(Data Definition Language)은 테이블이나 데이터베이스의 구조 자체를 정의하는 명령어입니다. SECTION02에서 배운 CREATE TABLE도 DDL에 속합니다.
| 명령어 | 역할 |
|---|---|
| CREATE | 테이블/스키마 생성 |
| ALTER | 테이블 구조 변경 (컬럼 추가/삭제/수정) |
| DROP | 테이블/스키마 삭제 |
| TRUNCATE | 테이블 구조는 유지하고 데이터만 전체 삭제 |
DML(INSERT, UPDATE, DELETE)은 데이터의 “내용”을 다루고, DDL은 데이터가 담기는 “그릇(구조)” 자체를 다룬다는 차이가 있습니다.
ALTER TABLE member ADD COLUMN phone VARCHAR(20);
기본값을 지정하면서 추가할 수도 있습니다.
ALTER TABLE member ADD COLUMN is_active BOOLEAN DEFAULT TRUE;
컬럼을 추가하면 기존에 저장되어 있던 행들은 새 컬럼 값이 NULL(또는 DEFAULT 값)로 채워집니다.
-- 컬럼 삭제
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 | 삭제됨 | 테이블 자체가 사라짐 | 다시 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를 먼저 처리)
SECTION02에서 PRIMARY KEY, NOT NULL, UNIQUE, FOREIGN KEY를 배웠습니다. 여기서는 두 가지를 더 추가합니다.
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 시 에러가 발생합니다.
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이 들어갑니다.
게시글 “좋아요” 기능을 예로 들면, “한 회원이 한 게시글에 좋아요를 한 번만 누를 수 있다”는 규칙이 필요합니다.
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_id와 member_id를 합쳐서 PK로 지정하면, 같은 (board_id, member_id) 조합은 두 번 들어갈 수 없습니다. 즉 같은 회원이 같은 게시글에 좋아요를 두 번 누르는 것을 DB 차원에서 막을 수 있습니다.
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,
age INT CHECK (age >= 0 AND age <= 150),
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
이 한 줄 한 줄이 곧 “데이터 정합성 규칙”입니다. 애플리케이션 코드(Java)에서 검증하기 전에, DB 자체가 1차 방어선 역할을 하게 됩니다.
청첩장 샘플: https://wedd-sbdkrhpze.pages.dev/w
구조를 기획하고 설계하여 단독 개발 프로젝트로 특별한 기능은 직접 디자인과 구성에 참여하여
제작할수 있다는 것이 키 포인트