MVC 아키텍처 — 몇 개의 컨트롤러가 필요합니까?


54

나는 한동안 코딩했지만 주로 스크립트와 간단한 응용 프로그램입니다. 나는 Web Apps를 개발하고 적절한 MVC 아키텍처를 사용하는 것에 관한 새로운 역할로 옮겨 갔으므로 필자는 그 모든 것에 대해 매우 빨리 배우려고 노력하고 있습니다.

이 질문이 " MVC 아키텍처에 대한 모범 사례 "와 너무 유사하지 않기를 바라지 만 몇 가지 다른 자습서를 진행하면서 일부는 다른 컨트롤러를 여러 개 가지고있는 것으로 나타났습니다.

단일 웹앱에는 몇 개의 컨트롤러가 필요합니까?

나는 이것이 예제없이 대답하기가 어렵다는 것을 알고 있으므로 하나를 제공 할 것입니다.

신청:

  1. 사용자가 로그인했습니다.
  2. 사용자는 다음 세 가지 중 하나를 수행 할 수 있습니다.
    a) 메타 데이터와 함께 mongodb 데이터베이스에 저장된 파일을 업로드합니다.
    b) 파일을 검색하십시오.
    c) 로그 아웃하십시오.

내 질문은 일반적인 질문이지만 대답하려는 사람을 돕기 위해 예를 들었습니다.


8
정말 좋은 질문입니다.
Daniel Hollinrake

답변:


34

귀하의 예를 들어 두 개의 컨트롤러를 만듭니다.

  • 로그인 및 로그 아웃을위한 세션 컨트롤러 (레이아웃과 같은 REST 세션 생성 및 제거)
  • 파일의 모든 것을위한 파일 컨트롤러 (index = search and create = upload)

일반적으로 모든 것을 표시, 생성, 편집 및 파괴 할 수있는 자원으로 생각하는 RESTful 접근 방식은 구조를 구성하는 방법에 대한 좋은 아이디어를 제공합니다. 내 예제에서 볼 수 있듯이 REST의 모든 단일 동사에 너무 가깝지 않습니다.

추가 기능을 위해서는 더 많은 컨트롤러가 필요할 것입니다. 예를 들어 사용자가 새 계정을 만들 수있는 사용자 컨트롤러가 있습니다. 이 외에도 더 높은 권한으로 리소스를 편집 할 수있는 관리 인터페이스가 필요합니다. 이 경우 거의 모든 컨트롤러를 복제하는 것이 일반적입니다.

초기 아이디어를 얻는 데 필요한 매우 대략적인 추정치는 사용자가 액세스 할 수있는 데이터베이스의 모든 테이블에 대해 하나의 컨트롤러 일 수 있습니다. 그러나 이것은 실제로 매우 조잡한 측정입니다.


3
관리자 예 : 관리자 컨트롤러가 일반 사용자를 확장합니까 아니면 모든 방법을 완전히 재정의 하시겠습니까? 예를 들어 모든 사용자가 업로드하고 검색 할 수 있지만 관리자 만 삭제할 수 있습니다. 관리 컨트롤러 클래스가 모든 일반 사용자 메소드를 상속합니까?
Jeff

4
이것은 실제로 실제 기능에 많이 의존하지만 일반적으로 상속하지 않고 두 번째 컨트롤러를 작성합니다. 'thin controller'원칙에 따라 어쨌든 컨트롤러에는 많은 코드가 없어야합니다. 그리고 관리자 컨트롤러는 특히 간단 할 수 있습니다. 모든 중요한 기능이 모델에 적용됩니다. (예를 들어, 사용자를 삭제하는 것이 그의 모든 파일도 삭제되어야한다는 것을 의미한다면, 모델이 이것을 처리하고, 컨트롤러에 이것을위한 단일 라인이 없습니다)
thorsten müller

6

그것은 실제로 웹 앱에 달려 있습니다. 귀하의 예에서 아마도 충분할 것입니다. 배송, 세금, 재고 관리, 계층 별 가격 등을 포함한 완전한 전자 상거래 앱을 구현하려는 경우 몇 가지를 더 원할 수 있습니다.

컨트롤러에 하나 이상의 코드 냄새 (특히 Large Class 또는 God Object )가 발생하는 경우 사용자가 한 가지만 할 수있는 시점을 지나친 것입니다.


5

실제로 애플리케이션 요구 사항과 비즈니스 모듈 아키텍처에 따라 다릅니다 .

일반적인 엄지 손가락의 규칙은 , 필요한 컨트롤러의 수는 웹 애플리케이션 모듈 및 서브 모듈의 수에 따라 달라집니다.

보완 적으로 컨트롤러를 영역 으로 구성하는 것이 도움이됩니다 . Areas 의 개념은 ASP.NET MVC 프레임 워크에 빌드되며 하나의 모듈을 제공하는 컨트롤러의 구성을 단순화합니다.

여러 가지 관련 토론이 있습니다.


1
훌륭한 참고 자료! 꼭 확인하겠습니다!
Jeff

물론 문제 없습니다.
EL Yusubov

4

저는 애플의 방식이 마음에 듭니다.

모든 뷰는 하나의 뷰 컨트롤러만으로 제어됩니다. ~ iOS 용 View Controller 프로그래밍 가이드

아이디어는 뷰를 쉽게 교체 할 수 있어야한다는 것입니다. IMO는 1 Controller개당 1 개만 View있으면 쉽게 달성 할 수 있습니다. 그러나 여러 뷰가있는 컨트롤러를 가질 수 있고 여전히 디자인하여 프로그램 논리를 변경하지 않고 뷰를 전환 할 수 있다고 확신합니다.


좋은 지적이지만, 모든 뷰에 컨트롤러를 추가하고 사용자와 같은 것을 처리하기위한 추가 컨트롤러가 필요합니까? 또한 내 프로젝트가 더 큰 경우 더 많은 컨트롤러를 사용하는 것이 더 합리적이라고 생각합니다.
Jeff

모델은 사용자를 추적해야합니다. 따라서 필요한 경우 여러 컨트롤러가 모두 동일한 모델 객체를 사용할 수 있습니다.
Korey Hinton

2
따라서 컨트롤러에는 Model 객체와 View 객체가 있습니다. 컨트롤러는 Model 객체에 사용자 정보와 같은 정보를 요청한 다음보기를 적절하게 설정합니다. 모델에는 대부분의 프로그램 로직이 있어야하지만 컨트롤러에는보기와 모델간에 통신 할 수있는 로직 만 있습니다.
Korey Hinton

2
컨트롤러는 모델 상태에 따라 다른 뷰 모델을 표시 할 수 없으므로 뷰당 하나의 컨트롤러는 설계가 매우 제한적입니다.
EL Yusubov

1
@ElYusubov 혼란 스러울 수있는 곳을 볼 수 있습니다. iOS에서 모든 뷰에는 하나의 뷰 컨트롤러 만 있고 모든 뷰 컨트롤러에는 활성 뷰가 하나만 있고 해당 뷰에는 하위 뷰가있을 수 있지만 해당 뷰 컨트롤러에는 여러 뷰에 대한 참조가 포함될 수도 있습니다.
Korey Hinton

2

내가 좋아하는 한 가지 예는 온도 조절 장치를 생각하는 것입니다. 온도 조절기는 MVC 패턴을 볼 수있는 훌륭한 시각적 요소입니다.


구형 아날로그 온도 조절 장치에서는 다음과 같은 것을 그릴 수 있습니다.

보기 -현재 온도를 표시하는 온도 판독기입니다.

컨트롤러 -온도를 변경하는 다이얼

Model (모델) -온도 변화를 유발하는 컨트롤러에 의해 호출 된 내부 부품.


당신은 항상 느슨한 결합 및 제한 모델과 단일 작업에 관련 컨트롤러를 수있는 디자인을 준수해야합니다 , 당신은해야 당신이 필요한만큼 모듈 / 컨트롤러를 사용 . 응용 프로그램의 크기에 따라 모델 및 컨트롤러보다 훨씬 적은 뷰가있을 수 있습니다. 이것은 모든 대형 응용 프로그램에서 예상됩니다. 좋은 객체 지향 프로그래밍은 느슨한 결합, 캡슐화, 상속 및 다형성이 특징입니다. 모든 언어가 다형성을 동일한 정도로 지원하지는 않습니다 (함수, 메소드, 연산자 오버로드 / 재정의).

MVC 아키텍처를 올바르게 사용하는 방법을 더 잘 이해하려면 코드 예제로 C ++ 및 SmallTalk를 사용하는 GoF "디자인 패턴 : 재사용 가능한 요소 ... 소프트웨어"를 참조하십시오. 이 책은 알파와 오메가가 아니지만 시작일 것입니다!

행운을 빕니다!


1

귀하의 사례가 복잡한 시스템으로 발전 할 것이라고 가정합니다.

신청:

사용자 로그인 :

  • LoginController

유일한 책임은 로그인을 처리하고, 결과를 사용자에게 재전송하거나 알리는 것입니다.

파일을 올리다

  • UploadController

여기서는 모든 유형의 파일을 업로드한다고 가정합니다. 나중에 MP3 및 PDF를 업로드하기로 결정한 경우 기본 UploadController, MP3UploadController 및 PDFUploadController가 있습니다.

파일을 검색하십시오.

  • SearchFileController

이것은 기본 요구 사항으로 충분합니다. 검색 로직이 얼마나 복잡한 지에 따라 나중에 여러 개의 검색 컨트롤러를 가질 수 있습니다. 마지막으로 원하는 것은 다른 검색을 수행하는 20 개의 액션 메소드가있는 단일 SearchController입니다.

로그 아웃.

-LogoutController .

누군가가 이것을 과잉 인 것으로 생각할 수도 있지만, 나는 그렇게 생각하지 않습니다. 나는 깨끗하고 멋지게 분리되어 있다고 생각합니다.

이 프로젝트 구조를 살펴보면 프로젝트의 구조와 구조를 즉시 알 수 있습니다. 한 단계 더 걸릴하기 위해, 나는 둘 것 LoginControllerLogoutController별도의 영역으로.

나는 전에 이와 같은 것을 개발했으며 실제로 잘 작동했습니다.


입력 주셔서 감사합니다! 작동 코드가 있습니까? 몇 가지 일에 갇히고 있습니다.
Jeff

어떤 문제가 발생 했습니까?
CodeART

제목과 날짜 (문자열 형식)를 업로드 할 수 있지만 파일 자체를 업로드 할 수 없습니다 ( stackoverflow.com/questions/18344614/… 참조 ).
Jeff

저는 .NET 개발자입니다. 도와 드릴 수 없어서 죄송합니다.
CodeART

1

대부분의 코드가 비즈니스 계층에서 발생하고 있습니까? 그렇다면 컨트롤러에서 실제로하는 일은 데이터를보기로 반환하는 것입니다.

컨트롤러를 하위 유형으로 분리하는 팬인지 확실하지 않습니다. 우려의 분리를 유지해야하지만 하위 유형이 너무 멀리 가고 있다고 생각합니다. 또한 생성자 또는 컨트롤러에서 무거운 개체가 초기화되는 경우주의해야합니다. 예를 들어, 예제에서는 사용자가 로그인 페이지에있을 때 검색 / 업로드 파일에만 사용되는 무거운 오브젝트를 원합니다.

AccountController (로그인, 등록, 로그 아웃), FileController (검색, 업로드) 등과 같은 로직 단위당 컨트롤러를 사용하는 것이 좋습니다.


0

일반적으로 모든 MODEL에는 자체 컨트롤러와 전용 VIEW가 있다고 말할 수 있습니다. 일반적으로 말하면 이것이 최선의 방법이라는 것을 의미합니다.

응용 프로그램 측면 (예 : 사용자 관리)은 응용 프로그램 서비스로 변환되어야하며 컨트롤러 자체에서 호출하거나 컨트롤러를 래핑해야합니다 (예 : 요청 사용자 역할에 따라 컨트롤러 기능을 "표시"하는 속성 사용).

모든 컨트롤러는 기본적으로 모델에 대한 CRUD 작업을 처리하고 필터마다 다른보기를 사용해야합니다.

제 생각에 MVC의 패턴으로서의 주요 장점 중 하나는 모델과 뷰를 연결하는 가장 좋은 방법을 제공한다는 것입니다.

추가 한 예제 정보 : 모든 사용자 로그인 작업 (등록, 로그인, 로그 아웃 등)과 파일 작업 (업로드 및 검색)을위한 두 개의 컨트롤러를 만듭니다. 첫 번째는 로그인 기능과 관련된 일부 측면으로 백업해야하며 두 번째는 일반 컨트롤러입니다.


설명이 없으면 다른 사람이 반대 의견을 게시 할 경우이 답변이 쓸모 없게 될 수 있습니다. 예를 들어, 누군가 "사용자 역할 관리 및 권한 부여가 컨트롤러 위에 있으면 안됩니다" 와 같은 클레임을 게시 한 경우이 답변이 독자가 두 가지 반대 의견을 선택하는 데 어떻게 도움이됩니까? 더 나은 형태로 편집 하는 것을 고려하십시오
gnat

1
@gnat 의견을 수락하고 편집 된 답변 참조
Saturn Technologies
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.