데이타베이스/PostgreSQL

PostgreSQL 초보자를 위한 핵심 가이드: 테이블과 스키마 완벽 이해하기

shimdh 2025. 10. 29. 08:35
728x90

안녕하세요, 데이터베이스 초보자 여러분! 데이터베이스의 세계는 방대하지만, 그 시작점은 기본 개념을 튼튼히 다지는 데 있습니다. PostgreSQL은 강력하고 유연한 오픈소스 관계형 데이터베이스(RDBMS)로, 많은 개발자와 DBA(데이터베이스 관리자)들이 애용합니다. 이 글에서는 PostgreSQL의 핵심 요소인 테이블스키마를 중점적으로 다루겠습니다. 이 두 개념을 명확히 이해하면 데이터 저장, 관리, 쿼리가 훨씬 수월해집니다.

스프레드시트나 엑셀 파일을 다뤄본 적이 있나요? 테이블은 그와 비슷하지만, 더 강력한 구조와 제약 조건을 가진 데이터 저장소입니다. 스키마는 이를 논리적으로 그룹화하는 '폴더' 같은 역할을 하죠. 이 가이드를 통해 이론뿐만 아니라 실전 예시까지 따라 해보세요. PostgreSQL을 설치했다면(아직 안 하셨다면 공식 사이트에서 다운로드하세요), 바로 쿼리를 실행하며 배우는 걸 추천합니다!

728x90

테이블이란 무엇인가요? 데이터 저장의 기본 단위

PostgreSQL에서 테이블(Table) 은 데이터를 행(Row)과 열(Column)로 체계적으로 저장하는 기본 구조입니다. 이는 관계형 데이터베이스의 핵심으로, 각 테이블은 특정 주제나 엔터티(예: 직원, 제품)에 초점을 맞춥니다. 스프레드시트처럼 상상하면 쉽습니다 – 행은 개별 기록, 열은 속성입니다.

테이블의 주요 구성 요소

  • 행(Row): 하나의 완전한 레코드. 예를 들어, 직원 테이블이라면 한 명의 직원 정보를 담습니다.
  • 열(Column): 특정 속성을 정의하는 필드. 각 열에는 데이터 타입(예: 숫자, 문자열, 날짜)을 지정합니다.
  • 제약 조건(Constraints): 데이터 무결성을 위해 PRIMARY KEY(기본 키), FOREIGN KEY(외래 키), UNIQUE(고유) 등을 추가할 수 있습니다.

employees 테이블 예시

아래는 간단한 직원 테이블 예시입니다. 이 테이블은 직원의 ID, 이름, 부서를 저장합니다.

employee_id first_name last_name department
1 John Doe HR
2 Jane Smith IT

여기서:

  • : employee_id (고유 ID), first_name (이름), last_name (성), department (부서).
  • : 각 직원의 실제 데이터.

이 테이블을 사용하면 "IT 부서 직원 목록"처럼 특정 조건으로 데이터를 쉽게 필터링할 수 있습니다.

테이블 생성하기

PostgreSQL에서 테이블을 만드는 것은 CREATE TABLE 명령으로 간단합니다. 데이터 타입을 지정하고 제약 조건을 추가하세요. 아래 예시는 employees 테이블을 생성하는 코드입니다.

CREATE TABLE employees (
    employee_id SERIAL PRIMARY KEY,  -- 자동 증가하는 고유 ID
    first_name VARCHAR(50) NOT NULL, -- 최대 50자 문자열, 필수 입력
    last_name VARCHAR(50) NOT NULL,  -- 최대 50자 문자열, 필수 입력
    department VARCHAR(50)           -- 부서 이름, 선택 입력
);
  • SERIAL: 정수 타입으로, INSERT 시 자동으로 1씩 증가하는 값을 할당합니다.
  • VARCHAR(50): 가변 길이 문자열, 최대 50자.
  • PRIMARY KEY: 테이블의 각 행을 고유하게 식별하는 키.

이 명령을 실행하면 빈 테이블이 생성됩니다. 이후 INSERT INTO employees (first_name, last_name, department) VALUES ('John', 'Doe', 'HR');처럼 데이터를 추가하세요.

스키마란 무엇인가요? 데이터베이스 객체의 논리적 그룹화

스키마(Schema) 는 테이블, 뷰(View), 인덱스(Index), 함수(Function) 등의 데이터베이스 객체를 논리적으로 그룹화하는 '이름 공간(Namespace)'입니다. 컴퓨터의 폴더나 패키지처럼 생각하세요 – 관련 파일을 한 곳에 모아 관리하기 쉽게 합니다. PostgreSQL의 기본 스키마는 public이지만, 프로젝트가 커질수록 사용자 정의 스키마가 필수적입니다.

스키마의 주요 역할

  • 관련 엔터티 그룹화: 대규모 데이터베이스에서 부서별로 객체를 분리. 예:
    • hr 스키마: 직원(employees), 부서(departments) 테이블.
    • finance 스키마: 거래(transactions), 예산(budgets) 테이블.
  • 이름 충돌 방지: 동일한 이름의 테이블(예: employees)을 다른 스키마에 두고 충돌 없이 사용.
  • 접근 제어: 스키마 단위로 권한(예: GRANT SELECT ON SCHEMA hr TO user;)을 설정해 보안을 강화.

스키마 없이 모든 객체를 public에 넣으면 관리가 복잡해지니, 초반부터 습관화하세요!

스키마 생성하기

스키마 생성은 CREATE SCHEMA로 간단합니다.

CREATE SCHEMA hr;  -- HR 관련 객체를 위한 스키마 생성

이제 테이블을 스키마에 속하게 만들 수 있습니다.

CREATE TABLE hr.employees (
    employee_id SERIAL PRIMARY KEY,
    first_name VARCHAR(50) NOT NULL,
    last_name VARCHAR(50) NOT NULL,
    department VARCHAR(50)
);

hr.employees 형식으로 테이블을 참조하면 됩니다. 기존 테이블을 스키마로 이동하려면 ALTER TABLE employees SET SCHEMA hr;를 사용하세요.

테이블과 스키마를 함께 사용할 때의 이점

테이블과 스키마를 조합하면 데이터베이스가 더 전문적으로 변합니다. 아래는 주요 이점입니다:

  1. 조직화와 유지보수 용이성: 관련 테이블을 스키마로 묶어 데이터베이스를 '폴더 구조'처럼 탐색. 대규모 프로젝트에서 시간 절약!
  2. 이름 공간 관리: hr.employeesfinance.employees처럼 동명 테이블을 구분. 애플리케이션 확장 시 유연.
  3. 보안 강화: 스키마별 권한 설정으로 민감 데이터(예: 재무)를 제한. 예: REVOKE ALL ON SCHEMA finance FROM public;으로 공개 접근 차단.
  4. 성능 최적화: 스키마를 활용해 인덱스나 뷰를 효율적으로 배치, 쿼리 속도 향상.

이러한 이점으로 인해 PostgreSQL은 엔터프라이즈급 애플리케이션에 적합합니다.

실제 예제: 테이블 및 스키마 활용 시나리오

중소기업의 인사/재무 시스템을 가정해 보죠. HR과 Finance 부서 데이터를 분리 관리합니다.

1. 스키마 생성

CREATE SCHEMA hr;
CREATE SCHEMA finance;

2. 관련 테이블 생성

-- HR 스키마: 직원 테이블
CREATE TABLE hr.employees (
    employee_id SERIAL PRIMARY KEY,
    first_name VARCHAR(50) NOT NULL,
    last_name VARCHAR(50) NOT NULL,
    department VARCHAR(50) DEFAULT 'HR'
);

-- Finance 스키마: 거래 테이블
CREATE TABLE finance.transactions (
    transaction_id SERIAL PRIMARY KEY,
    employee_id INTEGER REFERENCES hr.employees(employee_id),  -- 외래 키로 연결
    amount DECIMAL(10, 2) NOT NULL,  -- 소수점 2자리 금액
    transaction_date DATE NOT NULL,
    description TEXT
);

3. 샘플 데이터 삽입

-- HR 데이터 추가
INSERT INTO hr.employees (first_name, last_name, department) 
VALUES ('Alice', 'Johnson', 'HR'), ('Bob', 'Lee', 'IT');

-- Finance 데이터 추가 (employee_id 1과 연결)
INSERT INTO finance.transactions (employee_id, amount, transaction_date, description) 
VALUES (1, 1500.00, '2023-10-01', '월급 지급');

4. 스키마 간 데이터 쿼리

두 스키마를 조인해 직원 급여 내역을 조회합니다. (외래 키로 연결 가정)

SELECT 
    e.first_name || ' ' || e.last_name AS full_name,
    t.amount AS salary,
    t.transaction_date
FROM hr.employees e
JOIN finance.transactions t ON e.employee_id = t.employee_id
WHERE t.description LIKE '%급여%';

결과 예시:
| full_name | salary | transaction_date |
|---------------|--------|------------------|
| Alice Johnson | 1500.00| 2023-10-01 |

이처럼 스키마를 활용하면 복잡한 쿼리도 직관적입니다. 실제로는 관계를 더 세밀하게 설계하세요!

결론: 효율적인 데이터베이스 관리를 위한 핵심

PostgreSQL에서 테이블과 스키마를 제대로 이해하면, 데이터베이스를 단순한 저장소가 아닌 '지능형 시스템'으로 탈바꿈시킬 수 있습니다. 테이블로 세밀한 데이터 구조를, 스키마로 논리적 분리를 통해 명확성과 확장성을 확보하세요. 초보자라면 pgAdmin이나 DBeaver 같은 GUI 도구를 병행 사용하며 연습해보세요.

728x90