CodeGym /행동 /SQL SELF /RAISE NOTICE로 로깅하기

RAISE NOTICE로 로깅하기

SQL SELF
레벨 52 , 레슨 1
사용 가능

로깅은 애플리케이션이나 데이터베이스가 어떻게 동작하는지, 중요한 이벤트나 정보를 기록하는 과정이야. PL/pgSQL에서는 특히 복잡한 함수 만들 때, 다른 함수 호출하거나 트리거랑 같이 쓰거나 여러 단계가 있을 때 엄청 유용하지. 왜 로깅이 꼭 필요한지 몇 가지 이유를 들어볼게:

  1. 코드 디버깅: 로깅 덕분에 함수가 실행될 때마다 무슨 일이 일어나는지 쉽게 알 수 있어.
  2. 문제 진단: 함수가 기대한 대로 안 돌아가면, 로그를 보면 어디서 에러가 났는지 바로 찾을 수 있어.
  3. 실행 분석: 어떤 단계가 실행됐는지(그리고 순서까지) 알면 성능 최적화나 개선 포인트를 찾기 쉬워.
  4. 유지보수 편함: 1년 뒤에 네가 직접 만든 함수를 열었는데, 뭐가 뭔지 하나도 모르겠을 때(진짜 자주 그래), 로그가 있으면 살 수 있어.

RAISE NOTICE — 로깅의 기본

프로그래머라면 print()console.log()로 디버깅 해본 적 있지? RAISE NOTICE는 PostgreSQL 세계에서 걔네보다 좀 더 강력한 형이야. 함수 실행 중에 정보 메시지를 출력해주거든. 이 메시지는 콘솔, 터미널, 아니면 쿼리 실행하는 인터페이스에서 볼 수 있어.

RAISE NOTICE 문법

RAISE NOTICE '실행 메시지';

이건 시작일 뿐이야. 메시지에 변수를 넣어서 더 유용하게 만들 수도 있어:

RAISE NOTICE '변수의 현재 값: %', my_variable;

여기서 %는 placeholder 역할을 하고, my_variable은 네가 출력하고 싶은 변수야.

여러 변수를 한 번에 출력하고 싶으면 이렇게 하면 돼:

RAISE NOTICE '값들: % 그리고 %', var1, var2;

RAISE NOTICE 사용 예시

1. 변수 값 출력하기. 함수에서 변수를 선언하고 RAISE NOTICE로 그 값을 출력해볼게.

CREATE OR REPLACE FUNCTION debug_variable_example()
RETURNS VOID AS $$
DECLARE
    my_variable INTEGER := 42;
BEGIN
    RAISE NOTICE 'my_variable 변수의 값: %', my_variable;
END;
$$ LANGUAGE plpgsql;

이 함수를 호출하면:

SELECT debug_variable_example();

결과는 대충 이렇게 나와:

NOTICE:  my_variable 변수의 값: 42

2. 실행 단계별로 로깅하기. 여러 단계를 거치는 함수가 있다고 해보자. 각 단계가 끝날 때마다 RAISE NOTICE를 써서 제대로 진행되는지 확인할 수 있어.

CREATE OR REPLACE FUNCTION process_data()
RETURNS VOID AS $$
BEGIN
    RAISE NOTICE '1단계: 프로세스 시작';

    -- 여기서 SQL 코드가 실행됨
    PERFORM pg_sleep(1); -- 작업 시뮬레이션

    RAISE NOTICE '2단계: 프로세스 진행 중';

    -- 또 다른 SQL 코드
    PERFORM pg_sleep(1); -- 작업 시뮬레이션

    RAISE NOTICE '3단계: 프로세스 완료';
END;
$$ LANGUAGE plpgsql;

함수를 호출하면:

SELECT process_data();

이렇게 나와:

NOTICE:  1단계: 프로세스 시작
NOTICE:  2단계: 프로세스 진행 중
NOTICE:  3단계: 프로세스 완료

이제 항상 어느 단계에서 실행되고 있는지 알 수 있지.

실전 활용

계산 과정을 로깅하는 예시를 볼게. 1부터 N까지 합을 구하면서 과정을 로그로 남기는 함수를 만들어보자:

CREATE OR REPLACE FUNCTION sum_with_logging(n INTEGER)
RETURNS INTEGER AS $$
DECLARE
    total INTEGER := 0;
    i INTEGER;
BEGIN
    RAISE NOTICE 'n = %에 대한 계산 시작', n;

    FOR i IN 1..n LOOP
        total := total + i;
        RAISE NOTICE '%단계에서의 합: %', i, total;
    END LOOP;

    RAISE NOTICE '계산 결과: %', total;

    RETURN total;
END;
$$ LANGUAGE plpgsql;

5를 인자로 함수 호출하면:

SELECT sum_with_logging(5);

결과는 이렇게 나와:

NOTICE:  n = 5에 대한 계산 시작
NOTICE:  1단계에서의 합: 1
NOTICE:  2단계에서의 합: 3
NOTICE:  3단계에서의 합: 6
NOTICE:  4단계에서의 합: 10
NOTICE:  5단계에서의 합: 15
NOTICE:  계산 결과: 15

로깅 꿀팁

  1. 불필요한 로그는 지우기: 함수가 완성되고 디버깅 끝났으면, RAISE NOTICE 메시지는 꼭 필요한 것만 남기고 다 지워. 터미널이나 사용자 인터페이스가 지저분해질 수 있어.
  2. 의미 있는 메시지 쓰기: 그냥 "1단계", "2단계"만 쓰지 말고, 무슨 단계인지 명확하게 써줘.
  3. 민감한 정보는 로그에 남기지 않기: 카드 정보, 비밀번호 같은 민감한 데이터는 절대 로그에 남기지 마!
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION