CodeGym /행동 /SQL SELF /배열 소개: 이게 뭐고 언제 써야 할까?

배열 소개: 이게 뭐고 언제 써야 할까?

SQL SELF
레벨 35, 레슨 0
사용 가능

아마 이미 여러 번 배열이라는 말을 들어봤을 거야. 여러 프로그래밍 언어에서 거의 비슷한 의미로 쓰이지만, 약간씩 차이가 있어.

PostgreSQL에서 배열은 같은 타입의 값 여러 개를 한 테이블 컬럼에 저장할 수 있는 데이터 타입이야. 한 줄에 하나만 넣는 게 아니라, 마치 "박스"에 여러 데이터를 한 번에 넣는 느낌이지. 숫자 리스트, 문자열, 날짜, 심지어 더 복잡한 객체도 넣을 수 있어.

비유하자면, 배열은 공구함 같은 거야. 각 키를 손에 하나씩 들고 다니는 대신(각 키가 컬럼/행 하나씩), 편하게 가방에 다 넣는 거지(한 컬럼에 배열로).

배열 만드는 두 가지 방법

PostgreSQL에서는 배열을 만드는 대표적인 두 가지 문법이 있어. 마치 짐 싸는 두 가지 방법처럼 — 결과는 똑같지만 스타일이 달라:

  1. 중괄호 {} 문법

더 간단하고 자주 쓰는 방법이야:

-- 문자열 배열
'{"사과", "바나나", "체리"}'

-- 숫자 배열
'{1, 2, 3, 4, 5}'

-- 날짜 배열
'{"2023-01-01", "2023-01-02", "2023-01-03"}'
  1. 생성자 ARRAY[] 문법

좀 더 명확하고 읽기 쉬운 방법이야:

-- 문자열 배열
ARRAY['사과', '바나나', '체리']

-- 숫자 배열
ARRAY[1, 2, 3, 4, 5]

-- 날짜 배열
ARRAY['2023-01-01'::DATE, '2023-01-02'::DATE, '2023-01-03'::DATE]
중요:

두 문법 다 똑같이 동작해! 어떤 걸 쓸지는 네 취향이나 상황에 따라 골라. 다른 언어에서 for랑 while 중에 뭐 쓸지 고르는 거랑 비슷해 — 기능은 똑같은데, 상황에 따라 더 편한 게 있을 뿐이야.

언제 배열을 써야 할까?

배열은 PostgreSQL의 슈퍼파워 중 하나야. 추가 테이블이나 컬럼 만드는 게 귀찮거나 불편할 때 딱이야. 이런 상황에 좋아:

  1. 리스트, 태그, 카테고리 저장

예를 들어, 인터넷 쇼핑몰 데이터베이스를 만든다고 해보자. 각 상품마다 여러 개의 태그가 있을 수 있어:

  • 티셔츠라면 태그가 ["의류", "남성", "스포츠"]일 수 있고,
  • 이어폰이라면 태그가 ["전자제품", "무선", "가젯"]일 수 있지.

배열을 쓰면 이런 태그들을 한 컬럼에 다 넣을 수 있어서, 태그용 테이블을 따로 만들 필요도 없고 데이터 구조도 단순해져.

-- 태그 배열이 있는 상품 테이블
CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    tags TEXT[]  -- 태그용 문자열 배열
);

-- 데이터 예시
INSERT INTO products (name, tags)
VALUES
    ('티셔츠', ARRAY['의류', '남성', '스포츠']),
    ('이어폰', ARRAY['전자제품', '무선', '가젯']);
  1. 주문 목록 저장

주문 데이터를 다룰 때, 한 주문에 들어간 상품 리스트를 배열로 저장할 수 있어:

-- 상품 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]);

이제 각 주문마다 어떤 상품이 들어갔는지 한 번에 볼 수 있어. 편하지?

  1. 간단한 설정이나 환경 저장

    사용자 설정이나 선호하는 옵션 같은 간단한 리스트를 저장할 때도 좋아:

    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에서 배열 쓸 때 주의할 점

  1. 배열 안의 데이터 타입은 모두 같아야 해. PostgreSQL에서는 예를 들어 문자열이랑 숫자를 한 배열에 섞어서 못 넣어.
-- OK
ARRAY[1, 2, 3]  -- 숫자 배열

-- 에러: 문자열과 숫자 섞임
ARRAY['사과', 42, '체리']
  1. 배열 인덱스는 1부터 시작해. Python, JavaScript, C++처럼 0부터 시작하는 언어에 익숙하다면 헷갈릴 수 있으니 주의!
  2. NULL 지원: 배열 안에 NULL 값도 넣을 수 있어
  3. 다차원 배열: PostgreSQL은 다차원 배열도 지원해
2
과제
SQL SELF, 레벨 35, 레슨 0
잠금
배열이 있는 테이블 만들기
배열이 있는 테이블 만들기
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION