stored procedure란?
- RDBMS에 저장되고 사용되는 사용자가 정의한 프로시저입니다.
- 구체적인 하나의 테스크(task)를 수행합니다.
- 에러를 핸들링하거나 에러를 일으키는 등의 다양한 로직을 정의할 수 있습니다.
stored procedure 사용법
두 정수의 곱셈 결과를 가져오는 프로시저
delimiter $$
create procedure product(in a int, in b int, out result int)
begin
set result = a * b;
end
$$
delimiter ;
- in은 인자로 받는 파라미터를 의미하며 out은 아웃 파라미터를 의미합니다.( in은 생략 가능합니다. )
두 정수를 맞바꾸는 프로시저
delimiter $$
create procedure swap(inout a int, inout b int)
begin
set @temp = a;
set a = b;
set b = @temp;
end
$$
delimiter ;
set @a = 5, @b = 7;
call swap(@a, @b);
select @a, @b;
- inout은 마라미터를 받음과 동시에 아웃 파라미터로 사용하기 위해 사용하는 키워드입니다.
각 부서별 평균 연봉을 가져오는 프로시저 작성
delimiter $$
create procedure get_dept_avg_salary()
begin
select dept_id, avg(salary)
from employee
group by dept_id
end
$$
delimiter ;
call get_dept_avg_salary();
- select문을 위와같이 사용하면 return 키워드나 out 파라미터를 사용하지 않아도 결과를 return합니다.
사용자가 프로필 닉네임을 변경하면 이전 닉네임은 로그에 저장하고 새 닉네임으로 업데이트
delimiter $$
create procedure change_nickname(user_id int, new_nick varchar(3))
begin
insert into nickname_logs(
select id, nickname, now() from users where id = user_id
);
update users set nickname = new_nick where id = user_id;
end
$$
delimiter ;
stored procedure vs stored function
stored procedure 장.단점
장점
- 컴파일한 stored procedure를 재사용함으로써 컴파일된 쿼리에 대한 캐시를 적극적으로 활용하여 성능에 대한 이점을 얻을 수 있습니다. ( RDBMS 버전에 따라서 쿼리문은 똑같지만 대.소문자 사용여부에 따라서 다른 쿼리문으로 판단하여 새로 컴파일될 수 있습니다. )
- stored procedure의 로직 부분만 변경했다면 서버를 다시 빌드하여 새로 배포할 필요가 없습니다.
- 서버는 stored procedure 호출을 DB서버로 요청하면 되기 때문에 한 개 또는 여러 개의 SQL문을 사용함으로써 발생되는 네트워크 트래픽량을 줄일 수 있습니다.
- 같은 DB를 사용하는 여러 서비스에서 stored procedure를 사용하여 로직을 재사용할 수 있습니다.
- DB에 대한 직접적인 접근을 막고 비즈니스 로직 구현에 필요한 stored procedure를 제공함으로써 프로젝트 참여자로부터 민감한 데이터에 대한 직접적인 접근을 막을 수 있습니다.
단점
- 서버 코드와 DB stored procedure 코드 둘 다 신경써가면서 코딩하고 버전관리하고 코딩해야하기 때문에 유지 관리 보수 비용이 커집니다.
- DB 서버의 CPU 사용률이 높아져 DB 서버의 부하가 커질 수 있습니다. 그렇기 때문에 스케일 아웃이 비교적 쉬운 웹 서버 환경에서는 stored procedure을 사용하지 않고 stored procedure 로직을 웹 서버로 끌고와서 처리하는 것이 좋을 떄도 있습니다.
- stored procedure의 이름을 변경하면 모든 서버의 stored procedure 호출 코드를 변경해주어야 하는 번거로움이 있습니다.
- 데이터에 대한 직접적인 접근을 막고 stored procedure에 대한 접근만 허용했다면 보안적인 측면에서 이점이 있겠지만 개발 및 CS업무의 신속함이 떨어집니다.
- stored procedure는 프로그래밍 언어에 비해 가독성이 떨어지고 디버깅이 어렵습니다.
'데이터 베이스 > RDBMS' 카테고리의 다른 글
RDBMS의 트랜잭션( transaction )과 ACID란? (0) | 2023.02.04 |
---|---|
SQL에서 trigger란? (0) | 2023.02.04 |
SQL의 stored function이란? (0) | 2023.02.03 |
SQL의 order by, aggregate function, group by, having 사용법 ( select 최종 문법 정리 ) (0) | 2023.02.03 |
SQL join의 의미와 사용법 ( with MySQL ) (1) | 2023.02.01 |