10. stored function
유튜버 쉬운코드 님의 데이터베이스 강의를 정리한 내용
# Stored function
Stored function : 사용자가 정의한 함수
- DBMS에 저장되고 사용되는 함수
- SQL의 select, insert, update, delete statement에서 사용 가능
- 자주 사용되는 일반적인 쿼리를 모듈화시켜서 편리하게 사용하기 위함
- stored procedure과는 다른 것
stored function 특징
- 이외에도 loop를 돌면서 반복적인 작업 수행 가능
- case 키워드를 사용하여 값에 따라 분기 처리 가능
- 에러를 핸들링하거나 에러를 일으키는 등의 다양한 동작 정의 가능
delimiter $$
- 딜리미터는 기본적으로
;
의 역할 - 함수가 시작하는 부분의
;
와 함수 내부의 여러 쿼리에 대한;
와 혼동이 생기지 않게 하려고 임시적으로 사용하기 위함
|
|
- Option 자리는 MySQL의 옵션이 들어감
CONTAINS SQL
- 데이터를 읽거나 쓰는 명령이 포함되어있지 않음
- ex) 실행되지만 데이터를 읽거나 쓰는것을 하지 않는
@SET @x = 1
NO SQL
- 루틴에 SQL 문이 없음을 의미
READS SQL DATA
- 루틴에 데이터를 읽는 쿼리 (ex.
SELECT
)이 포함되어 있지만 쓰는 것은 없음
- 루틴에 데이터를 읽는 쿼리 (ex.
MODIFIES SQL DATA
- 루틴에 데이터를 쓸 수 있는 쿼리 (ex.
INSERT
,DELETE
)가 포함되어 있음
- 루틴에 데이터를 쓸 수 있는 쿼리 (ex.
DB.이름
이라고 하지 않으면 현재 설정되어 있는 DB에 함수가 생성됨- 혹시 까먹었니!? DB 목록은
SHOW DATABASES;
로 확인 가능해!
- 혹시 까먹었니!? DB 목록은
stored function 삭제하기
|
|
# 예제
ex) 임직원의 ID를 열 자리 정수로 랜덤하게 발급하고 싶음. ID의 맨 앞자리는 1로 고정됨
- 10자리 정수니까 10억
- MySQL 내장 함수
rand()
는 0과 1 사이의 값을 가져오는 것 rand() * 10억
을 하면 9자리 정수부를 가지는 값이 나올 것
ex) 위에서 정의한 id_generator()
를 이용하여 Employee 테이블에 임직원 정보 추가해보자
ex) 부서의 ID를 파라미터로 받으면, 해당 부서의 평균 연봉을 알려주는 함수 작성해보자
DECLARE
로 변수를 선언하지 않고 사용할 수 있음@
를 붙이면 변수로 인식함
ex) 위에서 정의한 dept_avg_salary(int)
함수로 부서 정보와 부서 평균 연봉을 함께 가져와보자
ex) 졸업 요건 중 하나인 토익 800 이상을 충족했는지를 알려주는 함수를 작성해보자
DECLARE
로 변수를 선언하지 않고 사용할 수 있음@
를 붙이면 변수로 인식함
ex) 위에서 정의한 toeic_pass_fail(int)
함수로 학생 정보와 함께 토익 점수 조건을 충족했는지 여부를 같이 가져와보자
# 파악하기
- 회사에 입사했는데, 등록된 stored function이 많이 있다고 하자.
- 이걸 파악하는 방법
|
|
ex) 예를 들어, 위에서 정의한 함수들을 확인해보려면?
# 언제 쓰면 좋을까?
Stored function은 언제 사용하면 좋을까?
- 내부적으로 개발팀에서 결정한 것이 있을 것.
- 지금부터는 쉬운코드님의 개인적인 생각
# three-tier architecture
Three-tier architecture
보통, 클라이언트-서버 모델은 three-tier architecture를 따른다.
Presentation tier
- 사용자에게 보여지는 부분을 담당하는 tier
- HTML, javascript, CSS, native app, desktop app
Logic tier
- 서비스와 관련된 기능, 정책 등등 비즈니스 로직을 담당하는 tier
- application tier, middle tier라고도 불림
- Java + Spring, Python + Django, etc..
Data tier
- 데이터를 저장하고 관리하고 제공하는 역할을 하는 tier
- MySQL, Oracle, SQL Server, PostgreSQL, MongoDB
# 그래서 언제 사용?
- util 함수로 쓰기에는 좋을 것 같음
- 비즈니스 로직을 stored function에 두는 것은 좋지 않을 것 같다.
- 비즈니스 로직은 Logic tier에서 담당하는 것인데, 비즈니스 로직 일부를 stored function에서 담당하게 되면, 비즈니스 로직의 일부가 Data tier에 위치하게 됨
- 서비스가 커질수록 관리 비용이 늘어남.
- Logic tier 봤다가~ Data tier 봤다가~