반응형
Ant_U
DBA 개미
Ant_U
전체 방문자
오늘
어제
  • 분류 전체보기 (262)
    • AWS (3)
    • C# (1)
    • SQL (236)
      • MYSQL (186)
      • MSSQL (50)
    • 자격증 (20)
      • SQLD (12)
      • SQLP (8)

인기 글

최근 글

250x250
hELLO · Designed By 정상우.
Ant_U

DBA 개미

[MySQL] 서버 사이드 커서 문 사용 방법 및 예시
SQL/MYSQL

[MySQL] 서버 사이드 커서 문 사용 방법 및 예시

2025. 1. 4. 12:12
728x90
반응형



소개
MySQL에서 서버-사이드 커서(Restrictions on Server-Side Cursors)는 응용 프로그램과 데이터베이스 간 데이터를 효율적으로 처리할 수 있도록 도와주는 도구 중 하나입니다. 하지만 MySQL은 서버-사이드 커서 사용에 있어 특정한 제약사항이 있다는 점을 꼭 이해해야 합니다. 이러한 제약사항은 사용 중 예상치 못한 문제를 방지하며, 효율적인 코드를 작성하는 데 도움을 줄 수 있습니다. 이 포스트에서는 MySQL의 서버-사이드 커서 제약사항과 이를 이해하는 데 유용한 예시를 제공하겠습니다.

주요 제약사항

1. 커서가 읽기 전용으로 동작
   - MySQL의 커서는 "읽기 전용" 상태에서만 사용할 수 있습니다. 이는 커서를 사용하여 질의 결과를 수정하는 UPDATE나 DELETE 작업을 수행할 수 없다는 것을 의미합니다.

2. 단일 SELECT 문만 지원
   - MySQL에서 서버-사이드 커서는 단일 SELECT 문에 대해서만 작동합니다. 따라서, 복잡한 쿼리나 JOIN, UNION, 서브쿼리 등과 같은 다중 쿼리가 포함된 SELECT는 커서로 처리할 수 없습니다.

3. 주어진 커서의 순차 접근
   - 커서 데이터는 항상 순차적으로 접근해야 합니다. 이는 임의의 위치에서 데이터를 읽거나 다시 앞으로 되돌아가 읽는 기능("backward scrolling")이 불가능하다는 것을 의미합니다.

4. 스토어드 프로시저에서만 사용 가능
   - 커서는 오직 스토어드 프로시저 내에서만 사용할 수 있으며, 일반 SQL 클라이언트 세션에서는 사용할 수 없습니다.

5. 세션 스코프 커서
   - 커서는 세션 스코프에서만 유지되며, 세션 종료 시 해당 커서는 자동으로 제거됩니다. 이는 여러 세션에서 동일한 커서를 공유할 수 없다는 것을 뜻합니다.

사용 예시

아래는 MySQL에서 서버-사이드 커서를 사용하는 과정과 주요 제약사항을 설명하기 위한 간단한 예제입니다. 데이터베이스에 employees 테이블이 있다고 가정하겠습니다.

예제 테이블

CREATE TABLE employees (
    employee_id INT AUTO_INCREMENT PRIMARY KEY,
    first_name VARCHAR(50),
    last_name VARCHAR(50),
    salary DECIMAL(10, 2)
);

INSERT INTO employees (first_name, last_name, salary)
VALUES
('John', 'Doe', 5000),
('Jane', 'Smith', 6000),
('Alice', 'Johnson', 5500);




커서 사용 예제
아래는 스토어드 프로시저 내에서 커서를 사용해 employees 테이블의 데이터를 순차적으로 읽는 코드입니다.

DELIMITER $$

CREATE PROCEDURE GetEmployeeSalaries()
BEGIN
    DECLARE emp_name VARCHAR(100);
    DECLARE emp_salary DECIMAL(10, 2);
    DECLARE done INT DEFAULT 0;

    -- 커서 선언
    DECLARE emp_cursor CURSOR FOR SELECT CONCAT(first_name, ' ', last_name), salary FROM employees;

    -- 커서 종료 여부를 확인하기 위한 핸들러
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

    -- 커서 열기
    OPEN emp_cursor;

    read_loop: LOOP
        FETCH emp_cursor INTO emp_name, emp_salary;
        
        -- 데이터가 없으면 루프 종료
        IF done = 1 THEN
            LEAVE read_loop;
        END IF;

        -- 데이터를 처리 (예: 출력)
        SELECT emp_name AS EmployeeName, emp_salary AS Salary;
    END LOOP;

    -- 커서 닫기
    CLOSE emp_cursor;
END $$

DELIMITER ;


실행
위 프로시저를 실행하면 테이블의 데이터를 순차적으로 읽어서 출력합니다:

CALL GetEmployeeSalaries();



출력 결과:

+++
| EmployeeName  | Salary  |
+++
| John Doe      | 5000.00 |
| Jane Smith    | 6000.00 |
| Alice Johnson | 5500.00 |
+++




해당 제약사항 확인
1. 읽기 전용
   - 위 예에서는 SELECT로 데이터만 읽을 수 있고, UPDATE하는 것은 불가능합니다.
   
2. 순차 접근
   - 데이터를 항상 순차적으로 처리하며 앞뒤로 이동하거나 특정 레코드를 건너뛸 수 없습니다.
   
3. 스토어드 프로시저 내 사용
   - 위 코드를 일반 SQL 세션에서 실행할 수 없으며, 반드시 스토어드 프로시저 내에 정의된 형태로만 사용할 수 있습니다.

장단점 분석

장점:
- 커서는 데이터의 대량 처리를 위한 제어 구조를 제공합니다.
- 순차적 데이터 처리가 필요한 작업에 효과적입니다.

단점:
- MySQL 커서는 읽기 전용이며 제한적인 사용 사례를 가집니다.
- 일반 쿼리에 비해 성능이 다소 떨어질 수 있습니다.
- 임의의 데이터 접근이 불가능해 유연성이 제한됩니다.

결론
MySQL의 서버-사이드 커서는 데이터베이스 사용 패턴에서 매우 유용하지만, 그 제약사항을 철저히 이해하고 사용하는 것이 중요합니다. 필요 이상으로 사용하지 않고, 단순한 쿼리로 처리할 수 있다면 커서를 지양하는 것이 성능 최적화에 더 유리할 수 있습니다. 다만, 순차적으로 대량의 데이터를 읽어야 하는 경우에는 유일한 대안으로 사용될 수 있으니, 각 사용 사례에 맞게 접근하는 것이 좋습니다.

참고 자료
- [MySQL 8.0 서버-사이드 커서 공식 문서](https://dev.mysql.com/doc/refman/8.0/en/cursors.html)
- [MySQL 스토어드 프로시저 공식 가이드](https://dev.mysql.com/doc/refman/8.0/en/stored-routines-syntax.html)

728x90
반응형

'SQL > MYSQL' 카테고리의 다른 글

[MySQL] RESIGNAL 문 사용 방법 및 예시  (0) 2025.01.13
[MySQL] GET DIAGNOSTICS 문 사용 방법 및 예시  (0) 2025.01.07
[MySQL] DECLARE HANDLER 문 사용 방법 및 예시  (0) 2025.01.06
[MySQL] DECLARE CONDITION 문 사용 방법 및 예시  (0) 2025.01.06
[MySQL] Cursor Open 문 사용 방법 및 예시  (1) 2025.01.03
[MySQL] Cursor FETCH 문 사용 방법 및 예시  (0) 2024.12.31
[MySQL] Cursor DECLARE 문 사용 방법 및 예시시  (0) 2024.12.30
[MySQL] Cursor CLOSE 문 사용 방법 및 예시  (2) 2024.12.29
    'SQL/MYSQL' 카테고리의 다른 글
    • [MySQL] DECLARE HANDLER 문 사용 방법 및 예시
    • [MySQL] DECLARE CONDITION 문 사용 방법 및 예시
    • [MySQL] Cursor Open 문 사용 방법 및 예시
    • [MySQL] Cursor FETCH 문 사용 방법 및 예시
    Ant_U
    Ant_U

    티스토리툴바