반응형

.NET Framework

웹 서비스 및 기타 응용 프로그램의 작성, 배포 및 실행을 위한 환경을 의미한다. 

거의 모든 종류의 프로그램을 개발할 수 있도록 만들어진 크고 포괄적인 개발 프레임워크이다.

 

 ASP.NET  :   응용 프로그램을 만들기 위해 특별히 설계된 .NET Framework의 한 부분

 

 

 

CLR (Common Language Runtime) 공통 언어 런타임 

Framework 클래스 및 ASP.NET의 세 가지 주요 부분으로 구성되어지는 환경을 의미한다.

 .NET 타입들의 위치를 지정하고, 로드하고, 관리하는 역할을 담당한다. 자동으로 메모리를 관리해 주고, 언어를 통합할 수 있도록 하는 것이다.

 

 

 

 

CTS (Common Type System) 규칙 

모든 타입들을 확실히 명세하고, 언어에 상관없이 타입을 공유하도록 함

: 언어는 문법의 차이만 있고, 내부적으로는 같은 타입을 사용하도록 한다 >.NET 프레임워크에서 제공하는 기반 클래스들을 가져다가 사용하는 것이다.

"컴파일" 과정이 있으므로 가능 (어떤 언어든지 컴파일 후엔 MSIL > dll , exe......로 변경됨)

 

 

 

 

CLS (Common Language Specification) :

      새로운 타입을 작성하고자 할 경우에, 그 기준이 되어주는 일종의 명세서

이 명세에 맞추면 여러 언어들이 닷넷을 지원하도록 제작 가능 (Python, Java 등..)

 

 

 

 

.aspx  파일과 .ascx 파일의 차이

 

(1) aspx : asp.net 의 확장자,  C # 코드를 포함하는 서버에서 생성 된 웹 페이지, 닷넷 시스템 위에서 동작하는 서버 스크립트

HTML + 서버 코드 가 완전히 분리되어 구동 (<-> asp는 HTML과 서버코드가 합쳐져서 하나의 페이지로 작동)

페이지 내의 스크립트는 웹 서버에서 처리되고, 생성된 HTML을 브라우저로 전송한다

 

(2) ascx : User Control (사용자 정의 컨트롤)

: ASP.NET 페이지의 일부를 컨트롤화 함. 작은 ASP.NET 페이지

코드 비하인드를 가질 수 있고, 스크립트와 HTML 요소를 포함할 수 있지만 <HTML>, <BODY>, <FORM> 태그는 가질 수 없음

여러 페이지에서 반복적으로 사용되는 독립 모듈을 위한 타입

 

ex) 풋터, 메뉴바, CopRight 문구 등 고정적인 것들...

 

>> 차이점 : ascx는 웹페이지의 일부이므로 "독립적인 실행은 불가능"하며, 호스트하는 웹페이지가 필요함

 

 

 

그냥 참고용 > asp랑 aspx 비교

 

 asp (Active Server Pages)

aspx 

 방식 (컴파일 유무)

인터프리터 방식

컴파일러 방식 

 기반 언어

VBScript / JScript 

닷넷 언어들 (C#, VB,  ... )

 구동 플랫폼

IIS 

IIS, .NetFramework 

 페이지 형태

하나의 ASP 페이지에 디자인과 제어 코드가 섞여 있음 (객체 지향 X) 

객체 지향형, 디자인과 코드가 분리된 MVC 패턴의 유사 형태

 관리

ASP.DLL

 ASP 페이지의 실행과 관리를 담당

C.L.R(Common Language Runtime)

 

 

 

 

인터프리터(Interpreter)

프로그래밍 언어의 소스 코드를 바로 실행하는 컴퓨터 프로그램 또는 환경을 말한다. 

고급 언어를 즉시 실행시킬 수 있다는 장점을 가지며, 코드의 수정을 바로 테스트 해 볼 수 있어서 프로그램 개발 단계에서 종종 사용된다.

 

장점 : 컴파일 없이 큰 파일도 바로 실행 가능

단점 : 실행할 때마다 번역 필요 -> 인터프리터 필요. 효율성이 떨어짐

 

 

컴파일러(Compiler)

원시 언어에서 목적 언어로 바꾸는 작업을 하는 것을 말한다. 좀더 쉽게 말하면 A라는 언어에서 B라는 언어로 통역을 해주는 작업 또는 그 작업을 하는 것이다. 

프로그래밍에서는 주로 고급언어 -> (중간언어 ->) 기계어로 바꿔주는 것을 말한다.

 

장점 : 어떠한 환경에 구애받지 않고, 고급언어 + 컴파일러만 있으면 실행 가능

단점 : VM 을 거칠 경우, 속도가 느림(JAVA)

 

참고 http://tutankhamenkr.me/posts/9

 

.cs 파일

C# 소스의 기본 확장자. .NET Framework 위에서 동작

 

 

 


 


.cshtml

Razor 페이지에서 사용되는 확장자

 

 

 

 

Razor

ASP.NET MVC 3를 위한 새로운(? 2010년) 뷰 엔진. 클라이언트 컨텐츠에 서버 코드를 끼워넣는 방법 중 하나다.

클라이언트 컨텐츠 : HTML, CSS , Javascript, Text ....

 

- 페이지에 서버 코드 有 -> 브라우저에 페이지를 전송하기 전, 서버 코드 실행 -> 정적 HTML과 함께 전송

- 서버 코드는 클라이언트 컨텐츠를 동적으로 생성할 수 있고, 뷰 단에서 서버 코딩을 할 때에는 기존의 <%%> 가 아닌, @ 문자를 사용한다

 

- HTML 도우미 메서드(Helper)를 제공한다. ex) .LabelFor, .ValidationMessageFor .....

 

[그림 설명] 각각 하위의 것을 기반으로 실행된다.

출처 : http://i1.asp.net/umbraco-beta-media/2573127/Windows-Live-Writer_2--.

NET-Web-Programming-Using-the-Razor-_7D39_ch02_programmingintro-8_4.jpg

 

 

 

 

 

.NET MVC : 모델-뷰-컨트롤러 패턴으로 관심사(처리, 데이터, UI)를 분리시켜서 구현한다.

  separation of concerns (processing, data, and UI layers)

 

 

 

 

참고

http://www.taeyo.net/Columns/List.aspx?SEQ=6&IDX=0

http://taeyo.net/Columns/View.aspx?SEQ=442&PSEQ=35&IDX=1

http://blog.naver.com/PostView.nhn?blogId=julymorning4&logNo=100160097990



출처: https://ryusae.tistory.com/11 [초보자 전용 마을]

반응형
반응형

서버측 언어가 ASP.NET을 사용하는 경우 만약 한글 깨짐 현상이 발생한다면? 아마도 인코딩(encoding) 설정이 잘못 된 경우일 수 있습니다. 이 경우 어떻게하면 한글 깨짐을 해결할 수 있는지 몇 가지 해경방법을 알아보도록 하겠습니다.

먼저 인코딩 설정은 하나의 페이지에 적용하는 페이지 단위 적용방법과 전체 페이지 적용 방법으로 구분할 수 있습니다. 우선 페이지 단위로 설정하는 싱글 페이지 방법입니다.



# ASP.NET 페이지 단위 인코딩을 설정 방법보여줄 하나의 페이지... 페이지 단위로 인코딩을 설정하는 방법입니다. 이 경우 아래와 같이 코드를 페이지 최상단에 추가합니다. 반드시 페이지 제일 위에 위치해야 정상 동작됩니다.

@ 1번 방법

<%@ Page RequestEncoding="utf-8" ResponseEncoding="utf-8" %>

 


@ 2번 방법

<%@Language="VBScript" CODEPAGE="65001"%>
<% Response.CharSet = "utf-8" %>

 
1번 방법이 안될 경우 2번 방법을 시도하도록 합니다.



# 전역 페이지, 전체 웹에 설정하는 방법웹 어플리케이션 전체에 반영하기 위해서는 Web.config 파일에 아래의 코드를 추가하는 방법이 있습니다. 작성된 파일의 인코딩에 맞추어 아래의 코드를 추가합니다. utf-8 그리고 euc-kr 방법입니다.

@ UTF-8인 경우

<system.web>
    <globalization fileEncoding="utf-8" requestEncoding="utf-8" responseEncoding="utf-8" culture="ko-KR" uiCulture="ko-KR"/>
</system.web>


아래는 euc-kr로 인코딩 설정된 경우입니다.

@ EUC-KR인 경우

<system.web>
    <globalization fileEncoding="euc-kr" requestEncoding="euc-kr" responseEncoding="euc-kr" culture="ko-KR" uiCulture="ko-KR"/>
</system.web>



# 마치면서한글깨짐과 같은 문제는 매우 자주 나타나는데 웹에서는 위와같이 인코딩 설정이 반드시 필요합니다. 인코딩 문제는 어디서든 나타날 수 있어 다양한 측면에서 확인과 수정이 필요합니다. 일반적으로 서버측 인코딩 설정이 누락된 경우가 가장 많겠지만 파일의 인코딩 문제일 수도 있고 아니면 데이터베이스에 설정된 인코딩이 달라 나타날 수도 있습니다. 하지만 가장 먼저 확인할 부분은 바로 서버측 환경입니다. 

 

출처 : https://webisfree.com/2018-05-25/asp-net-%ED%95%9C%EA%B8%80-%EA%B9%A8%EC%A7%90-%ED%98%84%EC%83%81-%EC%9D%B8%EC%BD%94%EB%94%A9-%ED%95%B4%EA%B2%B0%EB%B0%A9%EB%B2%95

반응형
반응형


. 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

반응형
반응형

Blazor와 C#으로 풀스택 웹 개발하기

Blazor — Full-stack web development with C# and WebAssembly

 

웹 어셈블리는 웹 프론트엔드 관련 기술들 중에서도 가장 넓은 범용성을 발휘하는, 비교적 최근에 태동한 새로운 기술입니다. 계속해서 우리나라 안에서는 논란이 되고 있는 ActiveX 기술이나 Java Virtual Machine이나 Adobe Flash 같은 Rich Internet Application, 혹은 Google의 NaCl (Native Client) 같은 기술을 연상하게 하는 측면도 있습니다.

그렇지만 이전과 달리 웹 어셈블리는 Microsoft, Google, Firefox, Apple 등 업체를 가리지 않고 모두가 공통적인 스펙을 지원하도록 생태계가 만들어지고 있으며, 이전처럼 특정 업체가 본인들의 이상향만을 무리하게 밀어넣지 않도록 한다는 점에 있어서 다르다고 할 수 있습니다.

 

그 와중에, 업계에서 유의미한 수준으로 웹 어셈블리를 다룰 수 있도록 해주는 기술 세트가 새롭게 발표되었으며, 개인적으로는 여기에 많은 관심을 두기 시작하였습니다. 바로 Blazor (블레이저)라는 새로운 웹 프레임워크입니다.

Blazor는 Microsoft가 오픈 소스로 공개한 웹 어셈블리 기반 웹 프레임워크 기술 집합입니다.

 

Blazor는 무엇인가

Blazor는 .NET Core의 프로젝트 빌드 시스템을 활용하여, Mono 런타임과 여러분이 참조하게 될 각종 라이브러리, 그리고 여러분의 웹 UI 코드와 C# 코드를 한 데 묶어 브라우저에서 직접 실행 가능하게 만들어줍니다.

이 때, 빠른 전송 속도를 유지할 수 있도록 꼭 필요한 최종 실행 코드만을 남기도록 최적화를 해주기 때문에, 여러분이 알고 있는 무거운 닷넷 프레임워크 기반 애플리케이션과는 양상이 다릅니다.

말로만 들어보면 굉장히 그럴싸해보입니다. 그런데 한 가지 궁금한 점이 생깁니다.

실버라이트에 비해서 무엇이 달라진 것일까?

실버라이트와 같이 C#을 사용하고, 닷넷 런타임을 제공하기 때문에 꽤나 비슷해 보입니다. 그러나 블레이저는 실버라이트가 아닙니다.

 

브라우저가 웹 어셈블리에 대한 처리가 가능하다면, 실버라이트처럼 별도의 ActiveX 컨트롤 없이 오로지 브라우저의 처리 능력에만 기대어 실행합니다. 그리고 이 웹 어셈블리는 여러 최신 브라우저들이 예외없이 모두 지원하는 정식 기술입니다.

 

그리고 UI를 만들기 위해서 복잡한 IDE나 디자인 도구를 이용하지 않고, HTML 태그와 C# 코드만을 이용하여 코드를 작성하기 때문에, XAML이라는 새로운 수단을 배워야 했던 이전과는 다릅니다.

여기에 더하여 ASP.NET MVC의 Razor 뷰 문법을 기반으로 하기 때문에 뷰에서 직접 조건문이나 반복문을 즉석에서 사용하거나, 클래스/변수 정의를 바로 할 수 있습니다.

 

마지막으로 블레이저는 데스크톱 뿐만 아니라 모바일도 지원합니다. 웹 어셈블리를 지원하는 모든 모바일 브라우저에서 사용이 가능합니다. (참고 — https://caniuse.com/#search=webassembly, 2018년 8월 현재 iOS 사파리, Android Chrome에서 WebAssembly 실행이 지원됩니다.)

 

이미 업계에서 C#은 Windows Forms, WPF와 같은 오래된 기술 뿐 아니라, 최근 Windows 10의 등장과 함께 계속해서 진화해나가고 있는 UWP, 화제의 Android/iOS 동시 지원 UI 프레임워크인 Xamarin, 모바일 게임 개발의 대표 주자인 Unity 등 쓰이지 않는 곳이 없는 전천후 프로그래밍 언어가 되었습니다.

 

이러한 C#을 이용하여 이제 React나 NodeJS에서 다루던 프론트엔드를 다룰 수 있다면 이 만한 이상향도 없을 것입니다.

아직 갈길이 멀고, 실험적인 성격이 짙으며, 지금 프로덕션에 도입하기에는 무리가 있음에도, 블레이저가 많은 사람들의 주목을 받는 것은 이 때문입니다.

 

Blazor 맛보기

https://blazor-demo.github.io/ 에 접속하면 실제로 컴파일된 Blazor 앱을 실행해보실 수 있습니다.

Blazor 샘플 앱의 동작 예시, 화면 우측의 Network 탭의 결과에 주목해주세요.

화면 우측의 Network 탭에서 보여지듯이, mono.wasm 파일을 시작으로 우리가 기존에 알던 닷넷 어셈블리 코드들을 그대로 가져오는 것을 볼 수 있습니다. 즉, 웹 어셈블리를 이용하여 Mono 런타임을 구현하고, 나머지는 기존의 MSIL 코드를 그대로 이용하는 것입니다.

 

그리고 그 후에는, 자바스크립트로 처리하던 일들을 C#으로 작성하여 컴파일한 MSIL 코드들이 대신 처리하게 됩니다.

이 과정들을 요약한 아키텍처 이미지는 다음과 같습니다.

Blazor의 아키텍처

또한 핵심 런타임에 해당하는 mono.wasm 파일과 다른 클래스 라이브러리들은 GZIP 압축과 캐싱 정책을 이용하여 최초 한 번만 다운로드를 받게 되므로 속도와 데이터 전송량에 대한 걱정도 조금 덜 수 있습니다. 물론 더 개선될 여지가 많이 있습니다.

 

Blazor로 첫 애플리케이션 만들어보기

C#을 다루는 많은 개발자가 그러하듯, 저는 Windows를 기본 OS로 사용하여 개발을 진행합니다. 그래서 이 아티클에서도 일단은 Visual Studio 2017과 Windows 10을 기준으로 설명합니다.

하지만, Visual Studio로 할 수 있는 개발과는 별개로 지금 만들 코드는 macOS, Linux, 그리고 Docker에서도 실행할 수 있는 엄연한 크로스플랫폼 코드입니다.

Blazor를 이용하여 프론트엔드 코드를 작성하기 위해서는 최소한 다음의 구성 요소가 필요합니다.

  • .NET Core 2.1 SDK — http://dot.net 에서 설치할 수 있습니다. macOS, Windows, Linux를 모두 지원합니다.
  • Blazor Project Template — dotnet new -i Microsoft.AspNetCore.Blazor.Templates 명령으로 템플릿을 닷넷 코어에 설치할 수 있습니다.

그리고 Visual Studio 2017의 경우에는 다음의 구성 요소가 필요합니다.

모든 설치가 끝나면, 커맨드라인에서는 아래와 같이 새 프로젝트를 만들 수 있습니다.

1 dotnet new blazor -n MyBlazorTest

또는 Visual Studio 2017을 실행하고, 다음과 같이 새 ASP.NET 코어 웹 프로젝트를 만들도록 합니다.

새 ASP.NET Core 웹 애플리케이션 생성

이어서 나타나는 템플릿 선택 대화 상자에서는 Blazor 템플릿을 선택합니다.

Blazor 템플릿을 선택하고, OK 버튼을 클릭합니다.

프로젝트를 새로 만든 후 결과물을 살펴보면, Pages 폴더에는 우리가 아는 실제 페이지들의 CSHTML 코드가, 그리고 Shared 폴더에는 레이아웃과 함께 여러 페이지에서 공통으로 쓰일 수 있을만한 컴포넌트들이 들어있습니다.

프로젝트를 만들고나서 구성을 살펴보면 그렇게 복잡하지 않은 구성을 가지고 있고, 한눈에 내용이 파악되실 겁니다.

Blazor 프로젝트의 구성. 기본은 ASP.NET Core 프로젝트입니다.

실제 Blazor 애플리케이션을 실행해보면 Index.cshtml 파일의 내용이 화면에표시되는 것을 볼 수 있을 것입니다. 아래 코드를 보면 / 경로에 대해 Index.cshtml 이 표시되도록 @page 지시자를 사용했기 때문입니다.

 

 

@page "/"1
<h1>Hello, world!</h1> Welcome to your new app.
<SurveyPrompt Title="How is Blazor working for you?" />

 

그리고 SurveyPrompt 라는 태그는 Shared 디렉터리의 SurveyPrompt.cshtml 이라는 컴포넌트를 가져와서 사용한 것인데, 이 컴포넌트는 결국 프로젝트 상단의 _ViewImports.cshtml 에서 가져오도록 설정한 네임스페이스 안에 포함되어있는 것입니다. 그리고 네임스페이스의 규칙은 프로젝트 내의 폴더 경로들과 같습니다.

 

그리고 정말 중요한 내용을 가지고 있는 샘플이 또 있습니다. Counter.cshtml 파일의 내용을 열어보면 다음과 같이 만들어져있습니다.

@page "/counter"
<h1>Counter</h1> 
<p>Current count: @currentCount</p> 
<button class="btn btn-primary" onclick="@IncrementCount">Click me</button>
@functions { int currentCount = 0; void IncrementCount() { currentCount++; } }

버튼을 클릭했을 때 카운트 값을 올리기 위한 동작을 구현하고 있는 것을 볼 수 있습니다. 흥미로운 것은, 버튼에 대한 클릭 이벤트 구현을 담고 있는 메서드의 이름을 @ 지시자로 지정하고 있는 부분인데, 문법만 맞으면 마치 C#에서 대리자를 사용하던 것과 같이 함수의 이름을 지정하거나, 아예 저 부분에 람다식을 대입할 수도 있습니다.

 

그리고 currentCount 라는 변수에 별다른 장치가 없으며, 그저 뷰에서 @currentCount 로 연결짓기만 했을 뿐입니다. 값이 동적으로 변경되는 것을 보기 위해서 뭔가 더 해주어야 할 것 같지만, 이 부분에 대한 바인딩 처리를 Blazor가 모두 대행해줍니다. 즉, 코드가 매우 간결해지게 됩니다.

좀 더 복잡하고 실용적인 예제를 보고 싶으시다면, 이어서 FetchData.cshtml 파일에 네트워크 통신, 비동기 처리, 의존성 주입, 그리고 데이터 반복문 처리에 대한 내용이 모두 들어있습니다.

@inject HttpClient Http

 

아쉽게도 Blazor는 엄연히 브라우저의 샌드 박스 안에서 실행되기 때문에, 주어지는 자유도에는 걸맞지 않게 웹 브라우저가 제공하는 딱 그만큼의 네트워크 기능, 즉 HTTP/HTTPS 통신만을 지원합니다. 그래서 HttpClient (맞습니다. 닷넷 프레임워크의 그 HttpClient 입니다.) 를 이용하여 통신을 시도하게 됩니다.

protected override async Task OnInitAsync() {
	forecasts = await Http.GetJsonAsync<WeatherForecast[]>("sample-data/weather.json"); 
}

 

컴포넌트가 시작하자마자 수행할 작업은 OnInitAsync 라는 추상 함수를 재정의하여 만들 수 있습니다.

프로젝트의 코드 구조와는 별개로 브라우저 입장에서 상대 경로를 사용하게 되므로, wwwroot 디렉터리 내부의 sample-data/weather.json 파일의 내용을 마치 API 호출 결과처럼 다운로드하여 사용하게 됩니다. 그리고 async와 await 키워드를 사용하여 비동기 작업을 처리합니다.

 

좀 더 자세히 프로젝트 살펴보기

보시다시피 Blazor 프로젝트의 기본 뼈대는 ASP.NET Core 프로젝트입니다. 하지만 혼동하지 말아야 할 것은, 앞에서도 이야기하였듯이 Blazor는 C#을 사용하고 있지만 서버 사이드 프로젝트가 아니라는 점입니다.

wwwroot 디렉터리는 Blazor의 실행에 필요한 웹 어셈블리 코드를 띄워주는 정적 페이지들을 담고 있는 디렉터리입니다. Blazor의 결과물이 만들어지면 웹 콘텐츠를 정상적으로 제공할 수 있는 어떤 종류의 서버이든 Blazor 애플리케이션을 제공할 수 있습니다. 그리고 index.html 파일에는 여러분이 선호하는 자바스크립트나 타입스크립트 라이브러리를 추가할 수 있습니다.

그리고 Startup.cs 가 Blazor 응용프로그램의 기본 시작점이 됩니다. Program.cs 에 들어있는 Main 메서드는 ASP.NET Core를 위한 코드입니다.

프로젝트 루트에 들어있는 _ViewImports.cshtml 파일은 같은 디렉터리에 속하는 다른 CSHTML 파일들에 자동으로 포함시킬 네임스페이스 가져오기 구문들 또는 미리 공통으로 포함시킬 컴포넌트를 지정할 수 있도록 되어있습니다. 주로 여기에 마스터 레이아웃 같이 공통적으로 쓰이는 구성 요소를 배치한다고 보면 되겠습니다.

Blazor의 진짜 힘 — 공유 프로젝트와 NuGet 패키지

너무 당연한 부분이라 언급할 필요가 없을진 모르겠지만, 기존에 가지고 있던 C# 프로젝트의 모델 클래스들을 담아놓은 공유 프로젝트가 있다면 당연히 Blazor에서 가져와서 쓸 수 있습니다.

그리고 NuGet 패키지가 특정 시스템이나 버전에 종속된 것이 아니고, 닷넷 스탠다드나 모노를 기반으로 하는 경우에는 충분히 재사용할 수 있습니다. 단, 아직은 개발 중인 기능이라 약간의 조치가 더 필요하긴 합니다.

이해를 돕기 위한 예를 들면, Blazor의 기본 JSON 처리 기능 대신 잘 알려진 Newtonsoft JSON 라이브러리를 대신 사용하기로 했다고 가정해보겠습니다. 일단 Blazor 프로젝트에 NuGet 라이브러리를 추가한 후, Index.cshtml 페이지에 다음과 같은 코드를 추가해보겠습니다.

<p>@(Newtonsoft.Json.JsonConvert.SerializeObject(new { name = "Paul", age = 15 }))</p>

 

그리고 앞서 이야기한대로 약간의 조치가 필요합니다. 프로젝트 csproj 파일을 편집하는 메뉴를 클릭하여 텍스트 에디터를 엽니다. (참고: .NET Core 계통 프로젝트들은 Visual Studio 솔루션 탐색기에서 직접 텍스트로 편집할 수 있는 기능을 제공합니다.)

 

그리고 아래의 코드 블록을 Project 태그 하위 레벨에 추가하도록 합니다.

<ItemGroup> <BlazorLinkerDescriptor Include="Linker.xml" /> </ItemGroup>

 

이어서 Linker.xml 파일의 내용은 다음과 같이 추가합니다. 단, 프로젝트 이름 부분만 여러분의 프로젝트 이름을 대신 넣어주도록 합니다.

<?xml version="1.0" encoding="utf-8" ?> 
<linker> 
	<assembly fullname="mscorlib"> 
   	 	<!-- Preserve all methods on WasmRuntime, because these are called by JS-side code to implement timers. Fixes https://github.com/aspnet/Blazor/issues/239 --> 
    	<type fullname="System.Threading.WasmRuntime" /> 
    </assembly> 
    <assembly fullname="System.Core"> 
    	<!-- This is required by JSon.NET and any expression.Compile caller --> 
    	<type fullname="System.Linq.expressions*" /> 
   	</assembly> 
    <!-- Name of the entry point assembly --> 
    <assembly fullname="프로젝트 이름" /> 
</linker>

 

이렇게 하고 프로젝트를 빌드 후 실행해보면 정말 Newton JSON 라이브러리를 브라우저에서 복잡한 과정 없이 그대로 가져다 쓸 수 있다는 것을 확인하실 수 있습니다.

Newtonsoft JSON 라이브러리를 이용하여 JSON Serialization 한 결과를 표시

 

더 알아보기

Blazor에 대한 관심도가 높기 때문에, 생각보다 다양한 곳에서 의미있는 리소스를 쉽게 찾을 수 있습니다. 저의 관심사 위주로 몇 가지 리소스들에 대한 언급을 추가해보았습니다.

그리고 저는 최근에 Korea Blazor User Group을 새로 만들었습니다. 새로운 웹 프레임워크에 대한 호기심, 그리고 기존에 알고 있던 C#과 닷넷의 새로운 모습을 보고 싶으신 분들 모두 환영합니다.

Korea Blazor User Group 바로 가기: https://www.facebook.com/groups/kblug/

 

출처 : http://blog.daum.net/dosman1/2076

반응형

'ASP.NET > Blazor' 카테고리의 다른 글

Blazor 설치와 Azure 세팅  (0) 2020.06.17

+ Recent posts