[MySQL] MySQL 저장 프로시저 - 소개
l Version : MySQL
MySQL 저장 프로시저와 장, 단점에 대해서 알아본다.
아래 스크립트는 테이블에 있는 데이터를 조회한다.
SELECT customer_id, first_name, last_name, FROM customer ORDER BY first_name; |
MySQL Workbench 또는 mysql 셸을 사용하여 MySQL Server에 쿼리를 실행하면 MySQL은 쿼리를 처리하고 결과 집합을 반환한다. 나중에 실행하기 위해 이러한 쿼리를 데이터베이스 서버에 저장하기 위해 저장 프로시저를 사용할 수 있다.
아래 스크립트에서 CREATE PROCEDURE 문은 위의 쿼리를 래핑하여 새 저장 프로시저를 만든다.
DELIMITER $$ CREATE PROCEDURE GetCustomers() BEGIN SELECT customer_id, first_name, last_name, FROM customer ORDER BY first_name; END$$ DELIMITER ; |
정의에 따르면 저장 프로시저는 MySQL 서버 내에 저장된 선언적 SQL 문의 세그먼트이다. 이 예에서는 GetCustomers()라는 이름으로 생성하였다. 저장프로시저의 호출은 CALL 명령문을 사용한다.
CALL GetCustomers(); |
저장 프로시저를 호출하면 동일한 결과가 나타난다. 저장 프로시저를 처음 호출하면 MySQL은 다음을 수행한다.
l 첫째, 데이터베이스 카탈로그에서 이름으로 저장 프로시저를 찾는다.
l 둘째, 저장 프로시저의 코드를 컴파일 한다.
l 셋째, 컴파일된 저장 프로시저를 캐시라고 알려진 메모리 영역에 배치한다.
l 넷째, 저장 프로시저를 실행한다.
동일한 세션에서 동일한 저장 프로시저를 다시 호출하면 MySQL은 다시 컴파일할 필요 없이 캐시에서 저장 프로시저를 실행한다.
저장 프로시저에는 매개 변수가 있어서 값을 전달하고 결과를 다시 가져올 수 있다. 예를 들어 국가 및 도시별로 고객을 반환하는 저장 프로시저가 있을 수 있다. 이 경우 국가와 도시는 저장 프로시저의 매개변수이다. 저장 프로시저에는 IF, CASE, LOOP와 같은 제어문이 포함될 수 있다. 저장 프로시저는 다른 저장 프로시저나 저장 함수를 호출할 수 있으므로 코드를 보다 효과적으로 구성할 수 있다.
저장 프로시저의 장점은 다음과 같다.
l 네트워크 트래픽 감소 : 저장 프로시저는 애플리케이션과 MySQL 서버간의 네트워크 트래픽을 줄이는 데 도움이 된다. 왜냐하면 애플리케이션은 긴 SQL문을 여러 개 보내는 대신, 저장 프로시저의 이름과 매개변수만 보내면 되기 때문이다.
l 데이터베이스에 비즈니스 논리 중앙 집중화 : 저장 프로시저를 사용하여 여러 애플리케이션에서 재사용할 수 있는 비즈니스 논리를 구현할 수 있다. 저장 프로시저는 많은 애플리케이션에서 동일한 논리를 복제하는 노력을 줄이고 데이터베이스의 일관성을 높이는데 도움이 된다.
l 데이터베이스 보안 강화 : 데이터베이스 관리자는 기본 테이블에 대한 권한을 부여하지 않고 특정 저장 프로시저에만 액세스하는 애플리케이션에 적절한 권한을 부여할 수 있다.
저장 프로시저의 단점은 다음과 같다.
l 리소스 사용량 : 저장 프로시저를 많이 사용하는 모든 연결의 메모리 사용이 크게 늘어난다. 게다가 저장 프로시저에서 많은 수의 논리적 작업을 과도하게 사용하면 MySQL이 논리 작업에 적합하게 설계되지 않았기 때문에 CPU 사용량이 증가한다.
l 문제 해결 : 저장 프로시저를 디버깅하기가 어렵다. MySQL은 다른 데이터베이스 제품과 다르게 저장 프로시저를 디버깅하는 기능을 제공하지 않는다.
l 유지 관리 : 저장 프로시저를 개발하고 유지 관리하려면 모든 응용 프로그램 개발자가 보유하지 않은 전문 기술이 필요한 경우가 많다. 이로 인해 애플리케이션 개발 및 유지 관리 모두에 문제가 발생할 수 있다.
2023-10-23 / Sungwook Kang / http://sungwookkang.com
MySQL, Stored Procedure, 저장프로시저
'MySQL, MariaDB' 카테고리의 다른 글
[MySQL] MySQL에서 SSL 인증서 사용하기 (0) | 2023.11.09 |
---|---|
[MySQL] [InnoDB] Failed to create check sector file, errno:13 Please confirm O_DIRECT is supported 오류 및 해결 (0) | 2023.11.02 |
[MySQL] MySQL에서 기본키로 UUID를 선택했을 때의 장단점 및 특징 (0) | 2023.10.20 |
[MySQL] MySQL PXC (Percona XtraDB Cluster) 5.7에서 8.0 업그레이드시 timeout 문제 및 해결 방법 (0) | 2023.10.19 |
[MySQL] MySQL의 다양한 주석(comment) 방법 살펴보기 (0) | 2023.10.18 |