[MySQL] Routine 이해하기 (Stored procedure, Function)

🔥Log·2023년 6월 11일
2

MySQL

목록 보기
7/16

☕ 시작


이번 글에서는 특정 상황에서 효과적으로 시스템의 한계점을 극복할 수 있는 유용한 기능인 MySQL Routine에 대해서 알아보도록 하겠다.



🧐 MySQL Routine이란?


일상에서도 '모닝 루틴', '운동 루틴'과 같이 루틴이라는 말을 많이 쓴다. 이 때 '루틴'은 동일한 행동을 꾸준히 반복하는 것을 의미하는데, MySQL 루틴도 이와 비슷한 의미를 갖는다고 할 수 있다.

MySQL 서버의 입장에서 이야기해본다면, 여러 쿼리문으로 구성된 로직을 MySQL서버에 저장하고 필요할 때마다 이를 호출해서 DB에 해당 쿼리문들을 실행하는 것을 MySQL 루틴이라고 할 수 있다.

MySQL 루틴은 Function과 Stored Procedure로 구성이 되어 있는데, 각각에 대해서는 아래에서 좀 더 자세히 다뤄보자.



🌠 MySQL Routine의 특징


  • MySQL Routine은 Stored ProcedureFunction으로 구성되어 있다.

  • MySQL Routine으로 기능을 구현하면, 서로 다른 언어의 백엔드 서버에서도 동일한 기능을 수행할 수 있다.

  • 로직이 DB에 저장되어 있다보니, DB만 안전하게 관리한다면 외부에 로직이 노출될 위험이 적다. 반대로, DB가 노출된다면 로직이 모두 노출될 위험도 있다.

  • 각 루틴의 실행기록이 MySQL서버에 자동적으로 기록이 된다.

  • 여러 건의 쿼리를 한번에 수행한 후, 결과를 반환할 수 있기 때문에 좀 더 나은 성능을 가질 수 있지만, 부하를 DB에서 모두 감당해야한다는 단점도 있다.

🤔 Stored procedure와 Function의 차이

  • Function은 반드시 return값이 있어야 한다.
  • Function안에서는 DML문(Create, Update, Delete)을 사용할 수 없다.
  • Stored Procedure는 Function안에서 호출될 수 없고, Function은 SELECT문에서만 호출될 수 있다.
  • Function은 어떠한 계산을 통해서 값을 변환할 때 주로 사용 된다.


💻 Routine의 사용법과 예제


1) Function의 생성

Function은 위에서 이야기했다시피 사용하는 데에 있어서 많은 제약이 걸려있다. 이는 의도적으로 Function을 Function답게 사용하도록 하기 위함이다.

개발을 하다보면, 시스템 내부에서만 간단히 사용하는 소소한(?) 기능들이 많이 있다. 예를 들어서, 특정 숫자를 받아서 %라는 단위를 붙여준다거나, 날짜 형식을 변환해준다거나.

이러한 기능을 구현할 때 사용하라고 만든 것이 Function이다. 그럼 예시로 한번 알아보자.

Function은 위와 같은 형태의 구문으로 생성할 수 있다. (보통 MySQL GUI툴을 사용하면, 좀 더 편리하게 Function을 생성할 수 있는 기능들을 제공하긴 한다.)

  1. Function 이름과 누가 생성하는지 명시한다.
  2. 매개 변수의 이름과 타입을 선언한다.
  3. 리턴 값의 타입을 선언한다.
  4. 실제로 수행할 로직을 BEGINEND사이에 작성한다.

2) Function의 사용

SELECT문으로 Function을 사용할 수 있다.
위에서 생성한 Function을 예시로 든다면, 아래와 같은 구문으로 Function을 실행할 수 있다.

SELECT `plusTwoNumbers`('1', '2')

Function을 실행해보면 결과도 정상적으로 반환되는 것을 확인할 수 있다.

3) Stored Procedure의 생성

  • 시작하기에 앞서, user라는 테이블에 위와 같은 데이터들이 저장되어 있다고 가정하도록 하겠다.

Stored Procedure는 여러 쿼리문의 집합체라고 생가하면 된다. 문론 단일 쿼리만 실행하는 것도 가능하고, 여러 조건문을 곁들여서 비지니스 로직 수준의 쿼리를 실행하는 것도 가능하다.

  1. Stored Procedure의 이름과 누가 생성하는지 명시한다.
  2. (매개변수가 있다면) 매개변수의 이름과 타입을 선언한다.
  3. 실제로 수행할 쿼리를 BEGINEND사이에 작성한다.

4) Stored Procedure의 실행

CALL문으로 Stored procedure는 사용할 수 있다.
위에서 생성한 Stored procedure로 예시를 든다면, 아래와 같은 구문으로 실행할 수 있다.

CALL `getUsers`('1'); # 이름만 조회하고 싶은 경우

또는

CALL `getUsers`('0'); # 모든 컬럼을 조회하고 싶은 경우

위에 대한 결과들은 아래와 같다.



☕ 마무리


MySQL Routine은 분명히 많은 장점을 갖고 있는 기능이라고 생각이 된다.
하지만 많은 단점 또한 갖고 있다. 협업하기 어렵고, 디버깅하기도 어렵고, IDE의 지원도 없고, 테스트하기 어렵고, 형상관리도 어렵다. ㅠㅠ
그래서 MySQL Routine으로 어떤 기능을 구현할 때, 여러 조건을 잘 생각해서 기능을 구현하는 게 좋을 것 같다.
다만 DB에 바로 붙어서 실행이 된다는 특징 덕분에 백엔드 서버에서 해줄 수 없는 강력한 역할을 수행할 수도 있을 것 같다는 생각도 든다.

다음 글에서는 실무에서 MySQL 루틴을 적용한 Best Practice를 소개할 기회가 있으면, 소개해보도록 하겠다. ㅎㅎ

그럼 이번 글은 마치도록 하겠다. 🙏



참고


0개의 댓글