login register Sysop! about ME  
qrcode
    최초 작성일 :    2012년 06월 17일
  최종 수정일 :    2012년 06월 17일
  작성자 :    Jake
  편집자 :    Jake (류 지형)
  읽음수 :    28,502

강좌 목록으로 돌아가기

필자의 잡담~

이번 컬럼을 편역하신 분은 류지형님이며, 원문은 http://www.asp.net/mvc/tutorials/controllers-and-routing/aspnet-mvc-controllers-overview-cs 입니다. 이 컬럼은 ASP.NET MVC 중 컨트롤러에 대한 기본 개념을 소개하고 있습니다.

이 글은 ASP.NET MVC 공식 컬럼인 http://www.asp.net/mvc/tutorials/controllers-and-routing/aspnet-mvc-controllers-overview-cs의 글을 편역한 내용입니다. 마이크로소프트의 공식 번역 문서가 아니며 태오 사이트 MS 컬럼 번역팀에서 번역한 내용입니다. 그렇기에, 일부 오역이나 오타가 존재할 수 있는 점 미리 양해를 구합니다. 원문에 대한 모든 저작권은 마이크로소프트에 있으며, 컬럼 내용과 관련한 질의 문답 역시 원문 사이트에 문의하시는 것을 추천드립니다.

ASP.NET MVC 컨트롤러 개요

역자 류지형입니다. 이 글은 컨트롤러의 개요를 알아보는 것으로 Controllers(컨트롤러), Controller Action(컨트롤러 액션), Action Result(액션 결과)의 세 가지 개념과 그들의 상관관계를 알아보는 것이 목적입니다. 번역문에서는 조금 어색하더라도 "컨트롤러 액션", "액션 결과"라는 표현을 계속 사용하는데 "컨트롤러 액션"은 컨트롤러의 동작을 정의하는 메서드이며, "액션 결과"는 여러 형태의 결과를 표현하기 위해서 ActionResult 클래스를 상속하는 개체입니다. 액션 결과에는 여러 종류가 존재하는데 이들은 뷰의 생성과 밀접한 관련이 있다고 생각할 수 있습니다.

독자가 모델, 뷰, 컨트롤러의 개념이 정확하지 않다면 아래의 그림이 도움이 될 것입니다. 컨트롤러는 사용자의 입력 값과 브라우저에 돌려 줄 정보를 관리하는 책임을 갖습니다. 모델, 뷰는 다른 글을 통해 더욱 자세히 알아보게 될 것입니다.

그럼, 이제 원문에 대한 편역을 시작해 보겠습니다.


이 자습서에서 저자 스테판은 ASP.NET MVC 컨트롤러를 소개합니다. 컨트롤러를 새롭게 만드는 법과 다른 종류의 액션 결과를 반환하는 법을 살펴봅니다. 주로 다룰 내용은 컨트롤러, 컨트롤러 액션, 액션 결과이며 이 장을 마친 후에는, 사용자와 ASP.NET MVC 웹사이트 간에서 컨트롤러가 하는 역할을 이해하게 될겁니다.

컨트롤러 이해하기

MVC 컨트롤러는 ASP.NET MVC 웹사이트에 대한 요청이 들어올 때 이에 응답하는 책임을 가지고 있습니다. 각각의 요청은 특정 컨트롤러와 연결되는데요. 예를 들면,

http://localhost/Product/Index/3

위의 URL을 브라우저에 입력하면 ProductController 라는 컨트롤러가 호출됩니다. 이 컨트롤러는 브라우저의 요청에 대해 특정 뷰를 돌려 주거나 또는 다른 컨트롤러로 요청을 전달할 수도 있습니다. [목록 1]은 간단한 컨트롤러인 ProductController 를 구현하고 있습니다.

목록 1 - Controllers\ProductControllers.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;

namespace MvcApplication1.Controllers
{
    public class ProductController : Controller
    {
        //
        // GET: /Products/
        public ActionResult Index()
        {
            // Add action logic here
            return View();
        }
    }
}

[목록 1]에서 볼 수 있듯이 이 컨트롤러는System.Web.Mvc.Controller 클래스를 상속받는 VB.NET 또는 C#의 클래스입니다. 따라서, 부모 클래스에 구현된 유용한 메서드를 사용할 수 있는데요. 이 부분은 잠시 후에 알아보도록 하겠습니다.

컨트롤러 액션 이해하기

컨트롤러는 컨트롤러 액션을 노출합니다. 액션은 특정 URL에 대한 요청이 들어올 때 호출되는 컨트롤러 상의 메서드인데요. 예를 들면,

http://localhost/Product/Index/3

와 같은 URL 요청이 들어오면, ProductController클래스의 Index() 메서드가 호출됩니다.

컨트롤러 액션은 컨트롤러 클래스의 public 메서드여야 합니다. 기본적으로 C#에서는 접근 지정자(Access Modifier)를 지정하지 않는 경우, private 으로 동작하기 때문에 액션을 만들 때 public으로 지정하는 것에 주의해야 합니다. 또한, 컨트롤러 클래스의 모든 public 메서드는 액션으로 노출되기 때문에, 누구든지 URL 조작만으로 액션을 호출할 수 있다는 점을 염두에 두고 설계해야 합니다.

액션 결과 이해하기

컨트롤러 액션은 소위 액션 결과라는 것을 반환합니다. 액션 결과는 컨트롤러 액션이 브라우저 요청에 대해 반환하는 것을 의미합니다.

ASP.NET MVC 프레임워크는 아래와 같은 종류의 액션 결과를 지원합니다.

  1. ViewResult - HTML과 같은 마크업을 표현
  2. EmptyResult - 결과가 없다는 것을 의미
  3. RedirectResult - 새로운 URL로 원래 요청이 재전송됨을 표현
  4. JsonResult - AJAX 어플리케이션에서 사용할 수 있는 JSON(자바스크립트 개체 표기법)을 표현
  5. JavaScriptResult - 자바스크립트를 표현
  6. ContentResult - 텍스트 결과를 표현
  7. FileContentResult - 다운로드 가능한 파일을 바이너리 컨텐츠와 함께 표현
  8. FilePathResult - 다운로드 가능한 파일을 경로로 표현
  9. FileStreamResult - 다운로드 가능한 파일을 파일 스트림으로 표현

위의 모든 액션 결과는 ActionResult 클래스를 상속합니다. 대부분의 경우, 컨트롤러 액션은 [목록2]에서와 같이 ViewResult를 반환합니다(역자 주: 예제 소스는 반환 시에 View() 메서드를 호출하고 있는데요. 이 메서드는 부모 클래스인 Controller에 정의되어 있으며, 내부적으로 ViewResult를 생성해서 반환합니다. 또한, 예제와 같이 View 메서드에 아무런 매개변수도 전달되지 않을 경우에는 액션 이름이 기본 매개변수로 사용됩니다. 즉, 부모 클래스의 View() 메서드를 호출하면서 Index라고 이름 지어진 뷰를 사용하여 ViewResult를 반환하라는 의미로 해석할 수 있다는 것입니다).

목록2 - Controllers\BookController.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;

namespace MvcApplication1.Controllers
{
    public class BookController : Controller
    {
        public ActionResult Index()
        {
            // Add action logic here
            return View();
        }
    }
}

액션이 ViewResult를 반환할 경우에는 HTML이 브라우저로 반환됩니다. [목록 2]의 Index() 메서드는 Index라고 이름 지어진 뷰를 브라우저에 반환합니다.

[목록 2] 의 Index() 액션은 ViewResult()를 반환하는 대신, 부모 클래스인 Controller 클래스의 View() 메서드를 호출하고 있다는 점에 주목하세요. 일반적으로, 액션 결과를 직접 반환하기 보다는 부모 클래스(Controller)에 이미 정의되어 있는 메서드 중 하나를 호출하는 것이 보편적입니다. 다음은 이를 위해 사용 가능한 메서드들을 보여주고 있습니다.

  1. View - ViewResult 액션 결과 반환
  2. Redirect - RedirectResult 액션 결과 반환
  3. RedirectToAction - RedirectToRouteResult 액션 결과 반환
  4. RedirectToRoute - RedirectToRouteResult 액션 결과 반환
  5. Json - JsonResult 액션 결과 반환
  6. JavaScriptResult - JavaScriptResult 액션 결과 반환
  7. Content - ContentResult 액션 결과 반환
  8. File - 메서드와 함께 전달된 파라미터에 따라 FileContentResult, FilePathResult, FileStreamResult 액션 결과 반환

따라서, 브라우저로 뷰를 반환하고 싶다면 View() 메서드를 호출하면 되고, 사용자 요청을 다른 컨트롤러로 전달하는 경우에는 RedirectToAction() 메서드를 호출하면 됩니다. 예를 들면, [목록 3]의 Details() 액션은 Id 파라미터가 값을 갖고 있느냐의 여부에 따라 뷰를 출력하거나 또는 사용자 호출을 Index() 액션으로 전달합니다.

목록 3 - CustomerController.cs

using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    public class CustomerController : Controller
    {
        public ActionResult Details(int? id)
        {
            if (!id.HasValue)
                return RedirectToAction("Index");

            return View();
        }

        public ActionResult Index()
        {
            return View();
        }
    }
}

ContentResult 액션 결과의 경우는 조금 특별합니다. 개발자는 일반 텍스트를 반환하기 위해서 ContentResult 액션 결과를 사용할 수 있습니다. 예를 들어, [목록 4]의 Index() 메서드는 HTML이 아닌 일반 텍스트를 반환합니다.

목록 4 - Controllers\StatusController.cs

using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    public class StatusController : Controller
    {
        public ActionResult Index()
        {
            return Content("Hello World!");
        }
    }
}

StatusController.Index() 가 실행될 경우에는, 뷰가 반환되는 것이 아니라 텍스트인 "Hello World!"가 브라우저로 반환됩니다.

컨트롤러 액션이 액션 결과가 아닌 것(예: 날짜, 정수)을 반환하는 경우에는, 자동으로 ContentResult로 래핑됩니다. 예를 들어, [목록 5]의 Index() 액션이 실행되는 경우에는 날짜가 ContentResult 래핑되어 반환됩니다. 따라서, 컨트롤러에서 ActionResult 개체를 반환하지 않는 경우에는 텍스트로 변환된다고 가정할 수 있겠습니다.

목록 5 - WorkController.cs

using System;
using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    public class WorkController : Controller
    {
        public DateTime Index()
        {
            return DateTime.Now;
        }
    }
}

[목록 5]의 Index() 메서드는 DateTime 개체를 반환하고 있지만, ASP.NET MVC 프레임워크가 DateTime 개체를 string 으로 변환하고 그 값을 ContentResult 라는 액션 결과로 래핑합니다. 그 결과, 브라우저는 날짜와 시간을 텍스트로 받게 되는 겁니다.

요약

이 자습서의 목적은 ASP.NET MVC의 컨트롤러, 컨트롤러 액션, 액션 결과를 소개하는 것입니다. 첫번째 섹션에서 새로운 컨트롤러를 MVC 프로젝트에 어떻게 추가하는지 알아봤고 이어서 컨트롤러의 public 메서드가 컨트롤러 액션으로 사용된다는 것을 알게 됐습니다. 마지막으로 컨트롤러 액션으로부터 반환될 수 있는 다양한 종류의 액션 결과를 살펴 봤습니다. 컨트롤러 액션이 반환하는 액션 결과 중 특별히 ViewResult, RedirectToActionResult, ContentResult는 예를 들어 검토해 보았습니다.


역자 류지형은 현대자동차 영국법인에서 Application Architect로 근무하고 있습니다. SAP ERP, Oracle’s Siebel CRM 등의 기업 솔루션을 운영하며 마이크로소프트 제품과의 조화를 꾀하고 있습니다. 한국에서는 인브레인에 재직하며 닷넷을 시작했고 여전히 ASP.NET을 주 기술로 사용하고 있습니다.

Nikon D7000을 사랑하는 아빠진사이며 Photoshop에 눈뜬 후 iMac을 장만하기 위해 핑계 거리를 찾다보니 사과 세계에도 관심을 갖고 있습니다. 글로서 도움 되는 일이 행복하며 아이와 함께하는 유럽여행을 iBook 으로 출판하는 것이 사추기에 정한 인생의 목표입니다.


authored by

  NEOAMURO
  2012-11-02(15:53)
약간 난해할 수도 있는 내용을 쉽게 간추려서 설명 잘 해주셨네요... 감사합니다^^;

 
 
.NET과 Java 동영상 기반의 교육사이트

로딩 중입니다...

서버 프레임워크 지원 : NeoDEEX
based on ASP.NET 3.5
Creative Commons License
{5}
{2} 읽음   :{3} ({4})