'소프트웨어개발/C#'에 해당되는 글 2건

  1. ASP.NET 2.0 환경에서 ViewModel 적용하기
  2. [C#] HTTP GET/POST 메써드로 JSON 문자열 주고 받기

ASP.NET 2.0 환경에서 ViewModel 적용하기

웹 개발의 표준이 된 MVC

웹 개발에 있어서 MVC(Model-View-Controller)는 이제 보편화된 디자인 패턴이 되었다. 각 담당 영역을 분리하여 생산성과 유지보수성을 현저히 높일 수 있기 때문에 현재 웹 개발에 있어 언어를 막론하고 사실상의 표준으로 군림하고 있다. 이러한 MVC 패턴의 구현체로 대표적인 프레임워크는 Java 진영의 Spring MVC, PHP 진영의 Lavavel, .NET 진영의 ASP.NET MVC가 있다.

ASP.NET 2.0을 사용할 수 밖에 없다면?

현재 ASP.NET MVC는 5까지 발표되었지만 ASP.NET 2.0을 사용할 수 밖에 없는 환경이라면 그림의 떡일 뿐이다.(주로 기존 시스템의 유지보수에 해당한다.) ASP.NET 2.0 환경에서 현대적인 HTML5 기반의 웹 사이트를 개발하기 위한 방법을 소개하고자 한다.

ASP.NET 2.0 환경에서 HTML5 웹 사이트 개발시 고려할 점은?

  • 서버 컨트롤에 의한 DOM 구현 및 접근을 최소화해야 한다. ASP.NET 2.0 자체로 매우 강력한 DOM 구현 기능을 제공하지만 JavaScript의 기능이 강력해진 현재에는 혼란만 일으킬 뿐이다.
  • View가 되는 소스(.aspx)에 서버 코드의 개입을 최소화해야 한다. 이는 MVC 패턴이 적용된 현대의 JSP에도 적용되는 개념이다. 각 화면에 출력되는 데이터는 ViewModel 오브젝트로 따로 정의하며 View에서는 ViewModel을 출력하는 용도로만 서버 코드의 개입을 허용한다.

ViewModel 적용한 예제 작성하기

아래 소개할 ViewModel 적용 예제는 Microsoft Visual Studio Community 2013(5인 이하에 한해 완전 무료)을 기준으로 작성되었다. File -> New Web Site -> .NET Framework 2.0 -> ASP.NET Empty Web Site를 선택하여 새로운 웹 애플리케이션 프로젝트를 생성한 후 아래와 같이 소스 코드를 작성한다. 프로젝트명은 ViewModelExample이다.

/ViewModelExample/Player.cs

using System;
using System.Collections.Generic;
using System.Web;

namespace ViewModelExample
{
    public class Player
    {
        public string Name { get; set; }
        public int No { get; set; }
    }
}
  • 예제는 NBA 1997-1998 시즌의 시카고 불스 팀 주전 멤버의 선수 이름 및 등번호를 출력할 것이다. 이를 위해 Model에 해당하는 Player 클래스를 작성한다.

/ViewModelExample/PlayerViewModel.cs

using System;
using System.Collections.Generic;
using System.Web;

namespace ViewModelExample
{
    public class PlayerViewModel
    {
        public Player MvpPlayer { get; set; }
        public List<Player> AllPlayers { get; set; }
    }
}
  • 화면에 출력될 데이터를 담을 ViewModel 클래스이다. ASP.NET 2.0은 각 .aspx 확장자마다 Code-behind라고 불리우는 .aspx.cs 파일을 옵션으로 제공한다. 이 클래스는 Code-behind 파일에서 사용될 것이다.
  • ASP.NET MVCViewModel에 대응되는 용도로 ViewData, ViewBag이란 클래스를 제공한다.

/ViewModelExample/Player.aspx/Player.aspx.cs

using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace ViewModelExample
{
    public partial class _Default : System.Web.UI.Page
    {
        public PlayerViewModel viewModel = new PlayerViewModel();

        protected void Page_Load(object sender, EventArgs e)
        {
            Player mvpPlayer = new Player();
            mvpPlayer.Name = "Michael Jordan";
            mvpPlayer.No = 23;
            viewModel.MvpPlayer = mvpPlayer;
            viewModel.AllPlayers = new List<Player>();
            viewModel.AllPlayers.Add(mvpPlayer);

            Player player2 = new Player();
            player2.Name = "Scottie Pippen";
            player2.No = 33;
            viewModel.AllPlayers.Add(player2);

            Player player3 = new Player();
            player3.Name = "Dennis Rodman";
            player3.No = 91;
            viewModel.AllPlayers.Add(player3);

            Player player4 = new Player();
            player4.Name = "Luc Longley";
            player4.No = 13;
            viewModel.AllPlayers.Add(player4);

            Player player5 = new Player();
            player5.Name = "Ron Harper";
            player5.No = 9;
            viewModel.AllPlayers.Add(player5);
        }
    }
}
  • 화면 출력을 담당할 Player.aspx라는 이름의 Web Form 파일을 새로 생성한다. 생성과 동시에 앞서 언급한 Player.aspx.cs라는 이름의 Code-behind 파일이 생성되는데 위와 같이 작성한다.
  • 5명 선수의 이름과 등번호를 화면에 출력할 viewModel 오브젝트에 저장하는 역할을 수행한다. 만약 프로덕션 레벨이라면 데이터베이스로부터 데이터를 획득하여 viewModel 오브젝트에 저장하는 로직이 작성될 것이다.

/ViewModelExample/Player.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Player.aspx.cs" Inherits="ViewModelExample._Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>ViewModel Example</title>
</head>
<body>
    <h1>MvpPlayerName</h1>
    <h4><%= viewModel.MvpPlayer.Name %></h4>
    <h1>MvpPlayerNo</h1>
    <h4><%= viewModel.MvpPlayer.No %></h4>
    <h1>AllPlayers</h1>
    <table>
        <% for (int i = 0; i < viewModel.AllPlayers.Count; i++) { %>
        <tr>
            <td>
                <%= viewModel.AllPlayers[i].Name %>
            </td>
            <td>
                <%= viewModel.AllPlayers[i].No %>
            </td>
        </tr>
        <% } %>
    </table>
</body>
</html>
  • 첫 줄의 <%@ Page Language="C#" ... %>를 통해 서버 코드를 C#으로 작성하였다는 것을 명시하였다.(VB도 가능하다.)
  • <%= ... %>viewModel 오브젝트의 각 요소를 출력할 수 있다. 배열, 리스트 출력시 <% for ... %>를 사용한다.
  • 위와 같은 ASP.NET 코드는 최종적으로 .cs 코드로 컴파일되어 사용자에게 완전한 .html 파일로 출력된다.(이 과정은 JSPServlet으로 컴파일되는 방식과 유사하다.)
  • 위와 같이 서버 코드의 사용을 ViewModel 오브젝트의 출력으로 제한한다면 현대적인 개념의 JavaScript 프레임워크를 사용하여 얼마든지 HTML5 기반의 코드를 작성할 수 있다.

실행 화면


참고 글

저작자 표시 비영리 동일 조건 변경 허락
신고

[C#] HTTP GET/POST 메써드로 JSON 문자열 주고 받기

이미 오래전부터 신규 시스템 개발은 웹 개발이 대세이다. 하지만 내가 소속된 제조업 전산실처럼 .NET 기반의 클라이언트 시스템을 개발하는 곳도 아직 적지 않다. .NET 3.5 기반의 클라이언트에서 웹 서버와 JSON(JavaScript Object Notation) 문자열로 통신이 가능하다면 클라이언트에 불필요하게 비즈니스 로직이 삽입되는 것을 예방할 수 있고 Java가 되었든 Node.js가 되었든 웹 서버의 구현 방식에 따라 다양한 언어로 비즈니스 로직을 작성할 수 있다. 그 방법을 예제를 통해 간단히 설명하겠다.

HTTP GET 메써드 요청하기

C#에서 HTTP 요청은 System.Net.WebClient 클래스를 사용하여 수행한다. HTTP GET 요청은 아래와 같이 한다. 응답 데이터는 JSON 문자열을 가정했지만 특별히 제약사항은 없다.


string uri = "http://someRquest";
WebClient webClient = new WebClient();
Stream stream = webClient.OpenRead(uri);
string responseJSON = new StreamReader(stream).ReadToEnd();
  • StreamReader 클래스는 기본적으로 응답 문자열의 캐릭터셋이 UTF-8로 되어 있다. 웹 서버에서 다른 캐릭터셋을 사용한다면 캐릭터셋을 별도로 명시해주어야 한다.
  • StreamReader 클래스의 ReadToEnd() 메써드는 웹 서버가 응답한 JSON 문자열을 반환한다. 응답된 JSON 문자열을 그대로 사용하려면 별도의 파씽 작업이 필요하기 때문에 개발자로서는 매우 번거롭다. Json.NET 외부 라이브러리를 사용하면 이런 수고러움을 덜 수 있다. 아래는 Json.NET을 이용하여 JSON 문자열을 C#의 POCO(Plain Old C# Object) 오브젝트로 변환하는 방법이다. 무척 간단하다. POCO 오브젝트의 구조는 JSON 문자열의 Key:Value 구조와 동일해야 한다.
SomeObject someObject = JsonConvert.DeserializeObject<SomeObject>(someJsonString);

HTTP POST 메써드 요청하기

HTTP POST 요청도 GET 요청과 크게 다르지 않다. 요청시 JSON 문자열로 이루어진 파라메터가 메시지 바디에 추가된다는 것을 고려하여 아래와 같이 작성하면 된다.


string uri = "http://someRquest";
string requestJson = "someJsonRequestString";
WebClient webClient = new WebClient();
webClient.Headers[HttpRequestHeader.ContentType] = "application/json";
webClient.Encoding = UTF8Encoding.UTF8;
string responseJSON = webClient.UploadString(uri, requestJson);
  • StreamReader 클래스가 아닌 WebClient 클래스의 UploadString() 메써드를 사용하기 때문에 응답 문자열의 캐릭터셋을 UTF-8로 명시했다.
  • 앞서 소개한 JSON 문자열의 POCO 오브젝트 변환과 동일한 방법으로 요청 파라메터로 전달할 JSON 문자열을 개발자가 직접 작성하는 것보다 POCO 오브젝트에서 쉽게 변환할 수 있다. 아래와 같이 작성한다.
string someJsonString = JsonConvert.SerializeObject(someObject);

예외처리

HTTP 요청시의 예외처리 수행을 잊지 말아야 한다. 예외처리를 하지 않으면 사용자들에게 불필요한 오류 메시지가 노출된다. System.Net.WebException 예외 클래스를 잡아내어 상황에 맞는 예외처리 로직을 작성하면 된다.

저작자 표시 비영리 동일 조건 변경 허락
신고