CodeGym /행동 /SQL SELF /pgAdmin으로 PL/pgSQL 디버깅하기: 브레이크포인트, 변수 보기

pgAdmin으로 PL/pgSQL 디버깅하기: 브레이크포인트, 변수 보기

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

자, 너가 첫 번째 프로시저나 함수를 짜고 실행했는데 뭔가 잘 안 돼. 물론 RAISE NOTICE를 잔뜩 넣어서 어디서 "배가 암초에 걸렸는지" 찾을 수도 있지. 근데! 굳이 그렇게 고생할 필요 없어, pgAdmin에 내장 디버거가 있으니까!

pgAdmin은 코드를 한 줄씩 실행해보고, 브레이크포인트(breakpoints)를 걸고, 변수 값도 바로바로 확인하고, 에러 원인도 찾을 수 있게 해줘. 이건 말 그대로 "탐정 키트"야. 미스터리: "왜 내 쿼리가 안 돌아가지?"를 파헤치는 거지.

왜 pgAdmin으로 디버깅해야 할까?

가끔 프로시저 내부 버그가 너무 깊숙이 숨어 있어서 로그나 터미널 텍스트만으로는 도저히 못 찾겠을 때가 있어. 이럴 때 한 줄씩 디버깅하면 함수가 어떻게 동작하는지 다 볼 수 있어서 진짜 퍼즐 맞추기 하는 느낌인데, 힌트도 같이 주는 거지.

pgAdmin 디버깅으로 할 수 있는 건:

  1. 브레이크포인트(breakpoints) 설정 — 코드가 멈추는 지점을 지정해서 그 시점의 상태를 볼 수 있어.
  2. SQL 코드를 한 줄씩 실행 — 진짜로 한 줄 한 줄 어떤 명령문이 실행되는지 볼 수 있어.
  3. 변수 값을 실시간으로 확인 — 데이터가 제대로 전달되고 처리되는지 바로 체크 가능.
  4. 에러가 발생한 위치를 찾고, 그 원인을 파악할 수 있어.

시작하기: 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에서 브레이크포인트 어떻게 거는 거야?

  1. pgAdmin을 열고 네 데이터베이스에 연결해.
  2. 오브젝트 트리에서 네 함수나 프로시저를 찾아: Functions → <네 스키마> → <네 함수>.
  3. 함수에서 마우스 오른쪽 클릭하고 Debugging → Debug을 선택해. 그러면 디버거가 실행돼.
  4. 함수 코드 창에서 디버깅을 시작하고 싶은 줄 왼쪽 여백을 클릭해. 빨간 동그라미가 뜨면 그게 브레이크포인트야.

이런 식이야:

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에서 뭘 반환했는지.

변수 값은 어떻게 확인해?

함수 실행이 브레이크포인트에서 멈추면:

  1. 디버깅 창 아래쪽 Variables 탭으로 가.
  2. 여기서 모든 변수와 그 현재 값을 볼 수 있어.

예를 들어, 이런 함수가 있다고 해보자:

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으로 바뀌는 걸 볼 수 있어.

코드 한 줄씩 실행하기

디버거 창에서 함수 실행을 아래 버튼으로 조작할 수 있어:

  1. Step Over — 현재 명령문 실행하고 다음 줄로 넘어가.
  2. Step Into — 호출된 함수나 프로시저 안으로 "들어가서" 디버깅할 수 있어.
  3. 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;

브레이크포인트를 걸 수 있는 곳:

  1. SELECT status INTO order_status 줄.
  2. SELECT SUM(price * quantity) INTO total_amount 줄.

디버깅하면서 할 수 있는 것:

  • order_status가 진짜 'Pending'인지 확인.
  • total_amount가 제대로 계산되는지 체크.

자주 나오는 에러와 해결법

pgAdmin으로 디버깅하다 보면 이런 상황이 생길 수 있어:

  1. 함수가 목록에 안 보여. 함수가 진짜 네 데이터베이스에 만들어졌는지, 그리고 네가 맞는 DB에 연결했는지 확인해.
  1. 브레이크포인트가 안 먹혀. pldbgapi 확장이 켜져 있는지, 그리고 권한이 충분한지 체크해.

  2. 디버거 연결 에러. PostgreSQL 서버가 디버깅을 지원하도록 세팅됐는지(shared_preload_libraries에 pldbgapi가 포함됐는지) 확인해.

pgAdmin으로 PL/pgSQL을 디버깅하면 진짜 쉽고 직관적으로 문제를 찾을 수 있어. 브레이크포인트 걸고, 변수 값 확인하고, 꼼꼼하게 고치면 — 네 완벽한 앱까지 반은 온 거야!

2
과제
SQL SELF, 레벨 56, 레슨 0
잠금
여러 변수로 함수 디버깅하기
여러 변수로 함수 디버깅하기
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION