최근 데이터 이관 작업을 진행하면서 예외 처리에 대해 Function을 사용하여 효율적으로 트러블 슈팅을 진행했다.

트러블 슈팅 진행 과정에서 한가지 의문점이 생겼다.

Function(함수)과 Procedure(프로시저) 둘 다 비슷한 구조를 가졌지만 어떤 시점에서 어떤 객체를 사용해야지 더 적절한 선택인지에 대한 의문이 생겼다.

그에 따라서 Function과 Procedure의 차이점, 각 장단점, 그리고 적절한 상황 판별에 대해서 써본다.

 

1. Function과 Procedure의 기본 개념

Function (함수)

  • 정의: Function은 특정 작업을 수행한 후 반드시 하나의 값을 반환하는 SQL 객체다.
  • 주용도: 주로 값을 계산하거나 데이터를 변환하는데 사용된다. 이를 통해 반환값을 다른 SQL문 또는 PL/SQL 블록에서 재사용이 가능해진다.
  • 구조
CREATE OR REPLACE FUNCTION function_name 
(parameter_name datatype, ...) RETURN return_datatype IS
BEGIN
  -- 로직 작성
  RETURN return_value;
END function_name;

 

Procedure (프로시저)

  • 정의: Procedure는 작업을 수행하는 PL/SQL 객체로, 반환값이 없거나(명시적 반환값이 없다는 의미), 출력 매개변수를 통해 결과를 반환할 수 있다.
  • 주용도: 프로시저는 데이터 처리, 트랜잭션 관리, 대규모 작업을 처리하는데 적합하다.
  • 구조:
CREATE OR REPLACE PROCEDURE procedure_name 
(parameter_name datatype, ...) IS
BEGIN
  -- 로직 작성
END procedure_name;

 

2. 함수와 프로시저의 주요 차이점

항목 Function 함수 Procedure 프로시저
반환값 반드시 하나의 값을 반환 (RETUEN) 반환값이 없거나 OUT 파라미터를 통해 다중값을 반환할 수 있음
호출 방식 SQL문에 호출 가능
(SELECT, WHERE, ORDER BY 등)
SQL문에서 직접 호출 불가능
(PL/SQL 블록 내에서 호출 가능)
사용 목적 값을 계산하거나 변환하는 목적 트랜잭션 처리, 복잡한 로직 수행, 대규모 작업 처리
OUT 파라미터 사용 지원하지 않음 지원 (out 파라미터로 다중 값 반환 가능)
오버헤드 상대적으로 가벼움 작업에 따라 오버헤드가 클 수 있음

 

3. 함수의 장점과 단점

장점:

1. SQL 내에서 호출 가능: Function은 SELECT, INSERT, UPDATE, DELETE와 같은 SQL문 내에서 호출할 수 있기 때문에, SQL 쿼리 내에서 데이터를 변환하거나 계산할 때 매우 유용하다.

 

2. 재사용성: 데이터를 처리하고 그 결과를 반환하는 로직을 Function으로 작성하면 다양한 곳에서 호출하여 동일한 작업을 반복할 수 있다.

 

단점:
1. 복잡한 로직 처리 한계: Function은 복잡한 트랜잭션 작업보다는 주로 값을 반환하는 단순한 작업에 적합하다. 복잡한 로직이 필요한 경우에는 Procedure를 사용하는 것이 더 나을 수 있다.

2. DML 작업 제한: Function 내에서는 INSERT, UPDATE, DELETE와 같은 DML 작업을 사용할 수 있지만, SQL문 내에서 호출할 경우 제한이 있다. 특히, Function이 DML을 수행하는 경우 SQL문 내에서 호출이 불가능하다.

 

4. 프로시저의 장점과 단점

장점:
1. 복잡한 로직 처리: Procedure는 복잡한 트랜잭션 작업이나 대규모 데이터 처리를 효과적으로 처리할 수 있다. 여러 개의 OUT 파라미터를 사용하여 다수의 값을 반환할 수 있다.


2. 유연성: Procedure는 다양한 형태의 작업을 처리할 수 있으며, 트랜잭션 관리, 오류 처리, 로깅 등의 기능을 포함할 수 있다.


단점:
1. SQL에서 호출 불가: Procedure는 Function과 달리 SQL문 내에서 직접 호출할 수 없습니다. 반드시 PL/SQL 블록 내에서 호출해야한다.


2. 반환값의 제한: Procedure는 명시적인 반환값이 없으며, OUT 파라미터를 사용하여 결과를 반환할 수 있지만, Function처럼 하나의 값을 바로 반환할 수는 없다.

 

5. 사용 상황에 따른 선택 방법

Function을 사용하는 상황

  • 데이터 변환 또는 계산이 필요한 경우: 예를 들어, 특정 데이터 필드를 계산하거나 형식을 변환해야 할 때 Function을 사용하면 유용
  • SQL 문 내에서 호출이 필요한 경우: SELECT, WHERE, ORDER BY 절에서 값을 반환해야 하는 경우 Function이 적합
  • 단일 값 반환이 필요한 경우: 특정 작업의 결과로 단일 값을 반환해야 할 때는 Function이 더 적합

 

Procedure를 사용하는 상황

  • 복잡한 비즈니스 로직이 필요한 경우: 여러 가지 데이터를 처리하고, 트랜잭션을 관리하거나, 여러 값이 반환되는 경우 Procedure를 사용하는 것이 적합
  • 대규모 데이터 처리 및 트랜잭션 관리가 필요한 경우: Procedure는 여러 단계의 데이터 처리와 트랜잭션 관리를 쉽게 처리 가능
  • 출력 값이 다수인 경우: 여러 값을 반환해야 할 때는 OUT 파라미터를 사용하여 Procedure로 처리하는 것이 효율적

 

6. 결론

Oracle에서 Function과 Procedure는 각각의 장점과 사용 목적이 분명한 두 가지 PL/SQL 객체다.

Function은 값을 반환하거나 변환 작업을 수행하는 데 최적화되어 있고, SQL문 오느내에서 호출할 수 있다는 장점이 있다.

반면, Procedure는 복잡한 로직 처리와 트랜잭션 관리를 할 수 있으며, 다수의 값을 반환할 수 있는 유연성을 제공한다.

따라서 단순한 값 반환이나 SQL문에서의 호출이 필요하다면 Function을, 복잡한 로직 처리나 다양한 값을 반환해야 하는 경우에는 Procedure를 사용하는 것이 적합하다. 상황에 맞는 선택을 통해 성능을 최적화하고, 유지보수성을 높일 수 있다.

 

막상 공부하며 정리해보니, 디테일한 부분은 내가 알고 있는 지식이 틀린 경우가 많다.

실패한 경험이 오래가듯이 틀렸던 기억을 정정하면 더욱 오래 남는 것 같다.


 

반응형