아마 이미 여러 번 배열이라는 말을 들어봤을 거야. 여러 프로그래밍 언어에서 거의 비슷한 의미로 쓰이지만, 약간씩 차이가 있어.
PostgreSQL에서 배열은 같은 타입의 값 여러 개를 한 테이블 컬럼에 저장할 수 있는 데이터 타입이야. 한 줄에 하나만 넣는 게 아니라, 마치 "박스"에 여러 데이터를 한 번에 넣는 느낌이지. 숫자 리스트, 문자열, 날짜, 심지어 더 복잡한 객체도 넣을 수 있어.
비유하자면, 배열은 공구함 같은 거야. 각 키를 손에 하나씩 들고 다니는 대신(각 키가 컬럼/행 하나씩), 편하게 가방에 다 넣는 거지(한 컬럼에 배열로).
배열 만드는 두 가지 방법
PostgreSQL에서는 배열을 만드는 대표적인 두 가지 문법이 있어. 마치 짐 싸는 두 가지 방법처럼 — 결과는 똑같지만 스타일이 달라:
- 중괄호
{}문법
더 간단하고 자주 쓰는 방법이야:
-- 문자열 배열
'{"사과", "바나나", "체리"}'
-- 숫자 배열
'{1, 2, 3, 4, 5}'
-- 날짜 배열
'{"2023-01-01", "2023-01-02", "2023-01-03"}'
- 생성자
ARRAY[]문법
좀 더 명확하고 읽기 쉬운 방법이야:
-- 문자열 배열
ARRAY['사과', '바나나', '체리']
-- 숫자 배열
ARRAY[1, 2, 3, 4, 5]
-- 날짜 배열
ARRAY['2023-01-01'::DATE, '2023-01-02'::DATE, '2023-01-03'::DATE]
두 문법 다 똑같이 동작해! 어떤 걸 쓸지는 네 취향이나 상황에 따라 골라. 다른 언어에서 for랑 while 중에 뭐 쓸지 고르는 거랑 비슷해 — 기능은 똑같은데, 상황에 따라 더 편한 게 있을 뿐이야.
언제 배열을 써야 할까?
배열은 PostgreSQL의 슈퍼파워 중 하나야. 추가 테이블이나 컬럼 만드는 게 귀찮거나 불편할 때 딱이야. 이런 상황에 좋아:
- 리스트, 태그, 카테고리 저장
예를 들어, 인터넷 쇼핑몰 데이터베이스를 만든다고 해보자. 각 상품마다 여러 개의 태그가 있을 수 있어:
- 티셔츠라면 태그가
["의류", "남성", "스포츠"]일 수 있고, - 이어폰이라면 태그가
["전자제품", "무선", "가젯"]일 수 있지.
배열을 쓰면 이런 태그들을 한 컬럼에 다 넣을 수 있어서, 태그용 테이블을 따로 만들 필요도 없고 데이터 구조도 단순해져.
-- 태그 배열이 있는 상품 테이블
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
tags TEXT[] -- 태그용 문자열 배열
);
-- 데이터 예시
INSERT INTO products (name, tags)
VALUES
('티셔츠', ARRAY['의류', '남성', '스포츠']),
('이어폰', ARRAY['전자제품', '무선', '가젯']);
- 주문 목록 저장
주문 데이터를 다룰 때, 한 주문에 들어간 상품 리스트를 배열로 저장할 수 있어:
-- 상품 ID 배열이 있는 주문 테이블
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
customer_name TEXT,
product_ids INTEGER[] -- 상품 ID 배열
);
-- 데이터 예시
INSERT INTO orders (customer_name, product_ids)
VALUES
('안나', ARRAY[1, 2, 3]),
('오토', ARRAY[4, 5]);
이제 각 주문마다 어떤 상품이 들어갔는지 한 번에 볼 수 있어. 편하지?
간단한 설정이나 환경 저장
사용자 설정이나 선호하는 옵션 같은 간단한 리스트를 저장할 때도 좋아:
CREATE TABLE user_preferences ( user_id INTEGER PRIMARY KEY, notification_types TEXT[], allowed_days INTEGER[] -- 요일: 1-7 );
배열과 다른 데이터 타입 비교
중요한 건, 배열은 PostgreSQL의 여러 도구 중 하나일 뿐이고, 모든 상황에 맞는 건 아니라는 거야. 예를 들어, 배열 대신 관계 테이블(다대다 관계)이나 JSON/JSONB 타입을 쓸 수도 있어.
배열 vs JSONB
배열은 같은 타입의 값 여러 개만 저장할 때 딱이야. 더 단순하고, 빠르고, 공간도 적게 차지해.
JSONB는 구조가 복잡하거나, 유동적인 객체를 저장할 때 좋아. 대신 처리하기가 좀 더 복잡할 수 있어.
같은 데이터를 배열과 JSONB로 저장하는 예시:
-- 배열
ARRAY['의류', '남성', '스포츠']
-- JSONB
'["의류", "남성", "스포츠"]'::JSONB
정렬, 필터, 인덱싱 같은 작업을 자주 한다면 배열이 더 좋아.
실전에서 배열 쓰는 예시
예를 들어, 대학교 출석 관리 앱을 만든다고 해보자. 각 강의마다 출석한 학생 리스트가 있는데, 학생-강의 연결 테이블을 따로 만들 필요 없이 배열로 처리할 수 있어:
-- 학생 배열이 있는 강의 테이블
CREATE TABLE lectures (
id SERIAL PRIMARY KEY,
topic TEXT NOT NULL,
students INTEGER[] -- 학생 ID 배열
);
-- 데이터 예시
INSERT INTO lectures (topic, students)
VALUES
('데이터베이스', ARRAY[101, 102, 103]),
('알고리즘', ARRAY[104, 105]);
이제 어떤 강의든 학생 리스트를 쉽게 조회하거나, 배열에서 학생을 추가/삭제할 수 있어.
PostgreSQL에서 배열 쓸 때 주의할 점
- 배열 안의 데이터 타입은 모두 같아야 해. PostgreSQL에서는 예를 들어 문자열이랑 숫자를 한 배열에 섞어서 못 넣어.
-- OK
ARRAY[1, 2, 3] -- 숫자 배열
-- 에러: 문자열과 숫자 섞임
ARRAY['사과', 42, '체리']
- 배열 인덱스는 1부터 시작해. Python, JavaScript, C++처럼 0부터 시작하는 언어에 익숙하다면 헷갈릴 수 있으니 주의!
- NULL 지원: 배열 안에 NULL 값도 넣을 수 있어
- 다차원 배열: PostgreSQL은 다차원 배열도 지원해
GO TO FULL VERSION