본문으로 건너뛰기
데이터베이스 기초집LESSON 08

데이터 타입 선택과 NULL 설계

난이도초급 → 중급
예상 시간35분
선수지식이전 강의

8강. 데이터 타입 선택과 NULL 설계

1. 이번 강의에서 해결할 문제

모든 값을 text로 저장하거나 0과 빈 문자열로 누락을 표현하면 비교·정렬·검증이 불안정해집니다. 값의 의미, 범위, 시간대, 정밀도와 “아직 없음”의 의미를 스키마에 반영합니다.

2. 학습 목표

3. 핵심 개념

타입은 저장 형식뿐 아니라 가능한 연산과 검증을 정합니다. 식별자는 bigint, 정확한 정수 점수는 integer, 소수 정밀도가 중요한 값은 numeric, 전 세계 시각은 timestamptz가 기본 후보입니다. NULL은 0이나 빈 문자열이 아니라 알 수 없거나 아직 해당되지 않음을 뜻합니다. 의미가 다른 누락 상태가 필요하면 상태 열로 명시합니다.

4. 단계별 예시

파일 경로: C:\dev\game-ranking-service\database\sql\08-types.sql

database/sql/08-types.sql
CREATE TABLE ranking.seasons (
season_id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
code varchar(20) NOT NULL UNIQUE,
starts_at timestamptz NOT NULL,
ends_at timestamptz,
is_ranked boolean NOT NULL DEFAULT true,
rules jsonb NOT NULL DEFAULT '{}'::jsonb,
CONSTRAINT ck_season_period CHECK (ends_at IS NULL OR ends_at > starts_at)
);

ALTER TABLE ranking.games
ADD COLUMN IF NOT EXISTS season_id bigint REFERENCES ranking.seasons(season_id),
ADD COLUMN IF NOT EXISTS server_region varchar(12) NOT NULL DEFAULT 'ap-northeast';
PowerShell · 적용과 타입 확인
psql -d game_ranking_dev -v ON_ERROR_STOP=1 -f .\database\sql\08-types.sql
psql -d game_ranking_dev -c "\d+ ranking.seasons"

5. 동작 원리

timestamptz는 입력 시각을 절대 시점으로 저장하고 세션 시간대에 맞춰 표시합니다. 종료 전 시즌의 ends_at은 NULL이 자연스럽지만 is_ranked는 참·거짓이 반드시 있으므로 NOT NULL 기본값을 둡니다. jsonb는 규칙의 유연한 부가 설정에만 사용하고 관계와 검색의 핵심 값은 정규 열로 둡니다.

6. 자주 하는 실수와 해결법

7. 직접 실습

8. 이해 점검 질문 3개

9. 핵심 요약

MINI QUIZ

데이터 타입 선택과 NULL 설계 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1“데이터 타입 선택과 NULL 설계” 작업 전 검토에서 채택해야 할 안전 기준은 무엇인가요?
  2. 문제 2“데이터 타입 선택과 NULL 설계” 실습 중 ‘시간을 로컬 문자열로 저장’ 상황을 발견했습니다. 본문과 일치하는 설명은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

8강. 데이터 타입 선택과 NULL 설계 미완료 상태