데이타베이스/SqlServer

SQL Server 프로그래밍: 저장 프로시저, 트리거, 사용자 정의 함수 통합 가이드

shimdh 2025. 1. 24. 21:33
728x90

저장 프로시저: 반복적인 작업의 효율적 처리

정의 및 장점

저장 프로시저는 데이터베이스에 저장된 SQL 코드 블록으로, 특정 작업을 수행하기 위해 호출될 수 있습니다. 이는 복잡한 SQL 작업을 하나의 단위로 통합하고, 반복적인 SQL 쿼리를 재사용 가능하게 하며, 성능과 유지 보수성을 향상시킵니다. 저장 프로시저는 단순한 SELECT 쿼리부터 데이터 변경 작업까지 모든 종류의 작업을 자동화할 수 있는 강력한 도구입니다.

장점:

  1. 재사용성: 여러 곳에서 동일한 프로시저를 호출 가능.
  2. 보안성: 테이블 직접 접근 없이 데이터 처리 가능, 데이터베이스 보안을 강화.
  3. 성능 향상: 미리 컴파일된 상태로 실행되어 쿼리 성능 최적화.
  4. 유지보수 용이성: 로직 변경 시 저장 프로시저만 수정하여 전체 시스템에 적용 가능.
  5. 표준화: 데이터베이스 작업의 일관성을 유지.
  6. 간결성: SQL 문을 하나로 묶어 실행 로직을 간소화.

기본 구문 및 예제

저장 프로시저를 작성하려면 다음과 같은 기본 구문을 사용합니다:

CREATE PROCEDURE ProcedureName
AS
BEGIN
    -- SQL 문들...
END;

예를 들어, 고객 정보를 조회하는 저장 프로시저를 작성하면 다음과 같습니다:

CREATE PROCEDURE GetCustomerInfo
    @CustomerID INT
AS
BEGIN
    SELECT * FROM Customers WHERE CustomerID = @CustomerID;
END;

위의 예제는 고객 ID를 입력받아 해당 고객 정보를 반환하는 간단한 저장 프로시저입니다. 이를 통해 개발자는 반복적인 쿼리 작성의 번거로움을 줄일 수 있습니다.

고급 활용: 출력값과 에러 처리

저장 프로시저는 출력값을 반환하거나 복잡한 트랜잭션 처리를 지원할 수 있습니다. 예를 들어, 주문 데이터를 안전하게 삽입하는 로직은 다음과 같이 구현할 수 있습니다:

CREATE PROCEDURE SafeInsertOrder  
    @CustomerID INT,
    @OrderDate DATETIME  
AS  
BEGIN  
    BEGIN TRY  
        BEGIN TRANSACTION;  

        INSERT INTO Orders (CustomerID, OrderDate) VALUES (@CustomerID, @OrderDate);  

        COMMIT TRANSACTION;  
    END TRY  
    BEGIN CATCH  
        ROLLBACK TRANSACTION;  
        PRINT 'Error occurred';
    END CATCH   
END;

이 저장 프로시저는 트랜잭션 관리를 통해 데이터 무결성을 보장하며, 오류가 발생하면 이를 롤백하고 적절히 처리합니다. 이를 통해 복잡한 비즈니스 로직을 보다 안전하고 효율적으로 관리할 수 있습니다.


트리거: 자동화된 데이터 처리

정의 및 특징

트리거는 특정 데이터베이스 이벤트(INSERT, UPDATE, DELETE)가 발생했을 때 자동으로 실행되는 SQL 프로그램입니다. 트리거는 데이터 무결성을 보장하고, 감사 및 로깅 작업을 처리하며, 비즈니스 규칙을 강제하는 데 사용됩니다. 또한, 트리거는 데이터베이스의 특정 변경사항을 자동으로 추적하여 관리 부담을 줄일 수 있습니다. 데이터 관리 자동화를 통해 개발자와 관리자 모두의 효율성을 높일 수 있는 중요한 도구입니다.

종류:

  1. AFTER 트리거: 작업 완료 후 실행되어 데이터 변경 결과를 처리.
  2. INSTEAD OF 트리거: 지정된 작업을 대체하여 실행하며, 기본 동작을 차단하고 새로운 로직을 수행.

AFTER 트리거 예제

AFTER 트리거는 일반적으로 로그 기록과 같은 작업에 사용됩니다. 다음은 고객 테이블에 새로운 레코드가 삽입될 때 로그를 기록하는 트리거의 예제입니다:

CREATE TABLE CustomerLog (
    LogID INT IDENTITY(1,1) PRIMARY KEY,
    CustomerID INT,
    ChangeDate DATETIME DEFAULT GETDATE(),
    Operation NVARCHAR(50)
);

CREATE TRIGGER trg_AfterInsert_Customers
ON Customers
AFTER INSERT
AS
BEGIN
    INSERT INTO CustomerLog (CustomerID, Operation)
    SELECT CustomerID, 'INSERT' FROM inserted;
END;

이 트리거는 Customers 테이블에 새로운 고객이 추가될 때마다 CustomerLog 테이블에 변경 사항을 기록합니다. 이러한 트리거를 통해 데이터 변경 내역을 손쉽게 추적할 수 있습니다.

INSTEAD OF 트리거 예제

INSTEAD OF 트리거는 조건에 따라 데이터 삽입, 삭제 또는 업데이트를 대체하는 데 사용됩니다. 예를 들어, 특정 이메일 도메인만 허용하는 조건을 적용할 수 있습니다:

CREATE TRIGGER trg_InsteadOfInsert_Customers
ON Customers
INSTEAD OF INSERT
AS
BEGIN
   IF EXISTS (SELECT * FROM inserted WHERE Email NOT LIKE '%@example.com')
   BEGIN
       RAISERROR('Email must be from example.com domain.', 16, 1);
       ROLLBACK TRANSACTION;
   END
   ELSE
   BEGIN
       INSERT INTO Customers (CustomerID, Name, Email)
       SELECT CustomerID, Name, Email FROM inserted;
   END
END;

위 코드는 조건을 충족하지 않는 데이터 삽입을 차단하여 데이터 무결성을 강화합니다. 비즈니스 규칙을 강제하는 데 매우 유용하며, 복잡한 데이터 검증 로직을 포함할 수 있습니다.


사용자 정의 함수: 코드 재사용과 가독성 향상

정의 및 유형

사용자 정의 함수는 SQL Server에서 데이터 변환이나 계산 로직을 모듈화하여 반복적인 작업을 단순화하는 데 사용됩니다. 이는 데이터베이스의 코드 가독성과 유지보수성을 크게 향상시킬 수 있습니다. 사용자 정의 함수는 비즈니스 로직을 캡슐화하여 다른 SQL 쿼리나 프로시저에서 재사용할 수 있습니다.

유형:

  1. 스칼라 함수: 단일 값을 반환하여 간단한 계산 작업에 사용.
  2. 테이블 값 함수: 여러 행과 열로 구성된 데이터를 반환하여 복잡한 데이터 처리에 활용.

스칼라 함수 예제

스칼라 함수는 단일 입력값을 받아 계산 결과를 반환합니다. 다음은 할인율을 적용하여 최종 가격을 계산하는 함수입니다:

CREATE FUNCTION dbo.CalculateDiscount (@Price DECIMAL(10, 2), @DiscountRate DECIMAL(5, 2))
RETURNS DECIMAL(10, 2)
AS
BEGIN
    RETURN @Price - (@Price * @DiscountRate / 100);
END;

사용 예:

SELECT dbo.CalculateDiscount(1000, 10) AS FinalPrice;

위의 쿼리는 900을 반환하며, 할인 적용 가격 계산을 단순화합니다. 이러한 함수를 통해 복잡한 계산 로직을 간단히 재사용할 수 있습니다.

테이블 값 함수 예제

테이블 값 함수는 여러 행의 데이터를 반환합니다. 다음은 부서별 직원 정보를 반환하는 함수입니다:

CREATE FUNCTION dbo.GetEmployeesByDepartment (@DepartmentID INT)
RETURNS TABLE
AS
RETURN
(
    SELECT EmployeeID, FirstName, LastName
    FROM Employees
    WHERE DepartmentID = @DepartmentID
);

사용 예:

SELECT * FROM dbo.GetEmployeesByDepartment(1);

이 함수는 부서 ID가 1인 모든 직원 정보를 반환합니다. 이를 통해 복잡한 데이터 필터링 로직을 손쉽게 구현할 수 있습니다.


결론

저장 프로시저, 트리거, 사용자 정의 함수는 SQL Server의 강력한 도구로, 데이터베이스 작업을 효율적으로 관리하고 개발 생산성을 높이는 데 중요한 역할을 합니다. 저장 프로시저는 반복적인 작업을 단순화하고, 트리거는 이벤트 기반 작업을 자동화하며, 사용자 정의 함수는 코드의 재사용성과 가독성을 높이는 데 기여합니다. 이를 적절히 활용하면 데이터베이스의 안정성과 효율성을 동시에 높일 수 있습니다. 데이터베이스 설계 단계부터 이러한 도구들을 신중히 고려하여, 보다 견고하고 관리하기 쉬운 시스템을 구축해 보세요. SQL Server의 다양한 기능을 완전히 이해하고 활용함으로써, 데이터 관리에서 새로운 차원의 효율성을 경험할 수 있습니다.

728x90