본문 바로가기
Database/Postgre

[PostgreSQL] 사용자가 정의한 메시지로 프로시저 내부 EXCEPION 처리 하기

by 리콩알 2024. 7. 19.
반응형

오늘도 돌아온 포스트그레 게시물...ㅎㅎㅎ 이번에는 오라클 프로시저에서 포스트그레 프로시저로 변환하면서 생겼다.

기존에 오라클에서 Exception을 통해서 에러가 나면 사용자가 임의로 원하는 메시지가 출력 되도록 되어있었는데 포스트 그레는 해당 부분에 대한 문법이 다른지 출력이 되지 않아 어디서 에러가 나는지 프로시저 내부를 다 들여다 봐야하는 상황이 생겼다...

 

기존 오라클 Exception 문법은 아래와 같다.

Exception에러가 발생하는 경우 에러 코드와 에러 메시지를 뿌리도록 되어있도록 되어있다.

( V_ERRNUM, V_ERRMSG 내장 변수를 사용 하였습니다.)

DECLARE
   V_ERRNUM integer;
   V_ERRMSG varchar(4000);
   
   BEGIN
    -- 실행 코드
     EXCEPTION -- 예외 처리
        V_ERRNUM := '-20001';
        V_ERRMSG := '사용자 오류가 발생하였습니다.';

        RAISE EXCEPTION '%', V_ERRMSG USING ERRCODE = V_ERRNUM;
    END;

 

 

** 여기서 RAISE EXCEPTION이란??

사용자가 어떤 조건이 충족될때 '직접 에러를 발생'시킬 수 있게 하는 명령어를 의미합니다.
사용자 에러코드 및 에러메시지를 정의하고 Exception을 발생시킵니다.

'RAISE EXCEPTION'은 주로 PL/pgSQL 함수 내부에서 사용되며 에러 메시지와 함께 선택적으로 값들을 반환할 수 있습니다.

 

 

하지만 포스트그레에서는 오라클 문법이 아닌 프로시저 문법을 사용해야한다.

DECLARE
   V_ERRNUM integer;
   V_ERRMSG varchar(4000);
   
    BEGIN
    -- 실행코드
     EXCEPTION
        V_ERRNUM := '-20001';
        V_ERRMSG := '사용자 오류가 발생하였습니다.';

        RAISE EXCEPTION '%: %', V_ERRNUM, V_ERRMSG USING ERRCODE = 'P0001';
    END;

 

PL/SQL문법 에러코드에는 여러가지가 있지만  'P0001' 코드가 사용자 정의 오류코드이기 때문에 해당 코드를 사용했다.

 

클래스 P0
(PL/pgSQL 오류)
P0000 plpgsql_error PL/pgSQL에서 에러가 발생했습니다.
  P0001 raise_exception 예외가 발생했습니다.
  P0002 no_data_found 데이터를 찾을 수 없습니다.
  P0003 too_many_rows 결과 행이 너무 많습니다.
  P0004 assert_failure 단언문이 실패했습니다.

 

 

이후 Back과 Front단에서도 해당 메시지를 불러올 수 있도록 소스 처리를 해주어야한다.

Back단에서는 기존에 프로시저 호출 후 다음 로직을 실행하는 방식으로 진행하였다면, try / catch문을 사용하여 에러가 나는 경우 해당 부분에서 Exception메시지를 출력할 수 있도록 수정해준다.

try {
 //프로시저 실행관련 로직
} catch (SQLException e) { //에러나는 경우 exception으로 처리
	e.printStackTrace();
}

 

Front단에서는 API로 호출한 결과값에 맞는 메시지를 불러 오도록 처리해준다.

프로시저 메시지 처리 후 프로시저에서 설정한 오류를 출력하는 모습을 볼 수 있다.

 

반응형