자, 너가 첫 번째 프로시저나 함수를 짜고 실행했는데 뭔가 잘 안 돼. 물론 RAISE NOTICE를 잔뜩 넣어서 어디서 "배가 암초에 걸렸는지" 찾을 수도 있지. 근데! 굳이 그렇게 고생할 필요 없어, pgAdmin에 내장 디버거가 있으니까!
pgAdmin은 코드를 한 줄씩 실행해보고, 브레이크포인트(breakpoints)를 걸고, 변수 값도 바로바로 확인하고, 에러 원인도 찾을 수 있게 해줘. 이건 말 그대로 "탐정 키트"야. 미스터리: "왜 내 쿼리가 안 돌아가지?"를 파헤치는 거지.
왜 pgAdmin으로 디버깅해야 할까?
가끔 프로시저 내부 버그가 너무 깊숙이 숨어 있어서 로그나 터미널 텍스트만으로는 도저히 못 찾겠을 때가 있어. 이럴 때 한 줄씩 디버깅하면 함수가 어떻게 동작하는지 다 볼 수 있어서 진짜 퍼즐 맞추기 하는 느낌인데, 힌트도 같이 주는 거지.
pgAdmin 디버깅으로 할 수 있는 건:
- 브레이크포인트(breakpoints) 설정 — 코드가 멈추는 지점을 지정해서 그 시점의 상태를 볼 수 있어.
- SQL 코드를 한 줄씩 실행 — 진짜로 한 줄 한 줄 어떤 명령문이 실행되는지 볼 수 있어.
- 변수 값을 실시간으로 확인 — 데이터가 제대로 전달되고 처리되는지 바로 체크 가능.
- 에러가 발생한 위치를 찾고, 그 원인을 파악할 수 있어.
시작하기: pgAdmin에서 디버깅 준비
디버깅을 시작하기 전에, 환경이 제대로 세팅됐는지 확인하자.
plpgsql 확장 활성화하기
네 데이터베이스에 PL/pgSQL 프로그래밍 언어가 활성화되어 있는지 확인해봐:
CREATE EXTENSION IF NOT EXISTS plpgsql;
이 언어는 PostgreSQL에서 기본적으로 켜져 있지만, 그래도 한 번 체크하는 게 좋아.
pgAdmin 4버전 이상이 설치되어 있는지 확인해 (이 버전부터 디버깅 지원해). 아직 없다면, pgAdmin을 공식 사이트에서 다운받을 수 있어.
pldbgapi 확장 설치하기
pgAdmin에서 PL/pgSQL 디버깅을 하려면 pldbgapi 확장을 활성화해야 해:
CREATE EXTENSION IF NOT EXISTS pldbgapi;
이 확장은 디버거랑 연동하려고 특별히 만들어진 거야.
진짜 중요!!! PostgreSQL 서버에서 이 쿼리를 실행하려면 관리자 권한이 있어야 해.
디버깅 기본: 브레이크포인트(breakpoints) 설정
브레이크포인트(breakpoints)는 프로시저나 함수 코드에서 실행을 멈추게 하는 특별한 지점이야. 장거리 여행 중에 잠깐 쉬는 것처럼, 멈춰서 주변을 살펴보고, 지도도 확인하고, 다시 출발하는 거지.
pgAdmin에서 브레이크포인트 어떻게 거는 거야?
- pgAdmin을 열고 네 데이터베이스에 연결해.
- 오브젝트 트리에서 네 함수나 프로시저를 찾아: Functions → <네 스키마> → <네 함수>.
- 함수에서 마우스 오른쪽 클릭하고 Debugging → Debug을 선택해. 그러면 디버거가 실행돼.
- 함수 코드 창에서 디버깅을 시작하고 싶은 줄 왼쪽 여백을 클릭해. 빨간 동그라미가 뜨면 그게 브레이크포인트야.
이런 식이야:
CREATE OR REPLACE FUNCTION example_function(id INTEGER)
RETURNS VOID AS $$
BEGIN
RAISE NOTICE '너가 고른 id: %', id;
-- 여기서 브레이크포인트를 걸 수 있어
PERFORM some_operation(id);
END;
$$ LANGUAGE plpgsql;
브레이크포인트를 걸고 나면, 함수를 실행하면 딱 그 줄에서 멈춰. 이제 변수 값, 이전 명령문 결과, 그리고 계속 실행도 할 수 있지.
pgAdmin에서 변수 보기
코드가 멈췄다는 것만 알아도 좋지만, 그 순간 메모리에 어떤 데이터가 들어있는지 아는 게 훨씬 유용해. 예를 들어:
- 입력 파라미터 값이 뭔지.
- 특정 블록 실행 후 변수 값이 어떻게 바뀌었는지.
- 쿼리가 DB에서 뭘 반환했는지.
변수 값은 어떻게 확인해?
함수 실행이 브레이크포인트에서 멈추면:
- 디버깅 창 아래쪽 Variables 탭으로 가.
- 여기서 모든 변수와 그 현재 값을 볼 수 있어.
예를 들어, 이런 함수가 있다고 해보자:
CREATE OR REPLACE FUNCTION calculate_discount(price NUMERIC, discount NUMERIC)
RETURNS NUMERIC AS $$
DECLARE
discounted_price NUMERIC;
BEGIN
discounted_price := price - (price * discount / 100);
RETURN discounted_price;
END;
$$ LANGUAGE plpgsql;
discounted_price 줄에 브레이크포인트를 걸면, 디버거가 price와 discount는 값이 들어있고, discounted_price는 아직 비어있는 걸 보여줄 거야.
브레이크포인트에서 변수 목록은 이렇게 보여:
| 변수 | 값 |
|---|---|
price |
100.00 |
discount |
15.00 |
discounted_price |
NULL |
이제 현재 줄을 실행하면 discounted_price가 85.00으로 바뀌는 걸 볼 수 있어.
코드 한 줄씩 실행하기
디버거 창에서 함수 실행을 아래 버튼으로 조작할 수 있어:
- Step Over — 현재 명령문 실행하고 다음 줄로 넘어가.
- Step Into — 호출된 함수나 프로시저 안으로 "들어가서" 디버깅할 수 있어.
- Continue — 다음 브레이크포인트나 함수 끝까지 계속 실행해.
실전: 복잡한 함수 디버깅하기
이제 좀 더 복잡한 함수를 만들어서 디버깅해보자.
예시: 주문 처리
CREATE OR REPLACE FUNCTION process_order(order_id INTEGER)
RETURNS TEXT AS $$
DECLARE
order_status TEXT;
total_amount NUMERIC;
BEGIN
-- 주문 상태 설정
SELECT status INTO order_status
FROM orders
WHERE id = order_id;
IF order_status = 'Pending' THEN
-- 주문 금액 계산
SELECT SUM(price * quantity) INTO total_amount
FROM order_items
WHERE order_id = order_id;
-- 주문 상태 업데이트
UPDATE orders
SET status = 'Processed', processed_date = NOW()
WHERE id = order_id;
RETURN '주문 처리됨. 금액: ' || total_amount;
ELSE
RETURN '주문이 이미 처리됐거나 존재하지 않아.';
END IF;
END;
$$ LANGUAGE plpgsql;
브레이크포인트를 걸 수 있는 곳:
SELECT status INTO order_status줄.SELECT SUM(price * quantity) INTO total_amount줄.
디버깅하면서 할 수 있는 것:
order_status가 진짜'Pending'인지 확인.total_amount가 제대로 계산되는지 체크.
자주 나오는 에러와 해결법
pgAdmin으로 디버깅하다 보면 이런 상황이 생길 수 있어:
- 함수가 목록에 안 보여. 함수가 진짜 네 데이터베이스에 만들어졌는지, 그리고 네가 맞는 DB에 연결했는지 확인해.
브레이크포인트가 안 먹혀.
pldbgapi확장이 켜져 있는지, 그리고 권한이 충분한지 체크해.디버거 연결 에러. PostgreSQL 서버가 디버깅을 지원하도록 세팅됐는지(
shared_preload_libraries에pldbgapi가 포함됐는지) 확인해.
pgAdmin으로 PL/pgSQL을 디버깅하면 진짜 쉽고 직관적으로 문제를 찾을 수 있어. 브레이크포인트 걸고, 변수 값 확인하고, 꼼꼼하게 고치면 — 네 완벽한 앱까지 반은 온 거야!
GO TO FULL VERSION