컨트롤러: 컨트롤러, 액션 및 액션 결과

등록일시: 2016-10-24 08:00,  수정일시: 2017-01-13 23:51
조회수: 6,815
이 문서는 ASP.NET Core MVC 기술을 널리 알리고자 하는 개인적인 취지로 제공되는 번역문서입니다. 이 문서에 대한 모든 저작권은 마이크로소프트에 있으며 요청이 있을 경우 언제라도 게시가 중단될 수 있습니다. 번역 내용에 오역이 존재할 수 있고 주석은 번역자 개인의 의견일 뿐이며 마이크로소프트는 이에 관한 어떠한 보장도 하지 않습니다. 번역이 완료된 이후에도 대상 제품 및 기술이 개선되거나 변경됨에 따라 원문의 내용도 변경되거나 보완되었을 수 있으므로 주의하시기 바랍니다.
본문에서는 개발자가 ASP.NET Core MVC로 응용 프로그램을 구축할 때 가장 근간이 되는 컨트롤러, 액션 및 액션 결과에 관해서 살펴봅니다.

액션과 액션 결과는 개발자가 ASP.NET Core MVC로 응용 프로그램을 구축할 때 가장 근간이 되는 부분입니다.

컨트롤러

ASP.NET Core MVC에서 컨트롤러(Controller)는 일련의 액션들을 정의하고 분류합니다. 여기서 액션(Action)은 (또는 액션 메서드(Action Method)는) 전달받은 요청을 처리하는 컨트롤러의 메서드를 말합니다. 컨트롤러는 서로 유사한 액션들을 그룹화하고, 공통적인 일련의 규칙들을 (라우팅, 캐싱, 권한 부여 등) 일괄적으로 적용할 수 있는 논리적인 수단을 제공해줍니다. 이때 전달받은 요청은 라우팅(Routing)을 통해서 액션에 매핑됩니다.

ASP.NET Core MVC에서는 이름이 "Controller"로 끝나는 클래스나 "Controller"로 끝나는 클래스를 상속 받는, 인스턴스를 생성할 수 있는 모든 클래스가 컨트롤러가 될 수 있습니다. 컨트롤러는 명시적 의존성 원칙(Explicit Dependencies Principle)을 준수해야 하며, 액션에서 필요한 모든 의존성을 컨트롤러의 생성자에서 의존성 주입(Dependency Injection)을 이용해서 요청해야 합니다.

컨트롤러 클래스는 규약에 따라:

  • 루트-수준의 "Controllers" 폴더에 위치하고
  • Microsoft.AspNetCore.Mvc.Controller를 상속 받습니다.

다만 이 두 가지 규칙이 반드시 필수적인 것은 아닙니다.

모델-뷰-컨트롤러(Model-View-Controller) 패턴에서 컨트롤러는 요청에 대한 초기 처리를 수행하고 모델의 인스턴스를 생성하는 역할을 수행합니다. 일반적으로 업무적인 결정은 모델에서 수행되어야 합니다.

노트

모델은 DbContext나 데이터베이스 관련 형식이 아닌, POCO(Plain Old CLR Object) 형식이어야 합니다.

컨트롤러는 모델의 처리 결과를 받아서 (존재할 경우), 적절한 뷰를 관련된 뷰 데이터와 함께 반환합니다. 이에 관한 보다 자세한 정보는 Overview of ASP.NET Core MVC 문서와 ASP.NET Core MVC 및 Visual Studio 시작하기 자습서 시리즈를 참고하시기 바랍니다.

컨트롤러는 UI 수준의 추상화입니다. 컨트롤러의 역할은 전달받은 요청 데이터가 유효한지 확인하고 반환할 뷰를 (또는 API의 결과를) 선택하는 것입니다. 잘 만들어진 응용 프로그램은 컨트롤러에서 직접 데이터에 접근하거나 컨트롤러에 업무 로직을 구현하지 않으며, 대신 그런 역할을 수행하는 서비스에 위임합니다.

액션 정의하기

컨트롤러 형식에 존재하는 모든 public 메서드는 액션입니다. 액션의 매개변수들은 모델 바인딩(Model Binding)을 통해서 유효성이 검사되고 요청 데이터에 바인딩됩니다.

경고

매개변수를 전달받는 액션 메서드는 ModelState.IsValid 속성이 true 인지 검사해야 합니다.

액션 메서드는 전달받은 요청을 업무 관심사에 매핑하기 위한 로직을 포함하고 있습니다. 일반적으로 업무 관심사는 컨트롤러에서 의존성 주입(Dependency Injection)을 통해서 접근하는 서비스들을 이용해서 표현됩니다. 그런 다음, 액션은 업무 작업의 결과를 응용 프로그램 상태에 매핑합니다.

액션 메서드에서는 어떠한 형식도 반환할 수 있지만, 대부분은 응답을 생성하는 IActionResult의 인스턴스를 (비동기 메서드인 경우에는 Task<IActionResult>의 인스턴스를) 반환하는 경우가 많습니다. 액션 메서드는 반환할 응답의 유형을 선택하는 역할만 수행하며, 액션 결과가 실제로 응답을 처리합니다.

컨트롤러 헬퍼 메서드

필수적인 것은 아니지만, 개발자들은 대부분 컨트롤러가 기본 Controller 클래스를 상속받도록 구현합니다. 그러면 많은 속성들과 다양한 응답의 반환을 지원할 수 있도록 설계된 다음과 같은 헬퍼 메서드들을 포함한 많은 유용한 메서드를 컨트롤러에서 사용할 수 있습니다:

모델을 이용해서 HTML을 렌더하는 뷰를 반환합니다. 예: return View(customer);
HTTP 상태 코드
HTTP 상태 코드를 반환합니다. 예: return BadRequest();
서식화된 응답
Json 또는 그와 유사한 특정 방식으로 개체를 서식화하여 반환합니다. 예: return Json(customer);
콘텐츠 협상 응답
액션에서 개체를 직접 반환하는 대신, 콘텐츠 협상에 따른 응답을 반환합니다 (Ok, Created, CreatedAtRoute 또는 CreatedAtAction을 이용해서). 예: return Ok(); 또는 return CreatedAtRoute("routename",values,newobject");
재지정
다른 액션이나 목적지에 대한 재지정(Redirect)을 반환합니다 (Redirect, LocalRedirect, RedirectToAction 또는 RedirectToRoute를 이용해서). 예: return RedirectToAction("Complete", new {id = 123});

이런 메서드들을 사용하지 않고 액션에서 간단히 개체만 반환할 수도 있습니다. 그런 경우에는 클라이언트의 요청을 기반으로 개체가 서식화됩니다. 보다 자세한 정보는 응답 데이터 서식화 문서를 참고하시기 바랍니다.

횡단 관심사(Cross-Cutting Concerns)

대부분의 응용 프로그램에서는 많은 액션들이 작업 흐름 중 일부분을 공유합니다. 예를 들어, 상당수의 응용 프로그램들은 인증 받은 사용자만 사용할 수 있거나, 응용 프로그램 전반에 캐싱 기능이 적용됩니다. 이렇게 액션 메서드가 실행되기 전이나 후에 특정 로직을 수행하고 싶은 경우에는 필터(Filter)를 활용할 수 있습니다. 필터를 이용해서 이런 횡단 관심사를 처리하면 액션이 불필요하게 비대해지는 것을 방지하는데 도움이 됩니다. 또한, 중복배제(DRY, Don't Repeat Yourself)의 원칙에 따라서 액션 내의 중복을 제거하는 용도로도 도움이 됩니다.

가령, 인증이나 권한 부여가 필요한 경우, 대상이 되는 모든 액션에 Authorize 어트리뷰트를 적용할 수 있습니다. 또는 컨트롤러에 이 어트리뷰트를 적용해서 컨트롤러 내에 존재하는 모든 액션에 적용할 수도 있습니다. 이렇게 어트리뷰트를 추가하면 해당 액션에 대한 모든 요청에 적절한 필터가 적용됩니다. 일부 어트리뷰트들은 필터의 동작을 기반으로 보다 세분화된 제어를 제공하기 위한 목적으로 컨트롤러와 액션 수준 양쪽에 모두 적용할 수도 있습니다. 보다 자세한 정보는 필터 문서와 Authorization 필터 문서를 참고하시기 바랍니다.

MVC 응용 프로그램에서 횡단 관심사의 다른 예로는 다음과 같은 주제들이 있습니다:

노트

MVC 응용 프로그램 내의 많은 횡단 관심사들은 필터를 이용해서 처리가 가능합니다. ASP.NET Core 응용 프로그램에서 사용 가능한, 고려해 볼 만한 또 다른 선택지로는 사용자 지정 미들웨어(Middleware)가 있습니다.