MySQL 저장 함수란 무엇인가?
MySQL 저장 함수(Stored Function)는 단일 값을 반환하는 특수한 형태의 저장 프로그램(stored program)입니다. 저장 함수를 활용하면 SQL 문장이나 다른 저장 프로그램에서 반복적으로 사용되는 간단한 수식이나 비즈니스 규칙을 하나의 객체로 캡슐화하여 재사용할 수 있습니다.
또한 저장 함수는 표현식(expression)이 사용될 수 있는 모든 위치에서 SQL 문장 안에 직접 호출하여 사용할 수 있다는 점이 큰 장점입니다. 예를 들어 SELECT 문의 컬럼 목록, WHERE 절, ORDER BY 절 등 어디에서든 활용 가능합니다.
저장 프로시저와의 차이점
저장 함수는 저장 프로시저(Stored Procedure)와 유사해 보이지만 몇 가지 중요한 차이가 있습니다.
- 반환 값: 저장 함수는 반드시 하나의 값을 반환해야 하며, 이를 위해 RETURN 키워드를 사용합니다.
- 매개변수: 저장 함수의 매개변수는 저장 프로시저의 IN 매개변수와 동일한 역할을 합니다. 즉, 함수에는 입력 매개변수만 존재하며 OUT이나 INOUT 매개변수는 사용할 수 없습니다.
- 호출 방식: 저장 프로시저는 CALL 문으로 실행하지만, 저장 함수는 일반 내장 함수처럼 SQL 문장 안에서 직접 호출합니다.
저장 함수 생성 문법
저장 함수는 CREATE FUNCTION 문을 사용하여 생성합니다. 기본 문법은 다음과 같습니다.
CREATE
[DEFINER = { user | CURRENT_USER }]
FUNCTION sp_name ([func_parameter[,...]])
RETURNS type
[characteristic ...] routine_body
func_parameter:
param_name type
type:
유효한 MySQL 데이터 타입
characteristic:
COMMENT 'string'
| LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
routine_body:
유효한 SQL 루틴 문장
문법의 핵심 요소
함수는 입력 매개변수만 가지고 값을 반환하기 때문에, 함수 정의에 반드시 RETURNS 절을 포함하여 반환값의 데이터 타입을 명시해야 합니다. 또한 함수 본문(routine_body) 안에는 호출자에게 값을 돌려주기 위한 RETURN 문이 최소 한 개 이상 존재해야 합니다.
주요 특성(characteristic) 옵션도 살펴보면 좋습니다. DETERMINISTIC은 동일한 입력값에 대해 항상 동일한 결과를 반환한다는 의미이며, CONTAINS SQL, NO SQL, READS SQL DATA, MODIFIES SQL DATA는 함수가 데이터를 읽거나 수정하는지에 대한 정보를 서버에 알려줍니다.
간단한 예제
다음은 상품 가격에 10% 할인된 금액을 계산하여 반환하는 저장 함수의 예입니다.
DELIMITER //
CREATE FUNCTION calc_discount(price INT)
RETURNS INT
DETERMINISTIC
BEGIN
RETURN price * 0.9;
END //
DELIMITER ;
생성된 함수는 일반 함수처럼 호출할 수 있습니다.
SELECT calc_discount(10000); -- 결과: 9000
이처럼 저장 함수를 잘 활용하면 반복적인 계산 로직을 데이터베이스 계층에서 통합 관리할 수 있어 코드의 일관성과 유지보수성이 크게 향상됩니다.