데이터베이스를 다루다 보면 함수(Function)와 프로시저(Procedure)를 자주 접하게 됩니다. 두 개념 모두 입력값을 받아 일련의 작업을 수행한다는 공통점이 있지만, 사용 목적과 동작 방식에서 뚜렷한 차이를 보입니다. 이 글에서는 두 객체의 기본 개념부터 실무에서 꼭 알아야 할 9가지 핵심 차이점까지 표로 깔끔하게 정리해 드립니다.
함수(Function)란?
함수는 프로그래밍 언어에서 입력값을 받아 특정 연산을 수행하고 그 결과를 반환하는 명령문의 집합입니다. SQL에서 함수는 반드시 하나의 값을 반환하며, 주로 계산이나 데이터 변환 목적으로 사용됩니다.
프로시저(Procedure)란?
프로시저 역시 입력값을 받아 지정된 작업을 순서대로 수행하는 명령문의 집합입니다. 다만 SQL에서 프로시저는 값을 반환하지 않고, 호출한 곳으로 제어권만 돌려줍니다. 참고로 Java 같은 언어에서는 함수와 프로시저의 구분이 없으며, 이를 통칭하여 '서브루틴(sub-routine)'이라고 부르기도 합니다.
SQL 함수 vs 프로시저: 9가지 핵심 차이점
다음 표는 SQL 함수와 프로시저의 주요 차이점을 항목별로 비교한 것입니다.
| 번호 | 구분 기준 | 함수 (Function) | 프로시저 (Procedure) |
|---|---|---|---|
| 1 | 정의 | 주어진 입력값을 바탕으로 결과를 계산하는 데 사용됩니다. | 정해진 순서에 따라 특정 작업을 수행하는 데 사용됩니다. |
| 2 | 호출 관계 | 프로시저 내부에서 함수를 호출할 수 있습니다. | 함수 내부에서 프로시저를 호출할 수 없습니다. |
| 3 | DML 문 실행 | 함수 내부에서는 INSERT, UPDATE, DELETE 등 DML 문을 실행할 수 없습니다. | 프로시저 내부에서는 DML 문을 자유롭게 실행할 수 있습니다. |
| 4 | 쿼리 내 호출 | SELECT 쿼리 안에서 직접 호출할 수 있습니다. | 쿼리 안에서 호출할 수 없습니다. |
| 5 | 컴파일 방식 | 호출될 때마다 매번 컴파일된 후 실행됩니다. | 한 번만 컴파일되며, 이후에는 재컴파일 없이 여러 번 호출할 수 있습니다. |
| 6 | 반환값 | 계산된 값과 제어권을 호출한 코드에 함께 반환합니다. | 제어권만 반환하며 별도의 값은 반환하지 않습니다. |
| 7 | 예외 처리 | try-catch 블록을 지원하지 않습니다. | try-catch 블록을 활용한 예외 처리가 가능합니다. |
| 8 | SELECT 문 사용 | SELECT 문에서 함수 호출이 가능합니다. | SELECT 문에서는 프로시저를 호출할 수 없습니다. |
| 9 | 명시적 트랜잭션 처리 | 명시적인 트랜잭션 처리를 사용할 수 없습니다. | BEGIN TRANSACTION 등 명시적 트랜잭션 처리를 사용할 수 있습니다. |
정리: 어떤 것을 선택해야 할까?
간단히 말해, 값을 계산·반환하는 용도라면 함수를, 일련의 비즈니스 로직을 순차적으로 처리하는 용도라면 프로시저를 선택하는 것이 적합합니다. 예를 들어 세금 계산처럼 반복적으로 결과값이 필요한 경우에는 함수가 유용하고, 여러 테이블에 걸친 데이터 변경 작업이나 트랜잭션 제어가 필요한 배치 작업에는 프로시저가 더 적합합니다. 두 객체의 특성을 정확히 이해하고 상황에 맞게 활용하면 데이터베이스 애플리케이션의 성능과 유지보수성을 크게 높일 수 있습니다.