[C# PL/SQL] 15.C#과 오라클 프로시저를 이용한 API 개발, 오라클 프로시저를 백엔드로 사용하고 C#을 통해 API를 개발하는 방법

현대 소프트웨어 개발에서 API(응용 프로그램 인터페이스)는 다양한 시스템이 상호작용할 수 있는 중요한 다리 역할을 합니다. 기업의 비즈니스 로직이 데이터베이스에 저장되어 있는 경우, 이러한 로직을 효과적으로 호출하고 사용할 수 있는 방법이 필요합니다. 이번 글에서는 오라클 프로시저를 백엔드로 활용하고 C#을 통해 API를 개발하는 방법에 대해 자세히 설명합니다.

1. API의 기본 이해

API는 애플리케이션 간의 상호작용을 정의하는 명세입니다. API는 일반적으로 여러 시스템 간의 데이터 전송 및 처리를 원활하게 하기 위해 사용됩니다. RESTful API는 현대 웹 애플리케이션에서 광범위하게 사용되며, HTTP 프로토콜을 기반으로 합니다. JSON 또는 XML과 같은 형식으로 데이터를 전송하는 것이 일반적입니다.

2. 오라클 프로시저란?

오라클 프로시저는 PL/SQL(Procedural Language/Structured Query Language)로 작성된 재사용 가능한 데이터베이스 프로그램 장치입니다. 이러한 프로시저는 특정 작업을 수행하도록 설계되었으며, SQL 명령어와 함께 복잡한 로직을 처리할 수 있습니다. 잘 작성된 프로시저는 코드를 모듈화하고 재사용 가능성을 높이며, 데이터베이스에서 직접 실행되기 때문에 성능이 좋아집니다.

3. C# 및 .NET 환경 준비하기

C#은 마이크로소프트에서 개발한 프로그래밍 언어로, .NET 프레임워크 또는 .NET Core를 이용하여 다양한 응용 프로그램을 제작하는 데 사용됩니다. C#으로 만들 API를 개발하기 위해 Visual Studio 혹은 Visual Studio Code와 같은 개발 환경을 설정합니다. 프로젝트 생성 후, 기본 웹 API 템플릿을 선택하면 됩니다.

필요한 라이브러리 설치

Oracle Database와의 연결을 위해 ODP.NET(Oracle Data Provider for .NET) 라이브러리를 사용합니다. NuGet 패키지 관리자에서 다음 명령어를 실행하여 설치할 수 있습니다.

Install-Package Oracle.ManagedDataAccess

4. 오라클 프로시저 작성

다음으로 오라클 데이터베이스에 프로시저를 작성합니다. 예를 들어, 직원 정보를 반환하는 간단한 프로시저를 작성해 보겠습니다.


CREATE OR REPLACE PROCEDURE GetEmployeeById(
    p_employee_id IN NUMBER,
    o_employee_info OUT VARCHAR2
)
AS
BEGIN
    SELECT employee_name || ', ' || employee_position 
    INTO o_employee_info
    FROM employees
    WHERE employee_id = p_employee_id;
END GetEmployeeById;

5. C#에서 오라클 프로시저 호출

이제 C# API에서 방금 생성한 오라클 프로시저를 호출하는 방법을 구현합니다. 예를 들어, 직원의 ID를 입력받아 해당 직원의 정보를 반환하는 API 엔드포인트를 작성하겠습니다.


using Microsoft.AspNetCore.Mvc;
using Oracle.ManagedDataAccess.Client;

namespace MyApi.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class EmployeesController : ControllerBase
    {
        private readonly string _connectionString = "Data Source=MyOracleDB;User Id=myUsername;Password=myPassword;";

        [HttpGet("{id}")]
        public IActionResult GetEmployee(int id)
        {
            string employeeInfo;
            using (var connection = new OracleConnection(_connectionString))
            {
                connection.Open();
                using (var command = new OracleCommand("GetEmployeeById", connection))
                {
                    command.CommandType = System.Data.CommandType.StoredProcedure;
                    command.Parameters.Add("p_employee_id", OracleDbType.Int32).Value = id;
                    command.Parameters.Add("o_employee_info", OracleDbType.Varchar2, 200, null, System.Data.ParameterDirection.Output);
                    
                    try
                    {
                        command.ExecuteNonQuery();
                        employeeInfo = command.Parameters["o_employee_info"].Value.ToString();
                    }
                    catch (Exception ex)
                    {
                        return StatusCode(500, $"Internal server error: {ex.Message}");
                    }
                }
            }

            return Ok(employeeInfo);
        }
    }
}

6. API 테스트

위에서 구현한 GET 요청은 특정 직원 ID를 통해 직원 정보를 반환합니다. 이 API 엔드포인트는 Postman 또는 cURL을 사용하여 테스트할 수 있습니다.


GET http://localhost:5000/api/employees/1

응답으로는 직원의 이름과 직책이 포함된 문자열이 반환됩니다.

7. 보안 및 성능 고려사항

API 개발 시 보안 및 성능은 매우 중요합니다. 데이터베이스 접근 제어, API 인증 및 권한 부여는 필수입니다. OAuth2와 같은 인증 체계를 사용하여 접근을 제한하고, SQL 인젝션과 같은 위험으로부터 보호해야 합니다.

성능 측면에서는 다음과 같은 점을 고려해야 합니다.

  • 프로시저 사용: SQL 쿼리를 정리하여 성능 향상
  • Connection Pooling: 데이터베이스 연결을 효과적으로 관리하여 성능 개선
  • Cache 사용: 자주 사용하는 데이터에 대한 캐싱 구현

8. 마무리

이번 글에서는 C#과 오라클 프로시저를 결합하여 API를 개발하는 방법을 알아보았습니다. 오라클 프로시저를 이용하면 데이터베이스 측에서 복잡한 로직을 처리할 수 있어 클라이언트 애플리케이션에서의 부담을 줄일 수 있습니다. C#을 통해 구축한 API는 다양한 클라이언트와의 통신을 가능하게 해줍니다. 이러한 구조는 비즈니스 로직을 분리하고 유지보수를 용이하게 하여 시스템 전체의 효율성을 높입니다.

또한, 본 글에서 다룬 내용을 기반으로 실제 비즈니스 환경에서의 적용 및 추가적인 최적화 작업을 통해 더욱 발전된 솔루션을 구현하실 수 있습니다. 대표적인 예로 배치 작업, 대량의 데이터 처리, 외부 API 연동 등을 들 수 있습니다.

최종적으로, API 개발은 단순히 코드를 작성하는 것을 넘어 시스템의 여러 구성 요소가 어떻게 상호작용하고 데이터를 관리하는지를 이해하는 과정이기도 합니다. 오라클 프로시저와 C#을 이용한 API 개발은 그러한 상호작용을 원활하게 만들어 줄 수 있는 강력한 조합이라 할 수 있습니다.

감사합니다! 추가적인 질문이나 필요하신 부분이 있으면 언제든지 말씀해 주세요.