Azure Functions를 사용하여 Azure SQL Database의 데이터 조작
Azure Functions는 인프라를 관리하지 않고도 이벤트 기반 코드를 실행할 수 있는 서버리스 컴퓨팅 서비스입니다. 이 코드는 데이터 변환, 유효성 검사, 로깅 등 다양한 작업을 수행할 수 있습니다.
Azure Functions는 여러 프로그래밍 언어를 지원하므로 다양한 기술을 갖춘 개발자에게 적합합니다. 또한 GitHub Actions와 완벽하게 통합되어 변경 내용이 있을 때마다 자동으로 애플리케이션에 데이터가 푸시됩니다. 이를 통해 데이터는 항상 최신 상태로 유지되고 워크플로의 효율성이 유지됩니다.
Azure Functions는 Azure SQL 및 SQL Server 제품에 대한 입력 바인딩, 출력 바인딩 및 함수 트리거 를 지원합니다.
함수 앱에서 사용하는 바인딩 모드에 따라 설치해야 하는 확장이 있습니다. 자세한 내용은 Azure Functions 개요에 대한 Azure SQL 바인딩 을 참조하세요.
Azure SQL 바인딩 이해
C# 함수를 만드는 데에는 두 가지 모드가 권장됩니다.
- 격리된 작업자 모델- 런타임에서 격리된 작업자 프로세스에서 실행되는 컴파일된 함수입니다. 이 모델은 .NET과 .NET Framework의 LTS 및 비 LTS 버전에서 실행되는 C# 함수를 지원합니다.
- C# 스크립트는 Azure Portal에서 C# 함수를 만들 때 주로 사용됩니다.
중요합니다
Azure Portal에서는 .NET 격리된 함수 앱을 편집할 수 없습니다. 로컬 개발 환경을 사용하여 함수 앱을 편집합니다.
함수 앱 만들기
첫 번째 단계는 함수 앱을 만드는 것입니다. 이 예에서는 Azure Portal을 사용했지만 Visual Studio Code 또는 Azure CLI 등 다른 방법을 사용할 수도 있습니다.
Azure Portal에서 리소스 만들기를 선택한 다음 , 함수 앱을 선택합니다. 플랜 유형을 선택합니다.
구독, 리소스 그룹, 함수 앱 이름 등 필수 세부 정보를 입력합니다.
런타임 스택과 사용할 버전을 선택합니다.
함수 앱에 대한 지역과 운영 체제를 선택합니다.
설정을 검토하고 만들기 를 선택하여 함수 앱을 배포합니다.
연결 문자열 추가
설정 섹션 아래 함수 앱의 왼쪽 메뉴에 Azure SQL Database 연결 문자열을 추가할 수 있습니다. 환경 변수를 선택합니다. 연결 문자열 탭에서 + 추가를 선택하여 새 연결 문자열을 추가합니다. 이름을 입력하고, 연결 문자열 값을 입력하고, SQLAzure 형식을 선택합니다.
데이터 읽기 작업(입력 바인딩)
함수는 입력 바인딩 모드에서 작동합니다. 즉, 함수가 실행되면 Azure SQL 입력 바인딩은 데이터베이스에서 데이터를 검색하여 함수의 입력 매개 변수에 전달합니다.
Azure SQL 데이터베이스에서 단일 레코드 읽기
이 예에서는 Azure SQL 데이터베이스에서 단일 레코드를 검색하는 Azure 함수를 C#으로 만드는 방법을 보여 줍니다. 이 함수는 HTTP 요청에 의해 트리거되므로 사용자 입력 또는 기타 매개 변수를 기반으로 특정 데이터를 가져와야 하는 시나리오에 실용적인 솔루션입니다.
다음 코드 조각은 Employee 테이블에서 단일 레코드를 검색하는 C# 함수를 보여 줍니다. 이 함수는 쿼리 문자열을 사용하여 EmployeeId를 지정하는 HTTP 요청에 의해 트리거됩니다. 쿼리 문자열 매개 변수는 대/소문자를 구분합니다.
using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
namespace AzureSQLSamples
{
public static class GetEmployee
{
[FunctionName("GetEmployee")]
public static IActionResult Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "getemployee")]
HttpRequest req,
[Sql(commandText: "select [EmployeeId], [FirstName], [LastName], [Email], [Department] from dbo.Employee where EmployeeId = @EmployeeId",
commandType: System.Data.CommandType.Text,
parameters: "@EmployeeId={Query.EmployeeId}",
connectionStringSetting: "SqlConnectionString")]
IEnumerable employee)
{
return new OkObjectResult(employee.FirstOrDefault());
}
}
}
함수 유효성 검사
GetEmployee 함수를 트리거하고 유효성 검사하려면 쿼리 문자열에 지정된 EmployeeId를 사용하여 함수의 엔드포인트에 HTTP GET 요청을 보내야 합니다. 웹 브라우저, Postman, cURL 등 다양한 도구를 사용하여 HTTP GET 요청을 보낼 수 있습니다. 웹 브라우저를 이용하려면 웹 브라우저의 주소 표시줄에 URL을 입력합니다.
https://<your-function-app>.azurewebsites.net/api/getemployee?EmployeeId=123
GetEmployee 함수가 HTTP GET 요청에 의해 트리거되면 다음과 같은 일련의 이벤트가 발생합니다.
- Azure SQL 입력 바인딩은 지정된 EmployeeId를 사용하여 데이터베이스의
Employee테이블에서 데이터를 검색합니다. - SQL 명령은 지정된
EmployeeId와 일치하는 Employee 테이블에서 레코드를 가져옵니다. - 검색된 레코드는
IEnumerable이라는 컬렉션으로 함수에 전달됩니다. - 이 함수는 직원 컬렉션의 첫 번째이자 유일한 레코드를
OkObjectResult로 반환합니다. 이는 직원 데이터가 포함된 HTTP 200 응답입니다.
데이터 쓰기 작업(출력 바인딩)
Azure Functions에 대한 Azure SQL 출력 바인딩을 사용하면 Azure SQL 데이터베이스에 데이터를 쓸 수 있습니다.
Azure SQL 출력 바인딩을 사용하는 경우 INSERT, UPDATE 또는 DELETE 문과 같이 실행하려는 SQL 명령을 정의합니다. 바인딩은 제공된 매개 변수로 SQL 명령을 실행합니다.
Azure SQL 데이터베이스에 단일 레코드 쓰기
다음 코드 예에서는 AddEmployee 테이블에 새 직원 레코드를 삽입하는 Employee라는 Azure 함수를 정의합니다.
이 함수는 HTTP POST 요청에 의해 트리거되고 Azure SQL 출력 바인딩을 사용하여 데이터를 데이터베이스에 삽입합니다.
Employee 클래스는 직원 데이터의 구조를 나타내고, OutputType 클래스는 직원 데이터와 HTTP 응답을 발신자에게 다시 전달하는 데 사용됩니다.
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using Microsoft.Azure.Functions.Worker.Extensions.Sql;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
namespace AzureSQL.Employee
{
public static class AddEmployee
{
// create a new Employee from body object
// uses output binding to insert new item into Employee table
[FunctionName("AddEmployee")]
public static async Task Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "AddEmployee")] HttpRequestData req,
FunctionContext executionContext)
{
var logger = executionContext.GetLogger("AddEmployee");
logger.LogInformation("C# HTTP trigger function processed a request.");
string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
Employee employee = JsonConvert.DeserializeObject<Employee>(requestBody);
// generate a new id for the employee
employee.EmployeeId = Guid.NewGuid();
return new OutputType()
{
Employee = employee,
HttpResponse = req.CreateResponse(System.Net.HttpStatusCode.Created)
};
}
}
public class OutputType
{
[SqlOutput("dbo.Employee", connectionStringSetting: "SqlConnectionString")]
public Employee Employee { get; set; }
public HttpResponseData HttpResponse { get; set; }
}
public class Employee
{
public Guid EmployeeId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public string Department { get; set; }
}
}
함수 유효성 검사
AddEmployee 함수를 트리거하고 유효성 검사하려면 요청 본문에 직원 데이터를 포함하여 함수의 엔드포인트에 HTTP POST 요청을 보내야 합니다. Postman 또는 cURL과 같은 도구를 사용하여 HTTP POST 요청을 보낼 수 있습니다. Postman을 사용한 예는 다음과 같습니다.
- 요청 유형을 POST로 설정합니다.
- 주소 표시줄에 URL을 입력합니다.
https://<your-function-app-name>.azurewebsites.net/api/addemployee - 본문 탭에서 원시를 선택하고 형식을 JSON으로 설정합니다.
- 직원 데이터를 JSON 형식으로 입력합니다. 예:
{ "FirstName": "John", "LastName": "Doe", "Email": "john.doe@example.com", "Department": "HR" }
Azure SQL 트리거 구성
Azure SQL 트리거는 SQL 테이블에서 변경 내용이 검색될 때 함수를 트리거하는 Azure Functions에서 사용되는 기능입니다.
트리거는 SQL 변경 내용 추적을 사용하여 테이블의 변화를 모니터링하고, INSERT, UPDATE, DELETE 이벤트에 효율적으로 응답하여 변경 내용을 감지합니다.
주기적으로 변경 내용을 확인하고 그에 따라 함수를 트리거하는 폴링 루프에서 작동합니다. 한 폴링 간격 동안 여러 변경 내용이 적용되는 경우 이러한 변경 내용은 원래 변경 내용이 적용된 순서대로 트리거에 의해 적용됩니다.
Sql_Trigger_MaxBatchSize 설정을 구성하여 한 번에 처리되는 변경 내용 수를 제어하고, Sql_Trigger_PollingIntervalMs 설정을 구성하여 폴링 간격 간 대기 시간을 설정할 수 있습니다.
변경 내용 추적 설정
다음 명령 예를 실행하여 데이터베이스와 테이블에서 변경 내용 추적을 사용하도록 설정합니다.
ALTER DATABASE [AdventureWorksLT]
SET CHANGE_TRACKING = ON
(CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON);
ALTER TABLE [dbo].[Employee]
ENABLE CHANGE_TRACKING;
클래스 만들기
이제 Employee 네임스페이스 내에 AzureSQL.Employee라는 C# 클래스를 정의해 보겠습니다.
Employee 클래스는 직원 레코드의 구조를 나타냅니다.
namespace AzureSQL.Employee
{
public class Employee
{
public Guid EmployeeId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public string Department { get; set; }
}
}
함수 트리거 만들기
Azure 함수에서 변경 내용 추적을 통해 검색된 변경 내용에 응답하도록 트리거를 설정합니다.
using System;
using System.Collections.Generic;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Extensions.Sql;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
namespace AzureSQL.Employee
{
public static class EmployeeTrigger
{
[Function("EmployeeTrigger")]
public static void Run(
[SqlTrigger("[dbo].[Employee]", "SqlConnectionString")]
IReadOnlyList<SqlChange<Employee>> changes,
FunctionContext context)
{
var logger = context.GetLogger("EmployeeTrigger");
foreach (SqlChange<Employee> change in changes)
{
Employee employee = change.Item;
logger.LogInformation($"Change operation: {change.Operation}");
logger.LogInformation($"EmployeeId: {employee.EmployeeId}, FirstName: {employee.FirstName}, LastName: {employee.LastName}, Email: {employee.Email}, Department: {employee.Department}");
}
}
}
}
이 설정을 사용하면 함수가 거의 실시간으로 데이터 변경에 대응할 수 있으므로 데이터 동기화, 감사 등의 시나리오에 유용합니다.
참고 항목
SQL 변경 내용 추적의 작동 방식에 대한 자세한 내용은 변경 내용 추적 작업을 참조하세요.
함수 실행 모니터링
Azure Application Insights 통합을 사용하도록 설정하여 함수의 성능 및 잠재적인 문제를 추적합니다. Application Insights는 로그, 성능 및 오류 데이터를 수집합니다.