MVC의 비즈니스 로직 [닫기]


184

두 가지 질문이 있습니다.

Q1. "비즈니스 로직"이 MVC 패턴에서 정확히 어디에 있습니까? 모델과 컨트롤러가 혼동됩니다.

Q2. "비즈니스 로직"이 "비즈니스 규칙"과 동일합니까? 그렇지 않다면 차이점은 무엇입니까?

작은 예를 들어 설명 할 수 있다면 좋을 것입니다.

답변:


173

비즈니스 규칙이 모델에 적용됩니다.

메일 링리스트에 대한 이메일을 표시한다고 가정하십시오. 사용자는 이메일 중 하나 옆에있는 "삭제"버튼을 클릭하고 컨트롤러는 모델에게 N 항목을 삭제하도록 알리고 모델이 변경된 뷰를 알립니다.

관리자의 이메일을 목록에서 제거해서는 안됩니다. 그것은 비즈니스 규칙이며 지식은 모델에 속합니다. 뷰는 결국 이 규칙을 어떻게 든 표현할 수 있습니다. 아마도 모델은 비즈니스 규칙의 기능인 "IsDeletable"특성을 노출하므로 특정 항목에 대해 뷰의 삭제 단추가 사용 불가능하지만 규칙 자체는 포함되지 않습니다. 보기에서.

이 모델은 궁극적으로 데이터의 게이트 키퍼입니다. UI를 전혀 터치하지 않고도 비즈니스 로직을 테스트 할 수 있어야합니다.


5
예를 주셔서 감사합니다. 관리자의 이메일 항목 (삭제 가능 여부 제어)의 경우 컨트롤러를 사용하여 해당 항목을 제어 할 수 없습니까?
hmthur

2
@mud 모델을 서비스 계층과 리포지토리 등 두 개의 계층으로 더 분류하면 서비스 계층은 비즈니스 로직을 담당하고 리포지토리는 데이터 계층을 담당합니다.
Dragon

3
@PeterMatisko "모델은 데이터 만 전달해야합니다." "MVC"에서 M의 의미를 이해하지 못합니다. V는 순전히 프리젠 테이션입니다. C는 프리젠 테이션과 모델 사이의 접착제입니다. (실제로 "VC"는 종종 프리젠 테이션 레이어로 간주되며 MVVM과 같은 MVC의 인기있는 변형 인 Model View Viewmodel은 더욱 명확 해집니다.) M은 그 밖의 모든 것 : 모든 데이터 논리 응용 프로그램의. 이 계층 내에서 데이터와 비즈니스 로직을 분리 할 수 ​​있으며이 계층의 데이터 부분을 "모델"이라고 부를 수 있지만 "MVC"의 "M"이 말하는 것은 아닙니다.
Mud

1
@PeterMatisko "라 라벨에서 사람들은 컨트롤러 나 모델에 모든 것을 던져 넣습니다. 나쁜 구조는 좋지 않습니다." 어떻게 나쁜 거야? 구체적으로 작성하십시오. "V"는 "보기"를 의미합니다. 보기가 아닌 모든 것이 반드시 "M"또는 "C"로 들어갑니다. "MVC만으로는 충분하지 않으며, 비즈니스 로직과 그 위치에 대해 명시 적으로 언급 하지 않습니다. " 물론입니다. "M"은 응용 프로그램의 모델로, 데이터, 그 주위의 비즈니스 논리 및 프레젠테이션이 아닌 기타 모든 것입니다. "V"및 "C"는 프리젠 테이션 레이어, 사용자 입력 및 출력입니다.
Mud

2
@Mud 문제는 라 라벨이 '모델'을 데이터 캐리어라고 부르는 것입니다. 튜토리얼에서 Laravel이 MVC를 사용한다고 말하고 '모델'이 매우 특정한 목적을 가지고 있다는 것을 알게되면 비즈니스 로직을 어디에 넣을지 알 수 없게됩니다. 그리고 유일한 합리적인 장소는 컨트롤러입니다. 나는 이것을 만들지 않고, 종종 내가 보는 전형적인 라 라벨 프로젝트 (및 튜토리얼)에 대해 언급했다.
Peter Matisko

191

무엇보다도 주먹 :
MVC 패턴과 n- 계층 기반 설계 원칙을 혼용하고 있다고 생각합니다.

MVC 접근 방식을 사용한다고해서 애플리케이션을 계층화해서는 안된다는 의미는 아닙니다.
MVC가 프레젠테이션 계층의 확장과 같은 것으로 보이면 도움이 될 수 있습니다.

프리젠 테이션이 아닌 코드를 MVC 패턴에 넣으면 곧 복잡한 디자인이 될 수 있습니다.
따라서 비즈니스 로직을 별도의 비즈니스 계층에 넣는 것이 좋습니다.

: 그냥 이것 좀 봐 가지고 다 계층 아키텍처에 대한 Wikipedia 기사

그것은 말한다을 :

오늘날 MVC 및 이와 유사한 MVP (model-view-presenter)는 더 큰 시스템 의 프리젠 테이션 레이어 에만 적용되는 우려 디자인 패턴의 분리입니다 .

어쨌든 ... 엔터프라이즈 웹 애플리케이션 에 대해 이야기 할 때 UI에서 비즈니스 로직 계층으로의 호출은 (프레젠테이션) 컨트롤러 내부에 배치해야합니다.

컨트롤러가 실제로 특정 리소스에 대한 호출을 처리하고 비즈니스 로직을 호출하여 데이터를 쿼리하고 데이터 (모델)를 적절한보기에 연결하기 때문입니다.

Mud는 비즈니스 규칙이 모델에 적용된다고 말했습니다.
또한 사실이지만 (프레젠테이션) 모델 (MVC의 'M')과 티어 기반 애플리케이션 디자인의 데이터 계층 모델을 혼합했습니다.
따라서 데이터베이스 관련 비즈니스 규칙 을 애플리케이션의 모델 (데이터 계층)에 배치하는 것이 유효 합니다.
그러나 특정 UI에만 적용되므로 MVC 구조 프레젠테이션 레이어의 모델에 배치해서는 안됩니다.

이 기술은 도메인 기반 디자인을 사용하는지 아니면 트랜잭션 스크립트 기반 접근 방식을 사용하는지와 무관합니다.

내가 당신을 위해 그것을 시각화하자 :


프리젠 테이션 레이어 : 모델-보기-컨트롤러


비즈니스 계층 : 도메인 로직-애플리케이션 로직


데이터 계층 : 데이터 저장소-데이터 액세스 계층


위에서 본 모델은 MVC, DDD 및 데이터베이스 독립 데이터 계층을 사용하는 응용 프로그램이 있음을 의미합니다.
이것은 더 큰 엔터프라이즈 웹 응용 프로그램을 설계하는 일반적인 방법입니다.

그러나 간단한 비 DDD 비즈니스 계층 (도메인 논리가없는 비즈니스 계층)과 특정 데이터베이스에 직접 쓰는 간단한 데이터 계층을 사용하도록 축소 할 수도 있습니다.
권장하지는 않지만 전체 데이터 계층을 삭제하고 비즈니스 계층에서 직접 데이터베이스에 액세스 할 수도 있습니다.

그게 속임수입니다 ...이 도움이되기를 바랍니다 ...

[참고 :] 또한 현재 응용 프로그램에 둘 이상의 "모델"이 있다는 사실을 알고 있어야합니다. 일반적으로 응용 프로그램의 각 계층에는 자체 모델이 있습니다. 프리젠 테이션 레이어의 모델은보기에 따라 다르지만 종종 사용 된 컨트롤과 무관합니다. 비즈니스 계층에는 "도메인 모델"이라는 모델이있을 수도 있습니다. 일반적으로 도메인 기반 접근 방식을 선택하기로 결정한 경우입니다. 이 "도메인 모델"에는 데이터와 비즈니스 로직 (프로그램의 주요 로직)이 포함되며 일반적으로 프리젠 테이션 레이어와 무관합니다. 프레젠테이션 계층은 일반적으로 특정 "이벤트"(버튼 누름 등)에서 비즈니스 계층을 호출하여 데이터 계층에서 데이터를 읽거나 데이터 계층에 데이터를 씁니다. 데이터 계층에는 일반적으로 데이터베이스와 관련된 자체 모델이있을 수 있습니다.

문제는 이것이 어떻게 MVC 개념에 적합합니까?

답변-> 그렇지 않습니다!
글쎄-그것은하지만 완전히하지는 않습니다.
MVC는 1970 년대 말에 Smalltalk-80 프로그래밍 언어를 위해 개발 된 접근 방식이기 때문입니다. 그 당시 GUI와 개인용 컴퓨터는 흔하지 않았으며 월드 와이드 웹도 발명되지 않았습니다! 오늘날의 프로그래밍 언어와 IDE는 대부분 1990 년대에 개발되었습니다. 당시 컴퓨터와 사용자 인터페이스는 1970 년대와 완전히 다릅니다.
MVC에 대해 이야기 할 때이 점을 명심해야합니다.
Martin Fowler는 MVC, MVP 및 오늘날의 GUI에 대해 매우 유용한 기사를 작성했습니다.


10
mvc와 n-tier 앱의 차이점을 올바르게 표시하려면 +1하십시오. 내가 개발 한 대부분의 엔터프라이즈 응용 프로그램에는 n- 계층이 있으며 mvc를 프레젠테이션 계층으로 만 사용합니다.
Retired_User

1) MVC (프레젠테이션 계층)에서 모델보기 2) 승인 된 트랜잭션에 대한 일부 C # 기술 (비즈니스 계층), 핵심 비즈니스 규칙 논리. 3) (데이터 액세스 계층)의 리포지토리 및 작업 단위 프레젠테이션 계층의 컨트롤러에서 액세스 할 수있는 모델, 리포지토리를 자유롭게 노출하고 노출해야하는 비즈니스 계층을 구축하는 데 사용할 수있는 일부 기술 (또는 모범 사례 패턴)을 안내하십시오 (상단 층). 기본적으로 나는 추가, 삭제, 업데이트 및 비즈니스 로직과의 조합을 믿으며 거래에 따라야합니다. 이것에 대한 추가 조명을 친절하게 전파하십시오.
Mark Macneil Bikeio

안녕하세요 라훌, 내가 당신을 올바르게 이해한다면, 당신 말이 맞아요. CRUD 작업은 기본적으로 비즈니스 트랜잭션의 핵심 부분입니다. 개인적으로 직접 빌드하는 대신 Hibernate와 같은 강력한 OR 매퍼를 저장소로 사용하는 것을 선호합니다. 최대 절전 모드는 이미 작업 단위 패턴을 내부적으로 구현하기 때문입니다. 또한 일반적으로 비즈니스 트랜잭션을 별도의 비즈니스 서비스에 넣습니다.
Frank

뷰 모델의 경우 다음 예제를 제공 할 수 있습니다. 이미지 만 듀얼리스트 뷰가있는 GUI가 있습니다. 이 이중 목록보기는 이중 목록보기 모델을 데이터 모델로 사용합니다. 이 데이터 모델은 두 개의 간단한 목록으로 구성되어 있습니다. 따라서 이중 목록보기 모델은보기 모델을 만드는 데 사용되는 두 개의 간단한 목록과 달리 프레젠테이션 계층이 도메인 모델의 일부가 아니기 때문에 프레젠테이션 계층의 구현에 따라 다릅니다. 작성하려는 GUI에 따라보기 특정 모델을 도메인 모델 대신보기에 바인딩하려는 경우가 있습니다.
Frank

비즈니스 규칙 / 논리 부분은 설명하기가 약간 까다 롭습니다. 데이터 처리를 시작하려면 서비스 중 하나에서 메소드를 호출하십시오. 그것은 당신이 기본적으로 거래를 시작한다는 것을 의미합니다. 이 메소드에 비즈니스 로직이 포함 된 경우 "트랜잭션 스크립트"라고합니다. 재사용이 어렵 기 때문에 일반적으로 나쁜 일입니다. 이 방법이 도메인 모델의 비즈니스 로직을 호출하는 것이 좋습니다. 즉, 비즈니스 로직을 포함 할 수있는 방식으로 도메인 모델을 설계해야합니다. 이 도메인 기반 접근 방식은 불완전하거나 잘못된 도메인 모델에서는 작동하지 않습니다.
Frank

73

비즈니스 로직이라는 용어는 제 생각에는 정확한 정의가 아닙니다. Evans는 자신의 저서 인 Domain Driven Design에서 두 가지 유형의 비즈니스 로직에 대해 이야기합니다.

  • 도메인 로직.
  • 응용 프로그램 논리.

이 분리는 제 생각에 훨씬 명확합니다. 그리고 다른 유형의 비즈니스 규칙이 있다는 것을 깨닫게되면 반드시 같은 장소로 갈 필요는 없다는 사실도 깨닫게됩니다.

도메인 로직은 실제 도메인에 해당하는 로직입니다. 따라서 회계 응용 프로그램을 만드는 경우 도메인 규칙은 계정, 전기, 세금 등에 관한 규칙이됩니다. 민첩한 소프트웨어 계획 도구에서 규칙은 백 로그의 속도 및 스토리 포인트를 기반으로 릴리스 날짜를 계산하는 것과 같습니다. 기타

이 두 가지 유형의 응용 프로그램 모두 CSV 가져 오기 / 내보내기가 관련이있을 수 있지만 CSV 가져 오기 / 내보내기 규칙은 실제 도메인과 관련이 없습니다. 이러한 종류의 논리는 응용 프로그램 논리입니다.

도메인 로직은 가장 확실하게 모델 계층으로 들어갑니다. 이 모델은 DDD의 도메인 계층에도 해당합니다.

그러나 애플리케이션 로직을 반드시 모델 계층에 배치 할 필요는 없습니다. 컨트롤러에 직접 배치하거나 해당 규칙을 호스팅하는 별도의 응용 프로그램 계층을 만들 수 있습니다. 이 경우 가장 논리적 인 것은 실제 응용 프로그램에 따라 다릅니다.


1
이것은 매우 사실입니다! 뷰 모델과 도메인 모델에는 두 가지 모델이 있습니다. MVC 프로젝트의 레이아웃이 초보 개발자가 코드를 뷰 모델에 작성해야한다고 믿게 만드는 것은 불행한 일입니다.
Jonathan

1
당신의 대답이 더 수용 가능하고 이해 가능하다는 것을 알았습니다. 감사.
revo

27

A1 : 비즈니스 로직이 Model참여 MVC합니다. 의 역할은 Model데이터 및 비즈니스 로직을 포함하는 것입니다. Controller반면에 사용자 입력을 받고 수행 할 작업을 결정해야합니다.

A2 : A Business Rule는의 일부입니다 Business Logic. 그들은 has a관계가 있습니다. Business Logic있다 Business Rules.

살펴보십시오 Wikipedia entry for MVC. MVC패턴 의 흐름을 언급하는 개요로 이동하십시오 .

또한보십시오 Wikipedia entry for Business Logic. 및 Business Logic로 구성 되는 것으로 언급된다 .Business RulesWorkflow


16

몇 가지 답변이 지적했듯이 멀티 티어 대 MVC 아키텍처에 대한 오해가 있다고 생각합니다.

멀티 티어 아키텍처는 애플리케이션을 계층 / 계층 (예 : 프리젠 테이션, 비즈니스 로직, 데이터 액세스)으로 분할합니다.

MVC는 응용 프로그램의 프레젠테이션 계층을위한 아키텍처 스타일입니다. 사소한 응용 프로그램의 경우 비즈니스 논리 / 비즈니스 규칙 / 데이터 액세스를 모델, 뷰 또는 컨트롤러에 직접 배치해서는 안됩니다. 그렇게하려면 프레젠테이션 계층에 비즈니스 로직을 배치하여 코드의 재사용 및 유지 관리 성을 줄입니다.

이 모델은 비즈니스 논리를 배치하기에 매우 합리적인 선택이지만,보다 나은 / 유지 관리가 용이 ​​한 방법은 프레젠테이션 계층을 비즈니스 논리 계층과 분리하고 비즈니스 논리 계층을 만들고 필요할 때 모델에서 비즈니스 논리 계층을 호출하는 것입니다. 비즈니스 로직 계층은 차례로 데이터 액세스 계층을 호출합니다.

특히 응용 프로그램이 여러 계층을 사용하여 설계되지 않은 경우 MVC 구성 요소 중 하나에서 비즈니스 논리와 데이터 액세스를 혼합하는 코드를 찾는 것은 드문 일이 아닙니다. 그러나 대부분의 엔터프라이즈 응용 프로그램에서는 일반적으로 프레젠테이션 계층 내에 MVC 아키텍처가있는 다중 계층 아키텍처를 찾을 수 있습니다.


2
문제에 대한 최고의 답변. 더 높은 투표를해야합니다. 최악의 답변은 수락 된 것으로 표시됩니다.
피터 Matisko

우수 답변 .. 의심의 여지
살만

데이터 및 응용 프로그램의 크기에 따라 달라 집니까? 작은 응용 프로그램의 경우 모든 논리가 혼란없이 모델로 들어갈 수 있다고 생각합니다. 그렇다면 별도의 레이어로 분리하기 시작하는 크기의 임계 값은 얼마입니까?
mLstudent33

15

이것은 답변 된 질문이지만 "1 센트"를 드리겠습니다.

비즈니스 규칙은 모델에 속합니다. "모델"은 항상 (논리적으로 또는 물리적으로 분리 된) 다음으로 구성됩니다.

  • 프레젠테이션 모델 -보기에 사용하기에 적합한 클래스 세트 (특정 UI / 프레젠테이션에 맞게 조정 됨)
  • 도메인 모델 - 모델 의 UI 독립적 부분
  • repository- "모델"의 스토리지 인식 부분.

비즈니스 규칙은 도메인 모델에 존재하며 프리젠 테이션에 적합한 형식으로 "프레젠테이션"모델에 노출되며 때로는 "데이터 계층"에 복제 (또는 시행)됩니다.


5

비즈니스 계층을 MVC 프로젝트의 모델에 배치하는 것은 의미가 없습니다.

상사가 프레젠테이션 레이어를 다른 것으로 변경하기로 결정했다고 말하면, 당신은 망하게 될 것입니다! 비즈니스 계층은 별도의 어셈블리 여야합니다. 모델에는 표시 할보기로 전달되는 비즈니스 계층의 데이터가 포함됩니다. 그런 다음 게시 후 모델은 비즈니스 계층에 상주하는 Person 클래스에 바인딩하고 PersonBusiness.SavePerson (p); 여기서 p는 Person 클래스입니다. 다음은 내가하는 일입니다 (BusinessError 클래스가 누락되었지만 BusinessLayer에도 적용됨).여기에 이미지 설명을 입력하십시오


이 진술을 명확히 하시겠습니까? " 모델 에는 비즈니스 계층에서 제공되는 데이터가 뷰로 전달되어 표시됩니다."
Anthony Rutledge

2

Q1 :

비즈니스 로직은 두 가지 범주로 고려할 수 있습니다.

  1. 전자 메일 주소 제어 (고유성, 제약 조건 등), 송장에 대한 제품 가격 획득 또는 제품 객체를 기준으로 shoppingCart의 총 가격 계산과 같은 도메인 논리

  2. 학생 등록 ​​프로세스 제어와 같이 비즈니스 프로세스라고하는보다 광범위하고 복잡한 워크 플로우

첫번째 범주에 들어가는 모델두 번째 하나에 속하는 컨트롤러 . 두 번째 범주의 사례는 광범위한 응용 프로그램 논리이고 모델에 적용하면 모델의 추상화가 혼합 될 수 있기 때문입니다 (예를 들어, 이러한 결정을 한 모델 클래스 또는 다른 클래스로 분류해야하는지 여부는 명확하지 않습니다) 둘 다!).

모델과 컨트롤러의 특정 차이점에 대한 이 답변 을 참조하십시오.이 링크 는 매우 정확한 정의 와이 링크 는 멋진 Android 예제입니다.

요점은 위의 "Mud"와 "Frank"에 언급 된 메모는 "Pete"뿐만 아니라 사실 일 수도 있다는 것입니다 (비즈니스 로직은 비즈니스 로직의 유형에 따라 모델이나 컨트롤러에 넣을 수 있습니다).

마지막으로 MVC는 상황에 따라 다릅니다. 예를 들어, Android 애플리케이션에서는 웹 기반과 다른 일부 대체 정의가 제안됩니다 ( 예를 들어이 게시물 참조 ).


Q2 :

비즈니스 로직은보다 일반적이며 위에서 언급 한 "비 사이클론"과 같이 다음과 같은 관계가 있습니다.

비즈니스 규칙 ⊂ 비즈니스 로직


0

서비스 계층을 도입하지 않겠습니까? 그러면 컨트롤러가 간결하고 읽기 쉬워지며 모든 컨트롤러 기능이 순수한 동작이됩니다. 서비스 계층 내에서 필요한만큼 비즈니스 로직을 분해 할 수 있습니다. 코드 재사용 가능성이 높습니다. 모델 및 리포지토리에 영향을 미치지 않습니다.


-5

CRUD 데이터베이스 조작을위한 모델 = 코드.

Controller = 사용자 조치에 응답하고 조직 고유의 비즈니스 규칙에 따라 데이터 검색 또는 삭제 / 업데이트에 대한 사용자 요청을 모델로 전달합니다. 이러한 비즈니스 규칙은 도우미 클래스에서 구현되거나 너무 복잡하지 않은 경우 컨트롤러 작업에서 직접 구현할 수 있습니다. 컨트롤러는 최종적으로 새로운 디스플레이 또는 'updated, thanks'등과 같은 메시지 형태로 사용자에게 피드백을 제공하기 위해 뷰 자체를 업데이트하도록 요청합니다.

보기 = 모델의 쿼리를 기반으로 생성 된 UI입니다.

비즈니스 규칙이 어디로 가야하는지에 대한 어렵고 빠른 규칙은 없습니다. 어떤 디자인에서는 모델로 들어가고 다른 디자인에서는 컨트롤러에 포함됩니다. 그러나 컨트롤러와 함께 유지하는 것이 좋습니다. 모델이 데이터베이스 연결에 대해서만 걱정하도록하십시오.


비즈니스 규칙을 컨트롤러에 배치하고 많은 작업을 수행하는 경우 비즈니스 규칙을 여러 번 복제합니까? 아닙니다. 당신은 그것을 도우미 메소드 나 일종의 클래스로 분리 할 것입니다. 모델에 해당 "thing"을 넣습니다.
G. Stoynev

3
MVC는 CRUD 데이터베이스 작업을위한 응용 프로그램 패턴이 아니므로 (그런 식으로 사용할 수는 있지만) 모델은 "CRUD 데이터베이스 작업을위한 코드"가 될 수 없습니다. 모델은 데이터 및 비즈니스 규칙을 포함하여 애플리케이션의 엔티티를 정의합니다. 컨트롤러는 뷰와 모델 간의 상호 작용을 조정합니다. 보기는 모델에 노출되는 사용자 인터페이스와 컨트롤러에 의해 노출 된 모델에서 사용 가능한 작업입니다.
존 데이비스
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.