DB/MySQL

프로시저

baek-dev 2025. 4. 6. 13:50

📌 프로시저(Stored Procedure)란?

 

프로시저(Stored Procedure)SQL 문을 저장해 두고 필요할 때 호출하여 실행할 수 있는 데이터베이스 객체임.

 

프로시저의 주요 특징

재사용 가능 → 동일한 SQL 작업을 반복 실행할 때 유용

성능 최적화 → 서버에서 실행되므로 네트워크 트래픽 감소

비즈니스 로직 캡슐화 → SQL 로직을 하나의 프로시저로 묶어 관리 가능

입력(매개변수) & 출력(결과값) 가능IN, OUT, INOUT 파라미터 지원

 

📌 기본적인 프로시저 호출 흐름

클라이언트 → CALL 프로시저명() → MySQL에서 SQL 실행 → 결과 반환

 

 


1️⃣ 프로시저의 기본 문법

DELIMITER $$  -- 구분자 변경 (MySQL에서 여러 문장을 실행하기 위해 필요)
CREATE PROCEDURE 프로시저명()
BEGIN
    -- SQL 실행문
END$$
DELIMITER ;  -- 기본 구분자로 복귀

 

📌 프로시저 호출

CALL 프로시저명();

 

📌 프로시저 삭제

DROP PROCEDURE IF EXISTS 프로시저명;

 

 


2️⃣ 간단한 프로시저 예제

 

기본적인 프로시저 생성 및 호출

DELIMITER $$
CREATE PROCEDURE GetUsers()
BEGIN
    SELECT * FROM users;
END$$
DELIMITER ;

 

📌 실행

CALL GetUsers();

 

결과

+----+---------+------------+
| id | name    | email      |
+----+---------+------------+
| 1  | Alice   | alice@test.com |
| 2  | Bob     | bob@test.com   |
+----+---------+------------+

 

 


3️⃣ 매개변수(Parameter) 사용하기

 

프로시저에서 매개변수를 활용할 수 있음.

 

✅ 1. IN 매개변수 (입력)

 

📌 특정 사용자 조회

DELIMITER $$
CREATE PROCEDURE GetUserById(IN userId INT)
BEGIN
    SELECT * FROM users WHERE id = userId;
END$$
DELIMITER ;

 

📌 실행

CALL GetUserById(1);

 

 


✅ 2. OUT 매개변수 (출력)

 

📌 사용자 수를 반환하는 프로시저

DELIMITER $$
CREATE PROCEDURE GetUserCount(OUT totalUsers INT)
BEGIN
    SELECT COUNT(*) INTO totalUsers FROM users;
END$$
DELIMITER ;

 

📌 실행

CALL GetUserCount(@count);
SELECT @count;  -- @count 변수에 저장된 결과 확인

 

 


✅ 3. INOUT 매개변수 (입력 & 출력)

 

📌 입력된 값에 10을 더해 반환하는 프로시저

DELIMITER $$
CREATE PROCEDURE AddTen(INOUT num INT)
BEGIN
    SET num = num + 10;
END$$
DELIMITER ;

 

📌 실행

SET @value = 5;
CALL AddTen(@value);
SELECT @value;  -- 15 출력

 

 


4️⃣ 프로시저에서 제어문 사용하기

 

✅ 1. IF 문 사용

 

📌 사용자 존재 여부 확인

DELIMITER $$
CREATE PROCEDURE CheckUserExists(IN userEmail VARCHAR(255), OUT existsFlag BOOLEAN)
BEGIN
    DECLARE count INT;
    SELECT COUNT(*) INTO count FROM users WHERE email = userEmail;
    
    IF count > 0 THEN
        SET existsFlag = TRUE;
    ELSE
        SET existsFlag = FALSE;
    END IF;
END$$
DELIMITER ;

 

📌 실행

CALL CheckUserExists('alice@test.com', @result);
SELECT @result;  -- 1 (TRUE) 또는 0 (FALSE)

 

 


✅ 2. LOOP 문 사용

 

📌 1부터 N까지 숫자를 출력하는 프로시저

DELIMITER $$
CREATE PROCEDURE PrintNumbers(IN N INT)
BEGIN
    DECLARE i INT DEFAULT 1;
    
    my_loop: LOOP
        IF i > N THEN
            LEAVE my_loop;
        END IF;
        
        SELECT i;
        SET i = i + 1;
    END LOOP;
END$$
DELIMITER ;

 

📌 실행

CALL PrintNumbers(5);

 

결과

+----+
| i  |
+----+
| 1  |
| 2  |
| 3  |
| 4  |
| 5  |
+----+

 

 


5️⃣ 트랜잭션을 활용한 프로시저

 

트랜잭션(COMMIT, ROLLBACK)을 사용하여 안전한 데이터 처리

DELIMITER $$
CREATE PROCEDURE TransferMoney(IN senderId INT, IN receiverId INT, IN amount DECIMAL(10,2))
BEGIN
    DECLARE senderBalance DECIMAL(10,2);
    
    -- 1. 현재 잔액 확인
    SELECT balance INTO senderBalance FROM accounts WHERE id = senderId;
    
    -- 2. 잔액 부족 여부 확인
    IF senderBalance < amount THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = '잔액 부족';
    ELSE
        -- 트랜잭션 시작
        START TRANSACTION;
        
        -- 3. 송금자 잔액 차감
        UPDATE accounts SET balance = balance - amount WHERE id = senderId;
        
        -- 4. 수신자 잔액 증가
        UPDATE accounts SET balance = balance + amount WHERE id = receiverId;
        
        -- 5. 트랜잭션 완료
        COMMIT;
    END IF;
END$$
DELIMITER ;

 

📌 실행

CALL TransferMoney(1, 2, 500);

트랜잭션을 사용하면 오류 발생 시 데이터 변경이 롤백됨.

 


6️⃣ 프로시저의 장점과 단점

장점 단점
반복적인 SQL 작업을 줄이고 코드 재사용 가능 복잡한 로직을 프로시저에 넣으면 유지보수 어려움
실행 속도 빠름 (서버에서 직접 실행) 디버깅이 어렵고, 개발 환경에서 코드 관리가 불편함
보안 강화 (GRANT 권한 설정 가능) 많은 프로시저를 만들면 데이터베이스 복잡도가 증가
네트워크 트래픽 감소 (클라이언트에서 여러 SQL을 실행하는 대신 하나의 프로시저 호출) 버전 관리가 어렵고, 코드 변경 시 관리 부담 증가

 

정리하면:

복잡한 로직이 많을 경우비즈니스 로직을 애플리케이션 코드에서 처리하는 것이 더 좋을 수도 있음.

단순한 반복 작업(SQL 실행이 많을 경우)프로시저를 활용하면 성능 최적화 가능.

 


📌 결론

 

MySQL 프로시저란?

반복적으로 실행되는 SQL 문을 저장하여, 필요할 때 호출하는 기능.

매개변수 (IN, OUT, INOUT)를 지원하여 유연한 데이터 처리 가능.

트랜잭션(COMMIT, ROLLBACK)을 지원하여 안전한 데이터 변경 가능.

 

언제 사용할까?

동일한 SQL 연산이 반복적으로 실행될 때 (CRUD 작업 최적화)

데이터 무결성을 유지하면서 여러 테이블을 조작할 때 (트랜잭션 관리)

네트워크 트래픽을 줄이고 성능을 개선할 때 (서버에서 직접 실행)

 

 

 

 

출처 : ChatGPT

'DB > MySQL' 카테고리의 다른 글

jOOQ  (1) 2025.04.16
MySQL 리플리케이션  (0) 2025.04.05
[SQL] SQL Dialects (SQL 방언)  (0) 2025.02.21
[SQL] CHAR, VARCHAR  (1) 2024.12.18
[SQL] 트랜잭션  (0) 2024.12.17