본문으로 건너뛰기
데이터베이스 기초집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 설계 미완료 상태