반응형


. Net core가 벌써 3으로 올라오고 3달 정도 지났습니다.
개인적으로 좋아하는 프레임워크이기도 하고, 평소 C#을 주로 사용해서 이번 기회에. net core web api와 Xunit, Azure를 이용한 개발부터 배포까지 과정을 정리해보았습니다.


설치

ubuntu 18.04 (WSL2), .Net core 3.0과 VSCode를 사용해 개발합니다.
배포를 제외하곤 CLI 기반으로 진행할 예정이라 dotnet cli를 사용할 수 있는 환경이면 크게 문제는 없습니다.

sudo apt-get update
sudo apt-get install dotnet-sdk-3.0

위 명령어로 설치가 안되면 아래 페이지를 참고하여 진행해주세요.

https://docs.microsoft.com/en-us/dotnet/core/install/linux-package-manager-ubuntu-1804

 

Install .NET Core on Ubuntu 18.04 package manager - .NET Core

Use a package manager to install .NET Core SDK and runtime on Ubuntu 18.04.

docs.microsoft.com

 

dotnet --version

설치 성공

새로운 webapi 템플릿 프로젝트를 dotnet cli를 통해 만들어줍니다.

예제 문법: dotnet new <project type> -o <project name>...dotnet new webapi -o WebApi
cd WebApi

다른 템플릿들은

dotnet new

로 확인할 수 있습니다.


.NET Core Web API Basic

.net core web api는 Controller들이 요청을 처리합니다. WeatherForecstController.cs에서 요청을 받으면 WeatherForecast.cs의 객체를 리턴하는 기본 템플릿 예제입니다.

WeatherForecastController.cs

 

Route(“[controller]”) 라는 속성은

클래스 이름인 WeatherForecastController 에서 Controller 앞에 있는

WeatherForecast 를 기준으로 라우팅한다는 의미입니다.

쉽게 말해서 request를 아래와 같이 요청하도록 한다는 의미입니다.

GET — 127.0.0.1:5001/WeatherForecast

이 요청은 아래 Get() 메소드에 의해서 수행됩니다.

WeatherForecastController.cs

 

Startup.cs 에는 DI를 포함한 각종 세팅 관련 코드를 추가할 수 있습니다.

Program.cs는 프로그램을 빌딩해주는 스캐폴딩이 있습니다.

기본적인 구조 설명이 끝났으니 실제로 실행시켜봅시다.

dotnet run

이제 Postman으로 결과를 확인해봅시다.

(브라우저 주소창에서 해도 상관없음)

수행 결과

 


이제 새로운 Controller를 만들어봅시다.

using Microsoft.AspNetCore.Mvc;
using WebApi.Model;

namespace WebApi.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class SimpleHTTPController : ControllerBase
    {
        [HttpGet]
        [Route("v1/data")]
        public ActionResult<Data> Get()
        {
            return Ok(new Data(1));
        }

        [HttpPost]
        [Route("v1/data")]
        public ActionResult<Data> Post([FromBody] Data dto)
        {
            return CreatedAtAction("Post", new Data(dto.Uid));
        }
    }
}

WebApi/Controllers/SimpleHTTPControllers.cs

 

 

using System;
using System.Text.Json.Serialization;

namespace WebApi.Model
{
    public class Data
    {
        public Data()
        {

        }
        public Data(int Uid)
        {
            this.Uid = Uid;
            this.Date = DateTime.Now;
        }

        public DateTime Date { get; set; }

        public int Uid { get; set; }
    }
}

WebApi/Model/Data.cs

 

Controllers 폴더 아래에 SimpleHTTPController를 생성합니다.

Get method 하나와 Post Method 하나를 각각 만들어봅니다.

Get method는 HTTP OK(200)과 임의의 객체를 return하고,

Post는 HTTP Created(201)과 post request에 지정한 body를 return합니다.

Get

 

Post

 


Xunit 테스트

테스트코드를 작성해보겠습니다.

api

— webapi

— webapiTests

폴더 구조를 위와같이 변경합니다.

webApiTests 폴더를 생성하고 dotnet cli로 xunit 프로젝트를 생성합니다.

 

mkdir WebApiTests
cd WebApiTests

dotnet new xunit

테스트 서버와 테스트 클라이언트 생성을 위한 nuget package를 받습니다.

그리고 테스트 프로젝트에 WebApi 프로젝트의 레퍼런스를 추가합니다.

 

dotnet add package Microsoft.AspNetCore.Mvc.Testing --version 3.0

dotnet add reference ../WebApi/WebApi.csproj

템플릿 파일인 UnitTest01.cs의 이름을 APITests.cs로 변경하고 테스트 코드를 작성합니다.

우리가 만든 2개의 메소드는 Get과 Post이고

 

이 두 메소드는 HTTP OK(200)과 HTTP Created(201)를 각각 리턴합니다.

 

appsetting.json 파일은 WebApi 폴더에 있습니다. 각자 환경에 맞춰 경로를 변경해줍니다.

 

using System;
using Xunit;
using System.Net.Http;
using System.Net;
using Microsoft.AspNetCore.TestHost;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using System.Threading.Tasks;
using WebApi;
using WebApi.Model;
using System.Text.Json;
using System.Text;

namespace WebApiTests
{
    public class APITests
    {

        HttpClient client;
        TestServer testServer;

        public static TheoryData<Data> HTTP_POST_DATA_SET = new TheoryData<Data> { new Data(1) };
        public APITests()
        {
            this.Initalize();
        }

        public void Initalize()
        {
            var configuration = new ConfigurationBuilder()
                .AddJsonFile("/home/key/repository/api/WebApi/appsettings.json")
                .Build();

            testServer = new TestServer(new WebHostBuilder()
                .UseConfiguration(configuration)
                .UseStartup<Startup>()
            );

            client = testServer.CreateClient();
        }

        [Fact]
        public async Task IS_HTTP_GET_200()
        {
            HttpResponseMessage response = null;

            // Act
            response = await client.GetAsync("simplehttp/v1/data");

            // Assert
            Assert.Equal(HttpStatusCode.OK, response.StatusCode);
        }

        [Theory]
        [MemberData("HTTP_POST_DATA_SET")]
        public async Task IS_HTTP_POST_201(Data dto)
        {
            var stringContent = new StringContent(JsonSerializer.Serialize<Data>(dto), UnicodeEncoding.UTF8, "application/json");

            // Act
            var response = await client.PostAsync("simplehttp/v1/data", stringContent);

            // Assert
            Assert.Equal(HttpStatusCode.Created, response.StatusCode);
        }
    }
}

위와 같이 200과 201이 리턴되면 테스트를 통과하는 코드를 작성합니다.

테스트 실행은 아래 명령을 입력합니다.

dotnet test


배포

Azure 서비스 가입을 하시고, dashboard에서 Azure App Service를 생성합니다.

 

만약 대학생이라면 Azure 학생용 스타터 구독을 신청하면 무료로 1GB ram의 App service를 사용할 수 있습니다.

 

https://azure.microsoft.com/ko-kr/offers/ms-azr-0144p/

 

학생용 Microsoft Azure 스타터 제품 | Microsoft Azure

Microsoft Azure의 학생용 제안을 검토하세요. 학생용 Azure 스타터를 사용하여 비용, 약정 또는 시간 제한 없이 Azure 서비스에 액세스할 수 있습니다.

azure.microsoft.com

 

.Net core 3.0 런타임 스택에 linux 운영체제를 선택하시면 됩니다.

https://azure.microsoft.com/ko-kr/services/app-service/

 

Azure App Service – 앱 호스팅 | Microsoft Azure

Azure App Service를 사용하여 모든 플랫폼 혹은 디바이스에서 그 어느 때보다 빠르게 구동되는 웹 및 모바일 클라이언트용 클라우드 앱을 만들 수 있습니다.

azure.microsoft.com

vscode에서 Azure App Service extension을 설치합니다.

 

https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azureappservice

 

Azure App Service - Visual Studio Marketplace

OverviewQ & ARating & Review Azure App Service for Visual Studio Code (Preview) App Service is Azure's fully-managed Platform as a Service (PaaS) that let's you deploy and scale web, mobile, and API apps. Use the Azure App Service extension for VS Code to

marketplace.visualstudio.com

 

Azure App Service extension을 사용하면 Azure로 손쉽게 배포할 수 있습니다.

 

CORS 같은 정책들도 로컬에서 배포할 때는 Startup.cs에서 설정해줬었는데

Azure에서 배포하면 Azure web에서 설정할 수 있어서 매우 편리합니다.

 

Azure App Service extension를 설치하셨으면
아래 명령어로 프로그램을 빌드 합니다.

 

dotnet publish -c release

성공적으로 빌드가 되면

WebApi-> bin -> release -> publish 폴더를 우클릭하여 deploy to web app을 클릭합니다.

 

자신의 Azure 구독과 미리 생성한 App service를 선택하면 자동으로 배포가 됩니다.

결과

 

출처 : https://medium.com/@keyhyuk.kim/net-core-rest-api-%EC%84%9C%EB%B2%84-%ED%85%8C%EC%8A%A4%ED%8A%B8-%EB%B6%80%ED%84%B0-%EB%B0%B0%ED%8F%AC%EA%B9%8C%EC%A7%80-8ad3e630ab44

반응형

+ Recent posts