PostgreSQL은 SQL만 "말"하는 게 아니야! 소개할게: PL/pgSQL (Procedural Language/PostgreSQL Structured Query Language), PostgreSQL에 내장된 프로시저형 프로그래밍 언어야. 이 언어는 SQL 쿼리랑 IF, CASE 같은 조건문, LOOP, FOR, WHILE 같은 반복문 등 제어 구조를 사용해서 복잡한 작업을 쉽게 처리하려고 만들어졌어.
PL/pgSQL이랑 SQL은 자동화된 조립 라인이랑 그냥 "수동" 도구(예: 망치) 같은 거야. 망치처럼 SQL도 믿을 만한 도구지. 근데 망치질할 때마다 직접 힘줘서 쳐야 하잖아. PL/pgSQL은 자동 조립 라인처럼 한 번만 뭐 어떻게 할지 정해두면, 그다음부터는 알아서 척척 돌아가. 명령 실행하고, 기억하고, 체크하고, 뭔가 잘못돼도 침착하게 계속 진행하지. 굳이 못 하나하나 직접 박을 필요 없이, 그냥 다 알아서 되는 거 구경만 하면 돼. 완전 꿈 아니냐?
PL/pgSQL과 일반 SQL 쿼리 비교
PL/pgSQL이랑 그냥 SQL 쿼리가 뭐가 다른지 한번 알아보자.
SQL은 한 가지 작업만 딱 할 때는 완전 좋아: 예를 들어 테이블에서 모든 학생을 조회하거나 새 행을 추가하는 거. 근데 "만약 이러면 저렇게" 같은 로직이나 반복 작업이 필요해지면, SQL만으로는 좀 힘들어져.
예를 들어, 이런 상황을 생각해봐:
- 테이블에 이미 학생 정보가 있는지 확인한다.
- 정보가 있으면 — 데이터를 업데이트한다.
- 정보가 없으면 — 새로 추가한다.
일반 SQL만 쓰면 여러 쿼리를 따로 작성하고, 결과도 클라이언트 쪽에서 처리해야 해. 근데 PL/pgSQL로 하면 이걸 전부 데이터베이스 쪽에서 한 번에 처리하는 프로시저로 만들 수 있어.
PL/pgSQL은 좀 더 복잡한 프로젝트에서 진가를 발휘해. 예를 들어:
- 중간 결과를 변수에 저장할 수 있다;
- 에러를 처리해서 데이터베이스가 갑자기 "죽지" 않게 할 수 있다;
- 반복문, 조건문으로 복잡한 알고리즘도 구현할 수 있다.
PL/pgSQL 사용 분야
PL/pgSQL은 이런 상황에서 자주 써:
작업 자동화. 예를 들어, 데이터가 업데이트될 때마다 자동으로 로그(
log)에 기록을 남기는 거.비즈니스 로직. 예를 들어, 결석이 5번 넘는 학생은 자동으로 "비활성"으로 표시해야 한다는 규칙이 있다면, 이걸 PL/pgSQL 함수로 만들면 돼.
분석 및 리포트. 데이터를 데이터베이스랑 클라이언트 앱 사이에서 왔다 갔다 하지 말고, 서버 쪽에서 바로 집계할 수 있어.
트리거. PL/pgSQL은 데이터 삽입, 수정, 삭제할 때 자동으로 동작하는 트리거를 작성할 때도 써.
PL/pgSQL 사용 예시
여기 두 숫자를 받아서 더한 결과를 반환하는 함수 예시가 있어:
CREATE FUNCTION add_numbers(a INT, b INT) RETURNS INT AS $$
BEGIN
RETURN a + b;
END;
$$ LANGUAGE plpgsql;
설명:
CREATE FUNCTION add_numbers(a INT, b INT)—add_numbers라는 이름의 함수를 만들고,INT타입(정수)인 두 개의 인자를 받아.RETURNS INT— 함수가 정수를 반환한다는 뜻이야.BEGIN ... END— 여기서 함수의 주요 로직이 실행돼.RETURN a + b;— 두 숫자를 더한 결과를 반환해.
이 함수를 호출하려면 그냥 일반 SQL 쿼리를 쓰면 돼:
SELECT add_numbers(10, 20);
결과: 30.
주의할 점과 한계
PL/pgSQL은 강력한 도구지만, 쓸 때 주의해야 할 점도 있어:
- 성능: 너무 복잡한 함수는 데이터베이스를 느리게 만들 수 있어. 항상 테스트하고 최적화하자.
- 테스트: 함수에 버그가 있어도 직접 호출해보기 전엔 잘 안 보일 수 있어. 테스트 꼭 하자!
- 가독성: 너무 크고 복잡한 함수나 프로시저는 나중에 이해하기 힘들 수 있어. 한 달 뒤에 봐도 이해할 수 있게 코드를 쓰자.
이제 PL/pgSQL이 뭔지 조금 알았으니까, 다음엔 문법이랑 주요 기능을 더 알아볼 거야. 다음 강의에서는 코드 블록 만들기, 변수 선언, 데이터 타입 다루기 등을 배울 거야. 데이터베이스 쪽 프로그래밍, 같이 달려보자!
GO TO FULL VERSION