- 1행: hello_world라는 이름에 인자로 name을 받는 함수를 생성하였습니다. - 2행: 해당 함수의 반환 값은 TEXT 타입입니다. - 3행~4행: 함수 내부적으로 변수로 greeting이라는 TEXT 타입의 변수를 선언하였습니다. - 5행~7행: greeting 변수는 name 인자와 "Hello, " 및 "!" 문자열을 연결한 문자열로 설정됩니다. 마지막으로 함수는 greeting 변수를 반환합니다. 💡 최종적으로 hello_world 함수에 name의 인자를 넣어서 호출을 하면 hello, {name}!이라는 문자열을 반환해 주는 함수입니다.
CREATEFUNCTION hello_world(name TEXT)
RETURNS TEXT AS $$
DECLARE
greeting TEXT;
BEGIN
greeting :='Hello, '|| name ||'!';
RETURN greeting;
END;
$$ LANGUAGE plpgsql;
- 하나 이상의 ‘입력 인수’를 받아서 ‘결과를 반환’하는 일련의 작업을 수행하는 SQL 코드 블록을 의미합니다. - 해당 일련의 작업은 특정 ‘작업’을 수행하기 위해서 수행되며 ‘입력’을 받아서 처리한 후 결과값은 ‘반환할 수도 있고 반환하지 않을 수도’ 있습니다. - 특정 작업은 데이터베이스 내의 데이터를 조작하고 업데이트를 하는 작업을 의미합니다.
- 데이터 베이스 내부에서 실행되며 애플리케이션 개발자가 호출하여 실행할 수 있습니다.
[ 더 알아보기 ]
💡Procedure와 Stored Procedures 차이점은?
- Procedure는 특정 task를 수행하는 코드 블록입니다. - Stored Procedures는 데이터베이스에 저장된 Procedure입니다. - Stored Procedures는 데이터베이스에 저장되어 다른 사용자 또는 애플리케이션에서 호출될 수 있습니다.
- 1행: hello_world라는 이름에 인자로 name을 받는 프로시저를 생성하였습니다. - 2행: 해당 프로시저가 작성된 언어를 지정합니다. - 4행~5행: 함수 내부적으로 변수로 greeting이라는 TEXT 타입의 변수를 선언하였습니다. - 6행~7행: greeting 변수는 name 인자와 "Hello, " 및 "!" 문자열을 연결한 문자열로 설정됩니다. - 8행 : 해당 프로시저가 종료되기 전 콘솔로 전달이 됩니다.
💡 최종적으로 hello_world 프로시저에 name의 인자를 넣어서 호출을 하면 hello, {name}!이라는 문자열을 콘솔로 반환해 주는 프로시저입니다.
CREATEPROCEDURE hello_world(name TEXT)
LANGUAGE plpgsql
AS $$
DECLARE
greeting TEXT;
BEGIN
greeting :='Hello, '|| name ||'!';
RAISE NOTICE '%', greeting;
END;
$$;
[ 더 알아보기 ] 💡 RAISE NOTICE 란?
- PL/pgSQL에서 디버깅 목적으로 사용되는 문장으로 실행 중 콘솔에 ‘텍스트를 출력’할 수 있게 합니다. - 개발 중 변수의 값을 출력하거나 디버깅 정보를 출력하는 데 자주 사용됩니다. - RAISE NOTICE로 출력된 텍스트는 데이터베이스 로그나 로깅을 활성화한 클라이언트 애플리케이션에서 확인할 수 있습니다.
- 데이터베이스 내부에서 실행되므로, Stored Procedure을 사용하여 데이터베이스 개발을 모듈화하면 애플리케이션 개발 생산성을 높일 수 있습니다.
성능 향상
- 데이터베이스 내부에서 실행되므로, 데이터베이스에 직접 액세스하여 Stored Procedure을 호출하면 불필요한 데이터 전송을 줄일 수 있습니다. - 소스코드 변경이 발생하는 경우 프로시저 내에서만 수정하여 적용하면 되기에 편리하여 버그에 대한 빠른 대응에 좋습니다.(단, 프로시저가 검증이 안된 상태에 잘못된 처리를 수행하는 경우 문제가 생길수 있습니다)
보안(접근 권한, 소스 보호)
- Stored Procedure을 사용하면 애플리케이션 개발자가 데이터베이스에 직접 액세스하지 않고도 데이터베이스에서 작업을 수행할 수 있으므로, 보안을 강화할 수 있습니다. -테이블에 대한 직접적인 처리에 대한 권한을 줄이고 Procedure 권한만 주어진다면 접근 권한 및 소스 보안에 좋습니다.
유지보수
- 하나의 처리작업이 DELETE 작업을 수행하고, SELECT하며 INSERT를 수행하고 SELECT를 수행하는 과정이라면 여러개의 트랜잭션을 하나로 묶어 프로시저로 구성하여 간소화 처리가 가능합니다.
프로시저 배치 잡
- 첫 번째 프로시저를 통해 대용량 데이터 처리를 수행하고 이에 대한 반환 값을 기반으로 다음 프로시저를 처리하는 경우에 간단하게 처리가 가능합니다.