본문 바로가기
[파이썬]/데이터베이스

[MariaDB] 함수의 개념과 생성 및 호출

by sung min_Kim 2023. 11. 27.
함수


코드의 재사용 단위


· 함수란


 함수는 특정 작업을 수행하는 코드의 집합으로, 입력을 받아 처리하고 결과를 출력하는 구조를 가지며, 일련의 코드를 하나의 이름 아래에 묶어둔 것이다.
 이렇게 하면 그 작업을 여러 번 반복해야 할 때마다 코드 전체를 다시 쓰는 대신, 그 이름만 불러서 사용할 수 있다. (코드의 재사용)
 이를 통해 함수는 코드의 중복을 줄이고 가독성과 유지보수성을 향상시킨다.

 


· 함수를 사용하는 이유는 ?

 

 

  1. 재사용성 : 함수를 사용하면 특정 로직을 한 번만 작성하고, 필요할 때마다 해당 함수를 호출하여 해당 로직을 재사용할 수 있다. 

  2. 효율성 : 함수는 데이터베이스 서버에서 직접 실행되므로, 클라이언트와 서버 간의 데이터 전송량울 줄이고 처리 속도를 향상시킬 수 있다.

  3. 캡슐화 : 캡슐화는 객체 지향 프로그래밍의 핵심 원칙 중 하나로, 데이터와 그 데이터를 처리하는 함수(또는 메소드)를 하나의 '객체'라는 단위로 묶는 것을 말한다. 객체의 사용자는 객체의 내부 구조나 구현 방법을 몰라도, 객체의 기능을 사용할 수 있다. 이를 통해 코드의 복잡성을 감추고, 사용자가 코드를 더 쉽게 이해하고 사용할 수 있도록 한다.

  4. 보안 : 함수를 통해 데이터 접근을 제어하면, 객체의 내부 데이터는 외부에서 직접 접근할 수 없도록 제한하고, 오직 함수 또는 메소드를 통해서만 접근할 수 있게 한다. 따라서 사용자가 직접 데이터를 조작하는 것을 방지하고 데이터의 무결성을 보장할 수 있다.

 


· 함수 생성 방식

 

Delimiter //
Create Function 함수명(매개변수 매개변수type)
Returns 리턴type
Begin
     Declare result 리턴type
     
     -- <If 문의 경우>
     If 조건 Then
        Set result = '값';
     Else
        Set result = '값';
     End If;
     
     -- <Select 문의 경우>
     Select 컬럼 Into result
     From 테이블
     Where 제한 조건;

     Return result;
End //
Delimiter ;

 

  • Delimiter // : 이 부분은 기본적인 구분자인 세미콜론(;)을 ' // '로 변경하라는 명령이다. 기본적으로 SQL에서는 세미콜론을 문장의 끝으로 인식한다. 그러나 함수나 프로시저를 생성하는 등의 복잡한 쿼리를 작성할 때, 혹은 여러 개의 SQL 구문이 포함된 경우 SQL 인터프리터는 세미콜론을 만나면 즉시 그 이전의 구문을 실행하려고 시도하여, 함수나 프로시저의 전체 정의를 한 번에 데이터베이스에 전달할 수 없게 된다. 따라서 이 문제를 해결하기 위해 Delimiter 명령어를 사용하여 임시로 구분자(;)를 다른 문자(//)로 변경함으로써, 전체 쿼리를 데이터베이스에 전달할 수 있도록 한다.


  • Create Function 함수명(매개변수 매개변수타입) : 함수를 생성하는 부분이다. 뒤에는 사용할 함수명과 함수에 전달될 입력값인 매개변수가 위치한다. 


  • Returns 리턴type : 함수 출력값의 데이터 타입을 정의하는 부분이다.


  • Begin ... End // : 함수의 본문을 나타내는 부분이다. 이 내부에 함수가 수행될 로직이 위치한다.


  • Declare result 리턴type; : 리턴 값을 저장할 'result'라는 이름의 변수를 선언하고, 데이터 타입을 이 전에 정의한 리턴type으로 지정한다


  • If 문 : 함수에서 수행할 로직을 나타내는 부분이다. If 문을 사용하여 조건에 따른 로직을 수행한다. "Set result = '값'" 은 If 문의 조건이 참인 경우와 거짓인 경우에 반환할 값을 변수(result)에 할당하고, 다른 SQL의 결과를 변수에 저장하는 등 다양한 용도로 활용할 수 있다. 단, Set 문을 사용할 때에는 해당 변수가 Declare 문을 통해 먼저 선언되어 있어야 하며, 데이터 타입이 일치해야 한다.


  • Select 문 : 테이블의 컬럼을 조회하는 Select 문은 조회한 결과를 함수 내부의 변수(result)에 저장하기 위해 'Into' 키워드를 사용한다.


  • Return result; : 함수의 결과를 반환하는 부분이다. 여기서 'result'는 위에서 선언한 변수이다.


  • Delimiter ; : 함수 정의가 끝났으므로, 기본 구분자를 ';'로 다시 변경하는 명령이다.


 실제로 함수를 작성할 때에는 실제 사용하려는 함수 로직에 맞게 적절한 이름이나 값으로 대체하여 사용하여야 한다.

 


· 함수를 생성할 때의 주의사항

 

  • 함수 이름 : 이미 존재하는 함수의 이름을 사용하면, 기존 함수를 덮어쓰거나 호출할 때 혼란을 줄 수 있으므로, 동일한 이름의 함수명은 사용하지 않도록 주의해야 한다.

  • 매개변수 : 함수에 전달되는 매개변수의 순서와 데이터 타입이 함수 내부 로직과 일치하지 않으면 예상치 못한 결과나 에러를 발생시킬 수 있으므로, 매개변수의 순서나 데이터 타입에 주의해야 한다.

  • Delimiter : 함수를 생성하거나 수정할 때는 Delimiter을 변경해야 한다. 이는 함수 본문 내부에서 ' ; '을 사용하기 때문인데, Delimiter을 변경하지 않으면 함수 본문이 제대로 인식되지 않을 수 있다. 함수를 생성한 후에는 다시 원래 Delimiter으로 변경해 주어야 한다.

· 예시

 

<예제_함수 생성> 상품분류명을 추출하는 함수 생성하기

함수 생성_1

 위의 상품분류명에 해당하는 Select 문 내부의 서브쿼리에 대한 함수를 생성하려고 한다. 함수를 생성하기 위한 새 쿼리 탭을 열어주도록 하자.

함수 생성_2

 새 쿼리 탭에서 함수 생성을 위한 작업을 수행한다. 함수 전체를 정의하기 위해 'Delimiter' 명령어를 사용하여 기본 구분자인 세미콜론을 ' // ' 로 바꿔주었다. 

 'Create Function' 명령어를 통해 함수(udfGetLprodNm)를 생성하고, 매개변수명(paramGu)과 매개변수 타입(VARCHAR(10))을 지정하였다. 이 매개변수는 함수에 전달될 입력값을 담고 있다.

 'Returns' 키워드를 통해 리턴 타입을 지정하고, 본문( Begin ~ End //)에는 함수로 만들고자 하는 로직을 가져온다.
 
 'Declare' 명령어를 통해 변수(result)를 선언하고 데이터 타입을 리턴 타입과 일치시켜 준다. 선언된 해당 변수는 리턴 즉, 매개변수에 전달될 값을 저장한다.

 함수로 만들고자 하는 상품분류명(lprod_nm)에 대해 'Select lprod_nm Into result' 구문을 작성하고, Where 절의 제한 조건인 'lprod_gu = paramGu'을 통해 조회한 'lprod_nm' 컬럼의 값을 'result'변수에 저장한다.

 함수의 전체 동작이 끝난 이후에는 다시 기본 구분자인 세미콜론으로 바꾸어 준다.

함수 생성_3

 위 과정을 거쳐 상품분류명을 추출하는 함수인 ' udfGetLprodNm' 함수를 생성하였다. 새로고침 한 이후 왼쪽 테이블을 보면 해당 함수가 생성된 것을 볼 수 있다.

 다시 본 쿼리문으로 돌아와 생성한 함수를 호출해 보도록 하자.

함수 호출

 생성한 ' udfGetLprodNm' 함수를 호출하면 'Return result;' 구문을 통해 'result' 변수에 저장된 값이 반환되어 함수의 매개변수에 전달되고, 이 매개변수 'paramGu'는 함수의 입력 값으로 사용된다. 따라서, 매개변수인 'paramGu'에 저장된 상품분류명(lprod_gu)이 반환되는 것을 볼 수 있다.