데이타베이스/PostgreSQL

PostgreSQL, JSON 및 배열로 데이터베이스의 잠재력을 최대한 활용하세요!

shimdh 2025. 10. 29. 10:38
728x90

PostgreSQL은 단순한 관계형 데이터베이스를 넘어선 강력한 도구입니다. 특히 JSON과 배열 같은 고급 데이터 유형을 통해 비정형 및 반정형 데이터를 효율적으로 저장하고 관리할 수 있어, 현대적인 애플리케이션 개발에서 필수적입니다. 오늘날 데이터는 고정된 스키마에 맞춰지지 않고, 동적으로 변화하는 경우가 많죠. 이 블로그 포스트에서는 PostgreSQL의 JSON과 배열 기능을 깊이 파헤쳐보고, 실생활 예시를 통해 어떻게 더 유연하고 성능 지향적인 데이터베이스를 구축할 수 있는지 탐구해 보겠습니다. 초보자부터 전문가까지 유용한 팁을 얻어 가세요!

728x90

1. PostgreSQL에서 JSON의 세계 이해하기

JSON(JavaScript Object Notation)은 웹과 API에서 널리 사용되는 경량 데이터 형식으로, 인간이 읽기 쉽고 기계가 처리하기 좋습니다. PostgreSQL은 JSON 데이터를 네이티브로 지원하여, NoSQL 같은 유연성을 관계형 데이터베이스에서 누릴 수 있게 해줍니다. 핵심은 두 가지 데이터 유형: jsonjsonb입니다.

1.1. json vs. jsonb: 무엇을 선택해야 할까요?

PostgreSQL에서 JSON을 다룰 때, 저장 형식에 따라 성능과 용도가 달라집니다. 아래 표로 간단히 비교해 보죠:

특징 json jsonb
저장 방식 텍스트 그대로 복사 (원본 보존) 바이너리 형식 (압축 및 최적화)
장점 원본 형식 (공백, 키 순서) 유지 빠른 쿼리, 인덱싱, 효율적 저장
단점 쿼리 속도 느림, 인덱싱 제한 원본 형식 보존 안 함
적합한 경우 로그나 원본 유지 필요 시 자주 쿼리/조작하는 데이터
  • json: 입력된 텍스트를 그대로 저장해 원본의 모든 세부 사항(예: 공백, 키 순서)을 유지합니다. 데이터 무결성을 최우선으로 할 때 유용하죠.
  • jsonb: 바이너리 형식으로 저장되어 쿼리 속도가 2~10배 빠르고, 저장 공간도 절약됩니다. 대부분의 경우 jsonb를 추천합니다!

1.2. JSON/JSONB 사용의 이점

JSON/JSONB를 도입하면 데이터베이스 설계가 한층 업그레이드됩니다:

  • 유연한 스키마 설계: 고정된 컬럼 없이 동적 데이터를 저장할 수 있어, API 응답이나 사용자 생성 콘텐츠처럼 구조가 자주 변하는 데이터에 딱 맞습니다.
  • 풍부한 쿼리 기능: ->, ->>, @> 등의 연산자로 JSON 내부 키를 쉽게 추출/필터링합니다. 예: profile->>'email'로 이메일 값만 문자열로 가져오기.
  • 성능 향상: GIN 인덱스를 통해 JSON 키나 값에 대한 빠른 검색이 가능합니다. 대규모 데이터셋에서도 지연 없이 쿼리하세요.

1.3. 실용적인 예시: 사용자 프로필 관리

사용자 프로필처럼 속성이 다양하고 변경될 수 있는 데이터를 다룰 때 JSONB가 빛을 발합니다. 아래는 간단한 테이블 생성과 데이터 삽입 예시입니다.

-- 테이블 생성
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100),
    profile jsonb
);

-- 데이터 삽입
INSERT INTO users (name, profile) VALUES
('Alice', '{"email": "alice@example.com", "preferences": {"newsletter": true}}'),
('Bob', '{"email": "bob@example.com", "preferences": {"newsletter": false}}');

뉴스레터를 구독하는 사용자를 쿼리해 보죠. JSON 내부의 중첩 객체를 쉽게 탐색합니다:

-- 뉴스레터 구독자 조회
SELECT name, profile->>'email' AS email 
FROM users 
WHERE (profile->'preferences'->>'newsletter')::boolean = true;

이 쿼리는 Alice의 이메일을 반환하며, 필요 시 GIN 인덱스(CREATE INDEX ON users USING GIN (profile);)로 더 빠르게 만들 수 있습니다.

2. PostgreSQL에서 배열(Arrays) 작업하기

배열은 단일 컬럼에 여러 값을 저장하는 PostgreSQL의 또 다른 강력한 기능입니다. 관계형 DB의 정규화 원칙을 따르지 않고도 효율적으로 컬렉션을 관리할 수 있어, 태그나 목록 같은 데이터에 이상적입니다.

2.1. 배열 사용의 이점

  • 쿼리 단순화: 조인 테이블 없이 ANYCONTAINS 연산자로 배열 내 값을 검색합니다. 쿼리가 직관적이고 빠릅니다.
  • 스키마 단순화: 관련 항목을 별도 테이블로 분리하지 않아도 되므로, DB 구조가 간결해지고 유지보수가 쉬워집니다.
  • 추가 팁: 배열 크기가 동적이기 때문에, 확장성도 뛰어나며 array_agg()unnest() 함수로 집계/분해가 가능합니다.

2.2. 실용적인 예시: 제품 태그 관리

이커머스 시스템에서 제품에 여러 태그를 붙여 검색성을 높인다고 가정해 보세요.

-- 테이블 생성
CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100),
    tags TEXT[]
);

-- 데이터 삽입
INSERT INTO products (name, tags) VALUES
('Laptop', ARRAY['electronics', 'computers']),
('Shoes', ARRAY['footwear', 'fashion']);

'electronics' 태그가 붙은 제품을 찾는 쿼리:

-- electronics 태그 제품 조회
SELECT name, tags 
FROM products 
WHERE 'electronics' = ANY(tags);

이 결과로 Laptop이 반환되며, 배열이 커져도 CREATE INDEX ON products USING GIN (tags); 인덱스로 성능을 유지할 수 있습니다.

3. JSON/JSONB와 배열 결합하기: 시너지 효과

PostgreSQL의 매력은 JSON과 배열을 섞어 쓰는 데 있습니다. 복잡한 데이터(예: 제품 사양 + 카테고리)를 하나의 행에 효율적으로 담아, 쿼리와 저장을 최적화할 수 있죠. 이는 NoSQL의 유연성과 RDBMS의 신뢰성을 결합한 결과입니다.

3.1. 결합된 구조의 예시

스마트폰처럼 사양(JSONB)과 카테고리(배열)를 함께 저장해 보세요.

-- 테이블 생성
CREATE TABLE enhanced_products (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100),
    specs jsonb,
    categories TEXT[]
);

-- 데이터 삽입
INSERT INTO enhanced_products (name, specs, categories) VALUES
('Smartphone', '{"battery": "4000mAh", "camera": "12MP"}', ARRAY['electronics', 'mobiles']);

배터리 용량이 4000mAh 이상이고 'mobiles' 카테고리에 속한 제품을 쿼리:

-- 배터리 4000mAh 이상, mobiles 카테고리 제품 조회
SELECT name, specs->>'battery' AS battery, categories
FROM enhanced_products 
WHERE (specs->>'battery')::text >= '4000mAh' 
  AND 'mobiles' = ANY(categories);

이 쿼리는 JSON 추출과 배열 검색을 동시에 처리하며, 인덱싱으로 대용량 데이터에서도 빠릅니다. 실제 프로젝트에서 이 패턴을 적용하면 API 응답 속도가 크게 향상될 거예요!

결론

PostgreSQL의 JSON과 배열 기능은 관계형 DB의 한계를 넘어 NoSQL급 유연성을 제공합니다. 고정 스키마에 얽매이지 않고 복잡한 데이터를 효율적으로 관리할 수 있어, 웹 앱, 빅데이터 분석, IoT 시스템 등 다양한 분야에서 빛을 발합니다. 오늘 배운 예시를 직접 테스트해 보세요 – psql이나 pgAdmin에서 바로 실행 가능합니다! 더 궁금한 점이 있으시면 댓글로 공유해 주세요. PostgreSQL로 더 강력한 애플리케이션을 만들어 보아요!

728x90