데이터베이스 관리 방식은 저장 프로시저 중심의 아키텍처에서 코드 기반의 데이터베이스 마이그레이션 및 ORM(Object-Relational Mapping) 아키텍처로 전환되어 왔습니다. 이 두 가지 접근 방식의 차이점을 코드와 동작 원리를 통해 설명합니다.
1. 전통적 방식: 저장 프로시저 중심 구조
저장 프로시저는 데이터베이스 시스템 내부에 컴파일되어 저장된 SQL 쿼리의 집합입니다. 데이터베이스 스키마 구조와 데이터 조작 로직(비즈니스 로직)이 데이터베이스 내부에 결합되어 있습니다.
저장 프로시저 코드 예시 (사용자 등급 업데이트)
CREATE PROCEDURE sp_UpdateUserGrade
@UserId INT,
@TotalPurchaseAmount DECIMAL(18,2)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @NewGrade VARCHAR(10);
IF @TotalPurchaseAmount >= 1000000
SET @NewGrade = 'VIP';
ELSE IF @TotalPurchaseAmount >= 500000
SET @NewGrade = 'GOLD';
ELSE
SET @NewGrade = 'SILVER';
UPDATE Users
SET Grade = @NewGrade,
LastUpdated = GETDATE()
WHERE Id = @UserId;
END
저장 프로시저 설명
해당 코드는 sp_UpdateUserGrade라는 이름의 프로시저를 생성합니다. 동작 과정은 다음과 같습니다.
- UserId와 TotalPurchaseAmount 두 개의 매개변수를 입력받습니다.
- 내부 변수 @NewGrade를 선언합니다.
- 조건문을 사용하여 TotalPurchaseAmount 값에 따라 @NewGrade 변수에 'VIP', 'GOLD', 'SILVER' 문자열을 할당합니다.
- Users 테이블에서 Id 컬럼이 매개변수 @UserId와 일치하는 레코드를 검색합니다.
- 검색된 레코드의 Grade 컬럼을 @NewGrade 값으로 갱신하고, LastUpdated 컬럼을 현재 시간으로 갱신합니다.
저장 프로시저의 구조적 한계
이 방식은 로직 처리를 데이터베이스 엔진이 수행합니다. 단점은 형상 관리(Version Control)의 부재입니다. 프로시저 코드가 변경되었을 때, 변경 이력, 작성자, 롤백 지점을 추적하기 어렵습니다. 스키마(테이블 구조)가 변경될 경우, 이와 연관된 수많은 프로시저의 유효성을 수동으로 검증해야 합니다.
2. 현대적 방식: 데이터베이스 마이그레이션과 ORM 구조
데이터베이스 마이그레이션은 데이터베이스의 뼈대(스키마)가 변경되는 과정을 애플리케이션 코드로 명세화하여 버전 관리 시스템에 기록하는 방법론입니다. 프로시저가 담당하던 비즈니스 로직은 애플리케이션 계층으로 이동합니다.
데이터베이스 마이그레이션 코드 예시 (C# Entity Framework Core)
public partial class AddUserGradeColumn : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<string>(
name: "Grade",
table: "Users",
type: "nvarchar(10)",
nullable: true);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "Grade",
table: "Users");
}
}
마이그레이션 코드 설명
위 코드는 Users 테이블의 구조 변경 이력을 나타내는 클래스입니다.
- Up 메서드는 변경 사항을 데이터베이스에 적용할 때 실행됩니다. Users 테이블에 최대 10자리 문자열을 저장할 수 있는 Grade 컬럼을 생성합니다.
- Down 메서드는 변경 사항을 취소(롤백)할 때 실행됩니다. Users 테이블에서 Grade 컬럼을 삭제합니다.
로직의 분리 (프로시저의 대체)
테이블 구조는 마이그레이션 파일로 관리하고, 기존 프로시저 내부에 있던 조건문 로직은 C# 애플리케이션 코드로 대체합니다.
public async Task UpdateUserGradeAsync(int userId, decimal totalPurchaseAmount)
{
var user = await _context.Users.FindAsync(userId);
if (totalPurchaseAmount >= 1000000)
user.Grade = "VIP";
else if (totalPurchaseAmount >= 500000)
user.Grade = "GOLD";
else
user.Grade = "SILVER";
user.LastUpdated = DateTime.UtcNow;
await _context.SaveChangesAsync();
}
3. 마이그레이션의 동작 메커니즘
마이그레이션 도구는 대상 데이터베이스에 이력 관리 테이블(예: __EFMigrationsHistory)을 생성합니다. 마이그레이션 실행 명령이 하달되면 다음 절차를 따릅니다.
- 소스 코드에 존재하는 전체 마이그레이션 클래스 목록을 시간순으로 로드합니다.
- 데이터베이스의 이력 관리 테이블에 기록된 적용 완료 목록을 조회합니다.
- 두 목록을 대조하여 아직 적용되지 않은 마이그레이션 파일을 식별합니다.
- 미적용 파일의 Up 메서드를 순차적으로 실행하여 데이터베이스 스키마를 갱신합니다.
- 실행이 완료된 마이그레이션 파일의 이름을 이력 관리 테이블에 기록합니다.
결론
저장 프로시저 방식은 스키마 제어와 데이터 조작을 데이터베이스 내부에서 통합 처리합니다. 데이터베이스 마이그레이션 방식은 스키마의 변경 상태를 클래스 파일 단위로 쪼개어 형상 관리를 수행합니다. 이를 통해 애플리케이션 배포 시점에 데이터베이스 구조를 프로그램 코드와 동일한 버전으로 동기화합니다. 기존 프로시저의 제어 로직은 ORM을 통해 애플리케이션 계층으로 이관되어, 시스템 구조가 분리됩니다.
'Backend & Infra > DB' 카테고리의 다른 글
| 데이터베이스 스캐폴딩(Database Scaffolding)의 메커니즘과 멀티 프레임워크 적용 전략 (0) | 2026.05.23 |
|---|---|
| 엔티티 프레임워크(Entity Framework)란? (0) | 2026.05.13 |
| [VectorDB] VectorDB 성능 차이는 어디서 오는가 (2) | 2026.01.14 |
| [DB] MySQL중 InnoDB 엔진이란? (1) | 2025.12.11 |
| [DB] 개발자를 위한 데이터베이스(DB) 종류별 정리 및 선택 가이드 (1) | 2025.12.11 |