로깅은 애플리케이션이나 데이터베이스가 어떻게 동작하는지, 중요한 이벤트나 정보를 기록하는 과정이야. PL/pgSQL에서는 특히 복잡한 함수 만들 때, 다른 함수 호출하거나 트리거랑 같이 쓰거나 여러 단계가 있을 때 엄청 유용하지. 왜 로깅이 꼭 필요한지 몇 가지 이유를 들어볼게:
- 코드 디버깅: 로깅 덕분에 함수가 실행될 때마다 무슨 일이 일어나는지 쉽게 알 수 있어.
- 문제 진단: 함수가 기대한 대로 안 돌아가면, 로그를 보면 어디서 에러가 났는지 바로 찾을 수 있어.
- 실행 분석: 어떤 단계가 실행됐는지(그리고 순서까지) 알면 성능 최적화나 개선 포인트를 찾기 쉬워.
- 유지보수 편함: 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
로깅 꿀팁
- 불필요한 로그는 지우기: 함수가 완성되고 디버깅 끝났으면,
RAISE NOTICE메시지는 꼭 필요한 것만 남기고 다 지워. 터미널이나 사용자 인터페이스가 지저분해질 수 있어. - 의미 있는 메시지 쓰기: 그냥 "1단계", "2단계"만 쓰지 말고, 무슨 단계인지 명확하게 써줘.
- 민감한 정보는 로그에 남기지 않기: 카드 정보, 비밀번호 같은 민감한 데이터는 절대 로그에 남기지 마!
GO TO FULL VERSION