본문 바로가기
DB

저장 프로시저 (Stored Procedure)

by sihyeong 2024. 2. 26.

저장 프로시저 (Stored Procedure)

저장 프로시저를 검색하면 아래와 같이 설명한다.

저장 프로시저 또는 스토어드 프로시저(stored procedure)는 일련의 쿼리를 
마치 하나의 함수처럼 실행하기 위한 쿼리의 집합이다. 

데이터베이스에 대한 일련의 작업을 정리한 절차를 
관계형 데이터베이스 관리 시스템에 저장한(지속성) 것으로, 
영구저장모듈(Persistent Storage Module)이라고도 불린다.

여러 쿼리를 하나로 묶은 것으로,

프로시저를 C의 함수, Java의 메서드의 SQL 버전이라고 이해하면 쉽다.

 

학습하기 전, 함수와 프로시저의 차이점 파악

이 개념을 처음 접한 경우 얼핏 보기엔 함수와 프로시저의 기능이 비슷하기 때문에 헷갈릴 수 있다.

그렇기에 함수(Function)와 프로시저(Procedure)의 차이점을 파악하는 것이 중요하다.

 

 

함수 vs 프로시저

함수 프로시저
대소문자를 변환하는 LOWER(), UPPER(), 문자열 길이를 반환하는 LENGTH()와 같이 입력값을 이용해 결과를 계산한다. 조건에 따라 특정 테이블에 데이터를 삽입, 조회, 수정 , 삭제  등 특정 작업을 순서대로 수행한다.
프로시저에 의해 호출될 수 있다. 프로시저는 함수에 의해 호출될 수 없다.
DML문은 함수 내에서 실행할 수 없다. DML문은 프로시저 내에서 실행될 수 있다.
SELECT, WHERE 등 쿼리 내에서 함수를 호출 할 수 있다. SELECT, WHERE 등 쿼리 내에서 함수를 호출 할 수 없다.
함수가 호출될 때마다 호출되기 전에 먼저 컴파일 된다. 프로시저는 한 번 컴파일되면 컴파일 하지 않고 여러번 호출할 수 있다.
함수는 반드시 반환값을 가져야 한다. 프로시저는 반환값을 가질 수도 있고 가지지 않을 수도 있다.
단독으로 문장 구성 불가 단독으로 문장 구성 가능

 

 

그래서 왜 프로시저를 사용해?

프로시저는 아래와 같은 장점 때문에 사용된다.

 

1. 속도 - 기본적으로 프로시저는 처음 실행될 때 컴파일되어 실행이 가능한 상태로 저장되어 있어 실행할 때 마다 실행 계획을 만들지 않기에 호출 속도가 빠르다. 

 

2. 보안 강화 - 쿼리가 네트워크를 통해 전송되지 않고 서버에 저장되어 있기 때문에 네트워크 트래픽을 가로채는 공격에 대해 비교적 안전하다.

 

그리고 권한이 없는 사용자가 특정 작업을 수행함에 있어 권한을 모두 주기보단 프로시저 실행권한만 제공하면 프로시저를 통해 권한이 없는 작업을 수행할 수 있어 필요 이상의 권한을 가지지 않도록 할 수 있다.

 

3. 네트워크 트래픽 감소 - 원하는 결과를 얻기 위해 쿼리가 길어지거나 여러 쿼리 결과의 조합을 필요로 한다면 네트워크 트래픽이 증가하게 된다. 하지만, 프로시저는 긴 쿼리 자체를 네트워크에 보내지 않고, 한번에 결과를 처리하기 때문에 네트워크 트래픽이 줄어든다.

 

 

단점

1. 유지보수의 어려움 - 프로시저가 앱의 어디에서 사용되는지 추적하기가 힘들고, 프로시저 내부의 로직이 어떻게 되는지 한눈에 파악하기 힘들어 개발한 인원과 유지보수하는 인원이 다르다면 지옥을 맛보게 될 것이다. 

 

2. 테스트의 어려움 - 프로시저 내부에 캡슐화 되어있어 테스트하기가 어렵다. 애플리케이션 코드가 긴밀하게 결합될수도 있고 문제가 발생한 경우 애플리케이션 코드와 데이터베이스 모두 접근하여 문제를 수정해야 하기 때문에 디버깅이 어렵고 시간이 많이 걸린다.

 

3. 형상관리의 어려움 - 프로시저는 DB 내부에 저장되기 때문에 git, svn과 같은 일반적인 형상관리 프로그램으로 관리되지 않기 때문에 여러 인원이 DB를 관리하게 된다면 형상관리가 되지 않아 내가 작성한 코드가 없어져 버리는 불상사가 발생할 가능성을 가지고 있다.

 

프로시저 부분의 코드를 DB IDE기능을 이용해 뽑아내서 형상관리 프로그램에 업로드하여 형상관리를 하자는 의견이 있었지만 촉박한 프로젝트 시간 때문에 묵살되었다.

 

위의 문제를 해결하려 찾아보니 DB 형상관리 툴이 있는것을 발견했지만, 시간상의 문제로 사용하진 못했다.

해당 프로젝트가 끝나고 여유가 생기면 학습할 예정이다.

 

 

 

 

'DB' 카테고리의 다른 글

[oracle] ORA-28001: the password has expired  (0) 2024.03.09
mybatis where 1=1  (0) 2024.01.09