CodeGym /행동 /SQL SELF /제어문과 로깅 작업에서 자주 나오는 실수 분석

제어문과 로깅 작업에서 자주 나오는 실수 분석

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

본론으로 들어가기 전에, 너가 마주칠 수 있는 흔한 실수들과 실수 포인트들을 짚고 넘어가자. 사실 SQL에서의 실수는 개발자라면 누구나 겪는 고통이고, 보통 제일 안 좋은 타이밍에 터지지.

1. 문법 오류: "IF 닫는 걸 까먹었어"

문법 오류는 제일 기본적인 문제지만, 생각보다 자주 나와. 예를 들어, IF 조건문 블록을 END IF;로 닫는 걸 까먹으면, 컴파일러가 바로 뭐라 할 거야.

실수 예시:

CREATE OR REPLACE FUNCTION check_number(num INTEGER)
RETURNS TEXT AS $$
BEGIN
    IF num > 0 THEN
        RETURN '양수';
    ELSE
        RETURN '음수';
-- 어딘가에서 END IF;가 빠졌어
END;
$$ LANGUAGE plpgsql;

이 코드를 실행하면 ERROR: syntax error at or near "END"라는 에러가 나올 거야. 왜냐면 IF 블록이 안 닫혔으니까.

이런 실수를 피하려면?

항상 코드 구조를 명확하게 써. 블록(IF 같은 거)을 열었으면 바로 닫는 것도 같이 써두는 습관을 들이자. 고쳐진 예시는 이래:

CREATE OR REPLACE FUNCTION check_number(num INTEGER)
RETURNS TEXT AS $$
BEGIN
    IF num > 0 THEN
        RETURN '양수';
    ELSE
        RETURN '음수';
    END IF; -- 블록 닫는 거 잊지 마!
END;
$$ LANGUAGE plpgsql;

2. CASE에서 모든 조건을 안 다룸: "아무데도 안 걸리면 어쩌지?"

CASE를 쓸 때는 항상 ELSE 분기를 넣어서 예상 못한 상황도 처리해줘야 해. 이게 없으면 NULL이 반환돼서 골치 아플 수 있어.

실수 예시:

CREATE OR REPLACE FUNCTION grade_result(grade CHAR)
RETURNS TEXT AS $$
BEGIN
    RETURN CASE grade
        WHEN 'A' THEN '최고'
        WHEN 'B' THEN '좋음'
        WHEN 'C' THEN '보통'
        -- 만약 grade = 'D'거나 다른 값이면?
    END;
END;
$$ LANGUAGE plpgsql;

D 값을 넣으면 함수가 NULL을 반환해서 코드에 문제를 일으킬 수 있어.

고친 버전:

CREATE OR REPLACE FUNCTION grade_result(grade CHAR)
RETURNS TEXT AS $$
BEGIN
    RETURN CASE grade
        WHEN 'A' THEN '최고'
        WHEN 'B' THEN '좋음'
        WHEN 'C' THEN '보통'
        ELSE '알 수 없는 등급' -- 나머지 케이스도 다 잡아줘
    END;
END;
$$ LANGUAGE plpgsql;

3. 무한 루프 문제: "서버가 왜 멈췄지?"

LOOP를 쓸 때, 빠져나오는 조건을 안 넣으면 무한 반복에 빠지기 쉬워.

실수 예시:

CREATE OR REPLACE FUNCTION infinite_loop_demo()
RETURNS VOID AS $$
DECLARE
    i INTEGER := 1;
BEGIN
    LOOP
        i := i + 1;
        -- 빠져나오는 조건이 없어!
    END LOOP;
END;
$$ LANGUAGE plpgsql;

이 코드는 루프가 끝나지 않아서 서버가 멈출 거야.

고치는 방법:

EXIT로 빠져나오는 조건을 꼭 넣어줘:

CREATE OR REPLACE FUNCTION finite_loop_demo()
RETURNS VOID AS $$
DECLARE
    i INTEGER := 1;
BEGIN
    LOOP
        i := i + 1;
        IF i > 10 THEN
            EXIT; -- 빠져나오는 조건
        END IF;
    END LOOP;
END;
$$ LANGUAGE plpgsql;

4. 루프에서 반복 건너뛰기 실수: "빠진 데이터는 어쩌지?"

CONTINUE로 반복을 건너뛸 때, 모든 경우를 다 고려하지 않으면 실수가 생길 수 있어. 예를 들어:

실수 예시:

CREATE OR REPLACE FUNCTION skip_even()
RETURNS VOID AS $$
DECLARE
    i INTEGER := 0;
BEGIN
    WHILE i < 10 LOOP
        i := i + 1;
        IF i % 2 = 0 THEN
            CONTINUE; -- 짝수는 그냥 건너뜀
        END IF;
        RAISE NOTICE '홀수: %', i;
    END LOOP;
END;
$$ LANGUAGE plpgsql;

만약 모든 숫자가 짝수라면? 서버는 돌아가지만 아무 결과도 안 보여.

고치는 방법:

모든 데이터를 제대로 처리하고, 로깅도 추가해서 확인하자:

CREATE OR REPLACE FUNCTION skip_even_logging()
RETURNS VOID AS $$
DECLARE
    i INTEGER := 0;
BEGIN
    WHILE i < 10 LOOP
        i := i + 1;
        IF i % 2 = 0 THEN
            RAISE NOTICE '짝수 건너뜀: %', i;
            CONTINUE;
        END IF;
        RAISE NOTICE '홀수: %', i;
    END LOOP;
END;
$$ LANGUAGE plpgsql;

이제 어떤 숫자가 건너뛰어졌는지 볼 수 있어.

5. 잘못된 에러 처리: "RAISE EXCEPTION 어디 갔지?"

RAISE EXCEPTION으로 에러를 처리하는 건 강력하지만, 잘못 쓰면 바로 에러가 나.

실수 예시:

CREATE OR REPLACE FUNCTION calculate_square(num INTEGER)
RETURNS INTEGER AS $$
BEGIN
    IF num < 0 THEN
        RAISE '음수는 허용되지 않아!';
    END IF;
    RETURN num * num;
END;
$$ LANGUAGE plpgsql;

이 코드는 RAISE 문법이 잘못돼서(메시지 레벨이 없음) 에러가 나올 거야.

고친 버전:

CREATE OR REPLACE FUNCTION calculate_square(num INTEGER)
RETURNS INTEGER AS $$
BEGIN
    IF num < 0 THEN
        RAISE EXCEPTION '음수는 허용되지 않아!';
    END IF;
    RETURN num * num;
END;
$$ LANGUAGE plpgsql;

6. 로깅 실수: "내 에러가 왜 error_log에 안 써지지?"

error_log 테이블에 잘못된 INSERT INTO 쿼리 때문에 로깅이 안 될 수 있어.

실수 예시:

CREATE OR REPLACE FUNCTION log_error(err_msg TEXT)
RETURNS VOID AS $$
BEGIN
    INSERT INTO error_log (error_message, error_time)
    VALUES (err_msg, CURRENT_TIMESTAMP); -- 컬럼 이름이 다르면?
END;
$$ LANGUAGE plpgsql;

만약 error_log 테이블에서 컬럼 이름이 error_msg로 바뀌었다면, 이 쿼리는 에러를 낼 거야.

예방 방법:

항상 테이블 구조를 확인하거나, 데이터 관리를 위해 스키마를 엄격하게 쓰는 게 좋아.

7. 그냥 실수, "사람이니까"

실수는 꼭 기술적인 것만 있는 게 아니야. 디버깅 코드 안 지우기, 안 쓰는 변수 남기기, 코드 포맷팅 안 하기 등등... 이런 것들이 함수 코드를 엉망으로 만들지.

예시:

DECLARE
    i INTEGER; -- 안 쓰는 변수는 왜 선언했지?

해결: 안 쓰는 코드는 과감하게 지워서 코드가 깔끔하고 보기 좋게 유지하자.

이제 PL/pgSQL에서 자주 나오는 실수들을 피할 준비가 됐어! 테스트, 로깅, 그리고 버그를 제때 고치는 습관을 들이면, 너도 스트레스랑 클라이언트 전화에서 해방될 수 있을 거야!

1
설문조사/퀴즈
에러 처리, 레벨 52, 레슨 4
사용 불가능
에러 처리
에러 처리
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION