데이터베이스

PostgreSQL 데이터 타입 정리

Jinwookoh 2025. 3. 13. 23:42

PostgreSQL의 기본 데이터 타입은 크게 숫자, 문자, 날짜/시간, 논리형, 배열, JSON, 범위 타입 등으로 나눌 수 있습니다. 


1. 숫자 타입 (Numeric Types)

정수형 (Integer Types)

타입 크기 범위
smallint 2바이트 -32,768 ~ 32,767
integer 또는 int 4바이트 -2,147,483,648 ~ 2,147,483,647
bigint 8바이트 -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807

실수형 (Floating-Point Types)

타입 크기 설명
real 또는 float4 4바이트 단정도 부동소수점 (소수점 이하 약 6자리)
double precision 또는 float8 8바이트 배정도 부동소수점 (소수점 이하 약 15자리)

고정소수점 (Fixed-Precision Numbers)

타입 크기 설명
numeric(p, s) 가변적 정밀한 소수 계산 가능 (p: 전체 자리수, s: 소수점 이하 자리수)
decimal(p, s) 가변적 numeric과 동일

🔹 numeric과 decimal은 금융 계산처럼 정밀한 연산이 필요한 경우 사용됩니다.


2. 문자 타입 (Character Types)

타입 크기 설명
char(n) 고정 크기 n개의 고정된 길이 (부족하면 공백으로 채움)
varchar(n) 가변 크기 n 길이까지 저장 가능 (길이가 다르면 공간 절약)
text 가변 크기 길이 제한 없음

🔹 text 타입은 사실상 varchar(n)과 동일하지만, 길이 제한이 없어 더 자유롭게 사용할 수 있습니다.


3. 날짜 및 시간 타입 (Date/Time Types)

타입 크기 설명
date 4바이트 연-월-일 (YYYY-MM-DD)
time 8바이트 시-분-초 (HH:MI:SS)
timestamp 8바이트 날짜 + 시간 (YYYY-MM-DD HH:MI:SS)
timestamptz 8바이트 timestamp + 타임존 정보 포함
interval 16바이트 시간 간격 (예: 1 year 2 months)

🔹 timestamptz(timestamp with time zone)를 사용하면 자동으로 UTC 기준으로 변환하여 저장되므로, 다국적 서비스에서는 timestamptz를 권장합니다.


4. 논리형 (Boolean Type)

타입 크기 설명
boolean 1바이트 TRUE, FALSE, NULL

🔹 boolean 타입은 TRUE(1), FALSE(0) 값을 가지며, t, f, y, n, on, off 등의 값도 허용됩니다.


5. 배열 (Array Type)

PostgreSQL은 기본적으로 배열을 지원합니다.

CREATE TABLE users (
    id serial PRIMARY KEY,
    hobbies TEXT[]
);

🔹 배열 사용 예:

INSERT INTO users (hobbies) VALUES (ARRAY['reading', 'coding', 'traveling']);
SELECT * FROM users WHERE 'coding' = ANY(hobbies);

6. JSON 타입

타입 설명
json 원본 JSON 문자열을 저장
jsonb 바이너리 형식으로 저장 (색인 및 검색 최적화)

🔹 jsonb는 내부적으로 파싱하여 저장하므로 검색 속도가 더 빠릅니다.

CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    info JSONB
);

INSERT INTO products (info) VALUES ('{"name": "Laptop", "price": 1500}');
SELECT info->>'name' FROM products;  -- "Laptop"

7. UUID (Universally Unique Identifier)

타입 설명
uuid 전역적으로 유일한 식별자

🔹 uuid는 보안이 중요한 환경에서 사용되며, PostgreSQL에서 gen_random_uuid() 함수를 이용해 생성할 수 있습니다.

CREATE TABLE users (
    id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
    name TEXT
);

8. 범위 타입 (Range Types)

PostgreSQL은 연속적인 값의 범위를 다룰 수 있는 데이터 타입을 제공합니다.

타입 설명
int4range integer 범위
int8range bigint 범위
numrange numeric 범위
tsrange timestamp 범위
tstzrange timestamptz 범위
daterange date 범위

🔹 사용 예:

CREATE TABLE reservations (
    id SERIAL PRIMARY KEY,
    room_number INT,
    booking_period DATERANGE
);

INSERT INTO reservations (room_number, booking_period)
VALUES (101, '[2025-03-01, 2025-03-10)');

SELECT * FROM reservations WHERE booking_period @> '2025-03-05';

@> 연산자는 특정 날짜가 범위에 포함되는지 확인합니다.


9. 기타 데이터 타입

타입 설명
money 화폐 단위 (통화 설정이 필요함)
cidr, inet, macaddr 네트워크 주소 저장
bit(n), bit varying(n) 비트 문자열
xml XML 데이터 저장

📌 정리

PostgreSQL은 다양한 데이터 타입을 지원하며, 주로 다음을 사용합니다.

  • 정수형: smallint, integer, bigint
  • 실수형: real, double precision, numeric
  • 문자형: char(n), varchar(n), text
  • 날짜/시간: date, timestamp, timestamptz
  • 논리형: boolean
  • 배열: TEXT[], INT[]
  • JSON: json, jsonb
  • 범위 타입: daterange, numrange
  • UUID, XML, 네트워크 주소, 화폐 타입 등도 지원

PostgreSQL의 특성에 맞게 적절한 타입을 선택하여 데이터베이스 성능과 관리 효율성을 높일 수 있습니다! 🚀