SQL - 저장 프로시저: 초보자 가이드
안녕하세요, 미래의 SQL 마법사 여러분! 오늘 우리는 저장 프로시저의 세상으로 흥미로운 여정을 떠납니다. 프로그래밍에 새로운 사람이라면 걱정하지 마세요 - 나는 당신의 친절한 안내자가 되어 단계별로 설명해줄 거예요. 커피 한 잔을 손에 들고, 편안하게 앉아 뛰어들어 보세요!
SQL 저장 프로시저는 무엇인가요?
마법의 책을 가지고 있다고 상상해 보세요. 동일한 마법을 반복적으로 부르는 대신, 그것을 한 번 작성하고 필요할 때 그 이름만 말하면 됩니다. 그것이 SQL에서 저장 프로시저의 기본 개념입니다!
저장 프로시저는 미리 작성된 SQL 문들의 모음으로, 저장하고 재사용할 수 있습니다. 데이터베이스에서 자신만의 커스텀 명령어를 만드는 것과 같습니다. 멋지죠?
간단한 예제를 보겠습니다:
DELIMITER //
CREATE PROCEDURE GetAllCustomers()
BEGIN
SELECT * FROM Customers;
END //
DELIMITER ;
이 작업의 내용은 다음과 같습니다:
-
DELIMITER //
를 사용하여 임시로 델리미터를 변경합니다. -
GetAllCustomers
라는 프로시저를 생성합니다. -
BEGIN
과END
사이에 SQL 문을 작성합니다. - 델리미터를 다시 원래 상태로 변경하기 위해
DELIMITER ;
를 사용합니다.
이 프로시저를 사용하려면 다음과 같이 작성합니다:
CALL GetAllCustomers();
그러면! 첫 번째 저장 프로시저를 실행한 것입니다. 이렇게 간단합니다!
프로시저 생성
이제 우리는 발을 담그어보았으니, 조금 더 복잡한 프로시저를 만들어보겠습니다. 고객이 주문한 횟수를 계산하는 프로시저를 만들겠습니다.
DELIMITER //
CREATE PROCEDURE CountCustomerOrders(IN customerID INT, OUT orderCount INT)
BEGIN
SELECT COUNT(*) INTO orderCount
FROM Orders
WHERE CustomerID = customerID;
END //
DELIMITER ;
이를 단계별로 설명하겠습니다:
-
CountCustomerOrders
라는 프로시저를 생성합니다. - 두 개의 매개변수를 받습니다:
customerID
(입력)과orderCount
(출력). - 주어진 고객의 주문 수를 계산하고
orderCount
에 저장합니다.
이 프로시저를 사용하려면 다음과 같이 작성합니다:
CALL CountCustomerOrders(1, @count);
SELECT @count;
이렇게 하면 고객 ID 1의 주문 수를 계산하고 @count
변수에 저장합니다.
저장 프로시저 매개변수 유형
우리의 마법의 SQL 세계에서, 프로시저는 세 가지 유형의 매개변수를 가질 수 있습니다:
매개변수 유형 | 설명 |
---|---|
IN | 입력 매개변수 (기본) |
OUT | 출력 매개변수 |
INOUT | 입력 및 출력에 사용할 수 있음 |
이 각각의 매개변수 유형을 예제와 함께 탐구해보겠습니다!
IN 매개변수를 사용한 프로시저
우리는 CountCustomerOrders
프로시저에서 IN 매개변수를 이미 본 적이 있습니다. 다른 예제를 보겠습니다:
DELIMITER //
CREATE PROCEDURE GetCustomersByCountry(IN countryName VARCHAR(50))
BEGIN
SELECT * FROM Customers
WHERE Country = countryName;
END //
DELIMITER ;
이를 사용하려면 다음과 같이 합니다:
CALL GetCustomersByCountry('USA');
이렇게 하면 미국의 모든 고객을 반환합니다. 간단하고 효과적입니다!
OUT 매개변수를 사용한 프로시저
우리는 이것도 이미 본 적이 있습니다. 다른 예제를 만들어보겠습니다:
DELIMITER //
CREATE PROCEDURE GetTotalOrderValue(IN orderID INT, OUT totalValue DECIMAL(10,2))
BEGIN
SELECT SUM(Quantity * UnitPrice)
INTO totalValue
FROM OrderDetails
WHERE OrderID = orderID;
END //
DELIMITER ;
이를 사용하려면 다음과 같이 합니다:
CALL GetTotalOrderValue(10248, @total);
SELECT @total;
이렇게 하면 주문 10248의 총 가치를 계산하고 @total
에 저장합니다.
INOUT 매개변수를 사용한 프로시저
INOUT 매개변수는 양방향 도로입니다. 데이터를 가져오고 내보낼 수 있습니다. 예제를 보겠습니다:
DELIMITER //
CREATE PROCEDURE DoubleNumber(INOUT num INT)
BEGIN
SET num = num * 2;
END //
DELIMITER ;
이를 사용하려면 다음과 같이 합니다:
SET @myNumber = 5;
CALL DoubleNumber(@myNumber);
SELECT @myNumber;
이렇게 하면 5를 두 배로 만들어 @myNumber
에 저장합니다.
저장 프로시저의 장점
이제 우리는 프로시저를 만들고 사용하는 방법을 배웠으니, "왜 이리 힘을 기울여야 하나요?"라는 의문이 드릴 수도 있습니다. 그런데, 우리의 호기심 많은 친구여, 몇 가지 설득력 있는 이유가 있습니다:
-
성능 향상: 저장 프로시저는 한 번 컴파일되고 실행 형식으로 저장되므로, 개별 SQL 문보다 빠르게 실행됩니다.
-
네트워크 트래픽 감소: 여러 개의 SQL 문을 보내는 대신, 프로시저 이름과 매개변수만 보냅니다.
-
재사용성: 한 번 작성하고 여러 번 사용할 수 있습니다. 데이터베이스에 대한 미리 준비된 요리와 같습니다!
-
보안: 사용자에게 저장 프로시저에 접근할 수 있는 권한을 주면, 하위 테이블에 대한 직접 접근을 허용하지 않아도 됩니다.
-
유지보수성: 중앙 집중식 비즈니스 로직으로 인해 업데이트와 유지보수가 더 쉬워집니다.
저장 프로시저의 단점
하지만, 프로시저에 대해 지나치게 열광하기 전에 몇 가지 유의할 점이 있습니다:
-
디버깅이 어려움: 저장 프로시저 코드를 단계별로 디버그하기는 쉽지 않습니다.
-
이식성 제한: 저장 프로시저는 종종 데이터베이스 특정 문법을 사용하므로, 데이터베이스 시스템 간의 전환이 어렵습니다.
-
과도한 사용으로 인한 설계 문제: 가끔은 애플리케이션 코드에서 로직을 처리하는 것이 더 나을 수 있습니다.
-
버전 관리의 어려움: 저장 프로시저에 대한 변경 사항을 추적하는 것이 애플리케이션 코드보다 더 어렵습니다.
그리고 여러분! SQL 저장 프로시저에 대한 초급 강의를 마친 것입니다. 강력한 도구를 사용할 때는 지혜롭게 사용하시기 바랍니다. 연습하고 실험하고, 곧 데이터베이스 마법사가 될 것입니다!
행복한 코딩 되세요, 그리고 질문이 항상 기대하는 답을 주기를 바랍니다!
Credits: Image by storyset