동일한 솔루션으로 MVC 애플리케이션에서 Web API를 호출해야합니까?


33

모바일 응용 프로그램이있는 MVC 프로젝트를 작업 중이므로 모바일 응용 프로그램에서 사용할 수 있도록 Web API를 사용해야한다는 것이 분명합니다.

웹 사이트 개발을 시작할 때 API를 만든 후 혼란스러워 API를 사용할지 또는 Business Object에 직접 액세스하는지에 대해 논의했습니다. 그리고 우리는 비즈니스 객체를 직접 사용하는 대신 웹 API를 소비하는 더 숙련 된 개발자의 의견 양식을 얻은 후에 끝났습니다.

이 솔루션 구조와 관련하여 혼란 스럽습니다.

1) 왜 우리는 Web API를 사용하고 HTTP 솔루션 (시간이 많이 걸리는)을 작성하여 동일한 솔루션에있는 비즈니스 오브젝트 대신 데이터를 가져 오거나 넣을 수 있습니다.

2) 인수를 한 후 클라이언트가 다른 클라우드 서버에서 API와 웹을 호스팅하고 API에만 스케일링을 적용하려는 경우 API와 웹에 액세스하기 위해 다른 URL을 원할 수도 있습니다 (논리적 임). 그렇다면 동일한 솔루션으로 MVC 응용 프로그램에서 Web API를 호출해야합니까?

3) 우리가 다른 호스팅에서 API와 웹을 호스팅하는 경우 웹은 WebClient를 사용하고 각 탐색마다 HTTP 호출을해야합니다. 맞아?

4) 우리가 다른 서버에서 API와 웹 호스팅을 모두 비즈니스 객체로 만들려면 BL의 변경 사항이 두 서버 모두에서 빌드를 업데이트해야합니다.

5) 또는 API 용 프로젝트를 하나만 작성해야하며 웹 인터페이스를 개발하기 위해보기 또는 HTML 페이지를 추가하여 ajax에서 API를 직접 호출 할 수 있습니다.

내 지식에 따르면 # 5는 최상의 솔루션이거나 API는 타사 액세스 전용입니다. 동일한 솔루션에 DB, EF, 데이터 계층 및 비즈니스 계층이있는 경우 API를 사용하여 HTTP 호출을 작성하고 비즈니스 오브젝트에 직접 액세스하지 않아야합니다. 모바일 응용 프로그램이나 데스크톱 또는 응용 프로그램에 액세스하려고 할 때 동일한 저장소 및 데이터 계층을 가질 때 API가 필요합니다.

내 시나리오에서는 모바일 응용 프로그램이 있으므로 API를 만들고 프로젝트 API 측에서는 비즈니스 계층 (별도의 프로젝트)이라고하고 비즈니스 계층은 데이터 액세스 계층 (별도의 프로젝트)이라고합니다. 따라서 내 질문은 API와 웹을 다른 서버에 호스팅하는 경우 프로젝트를 만들 때 비즈니스 계층의 메서드를 사용하고 비즈니스 계층의 .dll을 만들 때 HTTP 요청 인 API를 호출하면 비즈니스 계층의 메서드를 사용하는 것보다 시간이 오래 걸릴 수 있습니다. API 컨트롤러에서는 비즈니스를 json 형식으로 변환합니다.

인터넷에서 검색했지만 확실한 대답을 얻지 못했습니다. 나는 같은 요점을 다시 논의 하는 블로그 http://odetocode.com/blogs/scott/archive/2013/07/01/on-the-coexistence-of-asp-net-mvc-and-webapi.aspx를 찾았 습니다. 그 블로그에서 제 질문은 왜 시나리오 3을 고려해야합니까?

업데이트 : 우리는 다른 API 프로젝트와 MVC 프로젝트를 가질 수 있으며 jvascript를 사용하여 웹에서 API를 호출하거나 MVVM 패턴을 사용할 수 있습니다.


뷰 모델이있는 MVVM 또는 MVC?
Andrew Hoffman

우리는 MVC를 사용하고 있습니다
Ruchir Shah

그렇다면 정답은 실제로 없습니다. 품질 향상과 관련하여 API를 호출하면 이점이 있습니다. (자신의 개밥 먹기) 서비스를 통해 전화하는 대신 전화를 걸면 성능상의 이점이 있습니다.
Andrew Hoffman

구글은이 질문을 한 번 겪었다. 그들의 제품은 서비스와 웹 사이트입니다. 나는 그들이 그들의 웹 사이트가 그들 자신의 서비스를 소비하도록 결정했다고 믿는다.
Andrew Hoffman

2
예. programmers.stackexchange.com/questions/148556/…stackoverflow.com/questions/3590561/… 은 좋은 자원입니다. 어떤 사람들은 그렇지 않습니다. 실제 '올바른'방법은 없습니다.
Andrew Hoffman

답변:


37

좋은 질문입니다! 나는 항상 프로젝트를 더 잘 구성 할 수있는 더 좋은 방법을 찾고 있습니다. 여러분이 올릴 때마다 장점이 있으며 다양한 솔루션 구조를 탐색 한 결과 여기에 의견의 대부분에 동의한다고 말할 수 있습니다. 완벽한 솔루션은 없습니다. 이런 종류의 문제에 직면했을 때 스스로에게 물어볼 몇 가지 :이 응용 프로그램은 얼마나 복잡합니까? 몇 개의 시스템을 통합해야합니까? 또는이 시스템과 몇 개의 시스템을 통합해야합니까? 얼마나 많은 테스트를 계획하고 있습니까? 별도의 디자인 / UI 팀이 있습니까? 확장해야합니까? 세션을 구성하는 것은 무엇입니까?

약간의 영리한 엔지니어링을 사용하여 일이 실제로 진행되도록하는 몇 가지 시나리오와 방법을 살펴 보겠습니다.

동일한 프로젝트에서 API와 웹 사이트 모두 호스팅
이 경우 비즈니스 계층 프로젝트가 0 개 이상이고 단일 하이브리드 MVC / WebAPI 프로젝트 (다른 ​​프로젝트-유틸리티 등)가있는 단일 솔루션이있을 수 있습니다.

Pro 's
Everything은 한곳에 있습니다. 복잡한 메시징 (HttpClient 호출)을 사용하지 않아도 공유 세션 상태 (쿠키를 통해 클라이언트와 서버, InProc / OutOfProc 세션 등), 연결 풀링, 공유 로직 등을 가질 수 있습니다. 배포는 더 간단 할 수 없습니다.

Con 's
Everything은 한 곳에 있습니다 .. 아마도 가장 모 놀리 식 구조 일 것입니다. 레이어 사이에 명확하게 정의 된 인터페이스가 없습니다 . 높은 결속력으로 끝납니다 . 게으른 개발자는 이러한 유형의 아키텍처를 다룰 때 인터페이스를 피하여 테스트를 어렵게 만듭니다. 응용 프로그램의 크기를 조정 / 배치하기가 어렵습니다.

용도이
프로젝트 구조를 일회성, 내부 또는 간단한 응용 프로그램에 사용합니다. 지역 Y에서 농구 캠프 가입을 추적하기위한 빠른 시스템을 구축하고 있습니까? 이것은 당신의 건축입니다!

다른 프로젝트의 WebAPI 및 웹 사이트이
경우를 선호합니다. 하나 이상의 MVC 프로젝트와 하나의 WebAPI 프로젝트가있는 단일 솔루션이 있습니다.

프로
모듈화! 느슨한 결합! 각 프로젝트는 단독으로 수행되고 별도로 테스트되며 다르게 관리 될 수 있습니다. 이를 통해 필요에 따라 다양한 캐싱 전략을보다 쉽게 ​​구현할 수 있습니다. 서로 다른 시스템간에 확실한 경계를 유지함으로써 계약을보다 쉽게 ​​설정하여 특정 사용 패턴을 적용하고 가능한 마찰을 줄일 수 있습니다 (읽기 : API 남용 기회가 적은 버그 수 감소). 부하가 큰 비트 만 스케일링하면되기 때문에 스케일링이 조금 더 쉽습니다. 처음부터 API가 어떻게 보일지에 대한 아이디어가 필요하기 때문에 통합도 처리하기가 더 쉬워졌습니다.

콘의
유지 관리는 조금 더 어렵습니다. 다중 프로젝트는 병합, 계약 (인터페이스), 배포 등을 추적하기 위해 프로젝트 / 피처 소유자가 필요함을 의미합니다. 코드 유지, 기술 부채 , 오류 추적, 상태 관리-모두 다르게 다르게 구현해야 할 경우 문제가됩니다. 당신의 필요에 따라. 이러한 종류의 응용 프로그램은 성장함에 따라 계획과 큐 레이션이 가장 필요합니다.

용도
100 명 오늘 10 만 다음 주 / 월을 가질 수있는 응용 프로그램을 구축? 응용 프로그램에서 알림을 보내고 복잡한 워크 플로를 관리하고 여러 인터페이스 (웹 + 모바일 앱 + SharePoint)가 있어야합니까? 주말 동안 많은 시간을 보내고 5000 개 이상의 퍼즐을 푸는 것을 좋아하십니까? 이것은 당신을위한 아키텍처입니다!


위의 개요를 살펴보면 다음 프로젝트가 다소 어려워 보일 수 있습니다. 걱정하지 마십시오. 여기 몇 년 동안 배운 몇 가지 트릭이 있습니다.

  1. 상태 비 저장 세션을 사용해보십시오. 소규모 시스템에서는 최소한 현재 사용자의 내부 ID와 시간 초과를 포함하는 암호화 된 쿠키를 저장하는 것을 의미 할 수 있습니다. 시스템이 클수록 데이터 저장소 (redis, table storage, DHT 등) 에서 가져올 수있는 간단한 세션 ID로 암호화 된 쿠키를 저장하는 것을 의미 할 수 있습니다 . 주 데이터베이스에 충돌 하지 않도록 충분한 정보를 저장할 수있는 경우 모든 요청에서 당신은 좋은 장소에있을 것입니다-하지만 쿠키를 1K 미만으로 유지하려고합니다.
  2. 둘 이상의 모델이있을 수 있습니다. 모델과 프로젝션 측면에서 생각하십시오 (여기서 찾은 링크는 좋지 않았습니다. 생각하지 마십시오. 생각하십시오. 한 남자의 인벤토리 항목은 다른 남자의 주문 광고 항목입니다-기본 구조는 동일하지만보기는 다릅니다). 일부 프로젝트는 논리적 / 개념적 경계마다 모델이 다릅니다 (예 : 특정 API와의 통신을 위해 특정 모델 사용).
  3. API는 어디에나 있습니다! 객체 / 클래스 / 구조가 데이터 또는 동작을 노출 할 때마다 API를 설정합니다. 다른 엔티티 또는 종속성이이 API를 사용하는 방법에 유의하십시오. 이 API를 어떻게 테스트 할 수 있는지 생각해보십시오. 이 API (코드를 통한 다른 개체, 프로토콜을 통한 다른 시스템)와 대화 할 수있는 데이터와 데이터가 노출되는 방식 (강력한 유형, JSON, 기침 * XML)을 고려하십시오.
  4. 당신이 지금부터 2 년을 가질 것이라고 상상하는 것이 아니라 당신이 가진 것을 위해 건설하십시오. 또 다른 대답 은 YAGNI를 참조 합니다 -절대적으로 정확합니다! 허수 문제를 해결하면 마감 시한을 상상할 수 있습니다. 반복에 대한 확실한 목표를 설정하고 충족 시키십시오. 배포! 개발중인 프로젝트는 한 명의 사용자 만있는 프로젝트입니다.
  5. YMMV (마일리지가 다를 수 있음). 여기에는 하나의 절대 요소 만 있습니다. 문제가 있습니다. 솔루션을 구축하고 있습니다. 다른 모든 것은 완전히 공중에 있습니다. 위의 두 가지 솔루션 모두 성공할 수 있으며 빠는 데 실패 할 수 있습니다. 그것은 모두 귀하, 귀하의 도구 및 도구 사용 방법에 달려 있습니다. 동료 개발자를 가볍게 밟으십시오!

2
좋은 답변입니다! 나는 당신에게 당신의 글에 대해 당신에게 무언가를 수여하기를 원하지만, 아무것도 생각할 수 없기 때문에 나는 당신의 트위터를 따를 것입니다. : P
Dan

"강력하게 입력 했습니까? JSON? * 기침 * XML" 무엇이 누락 되었습니까?
Alexander Derck

1
@AlexanderDerck 필자는 세 가지 다른 형식 지정 옵션에 대해 언급하고 있습니다 (더 많지만). "농담"은 XML을 다루기가 어려울 수 있고 종종 오버 헤드 (직렬화 / 직렬화 해제)를 추가 할 수 있다는 것입니다. 때로는 필요가 없다고 말하는 것은 아닙니다 (특히 외부 그룹과 함께 일할 때).
Bobby D

6

비즈니스 객체에 직접 직접 액세스하는 것은 컨트롤러에서 더 빠르고 쉽다는 것을 의미합니다.

클라이언트가 다른 클라우드 서버에서 API와 웹을 호스팅하고 API에만 스케일링을 적용하거나 API와 웹에 액세스하기 위해 다른 URL을 원할 경우 (논리적 임)

그런 다음 개별적으로 호스팅해야하지만 ... 나에게 논리적으로 들리지는 않습니다. 확실히 두 가지를 모두 확장하고 싶습니다. 이 요구 사항을 충족시켜야합니까? 그것은 잔인한 것 같습니다. YAGNI를 기억하십시오-필요하지 않으면 빌드하지 마십시오. 필요할 때 빌드하십시오.

내가 사이트라면 최고의 사이트에 맞는 기술을 사용하여 사이트를 구축하고 다른 사람들이 별도로 빌드 할 수있는 서비스가 필요할 때


스케일링이 중요하고 우려의 분리가 나에게 중요하기 때문에 나는 당신에게 완전히 동의합니다. n- 계층 아키텍처를 쉽게 업그레이드하거나 유지 관리 할 수있는 기술 변경으로 생각하는 것이 좋습니다. 예를 들어, 도커 컨테이너로 감싸는 것은 나중에 고려해야 할 또 다른 것입니다.
Ishwor Khanal

4

내가 말할 것; HTTPClient를 통해 WebVC를 호출하는 MVC를 선호하십시오. "core dll"논리를 압도하는 것이 압도적이지만 주요 이점은 전체 시스템이 HTTP의 도메인 객체에 단일 지점으로 액세스 할 수 있다는 것입니다. 클라이언트 측 프레임 워크 (AngularJS 등)는 MVC를 다른 클라이언트로 취급하고 API를 잘 관리하기 위해 팀을 제자화하는 것이 더 좋습니다 ...

그대로 유지하십시오. 이 도움을 바랍니다. 감사..


이것이 왜 투표에 실패했는지는 확실하지 않지만 좋은 아키텍처 imo에 대한 최상의 답변입니다
weagle08

나는 자신의 MVC 앱에서 API를 호출하는 것이 좋은 생각이라고 생각한 상황에 대해 숙고하고 있었지만 서버 로직의 호출을 언급하는 다른 질문과 다른 질문과는 다르다고 생각합니다. 필자의 경우 실제로 Vue가 복잡한 UI를 형성하고 데이터를 해당 API에 전달하는 뷰에서 실제로 호출 할 것입니다. 그런 다음 내 경우에는 실제로 뷰 대 서버 측 항목에서 호출하고 모든 종류의 UI를 고려할 때 http 호출이 수행 되었기 때문에 합법적이라는 것을 깨달았습니다. 그러나 JS 환경에서만 작동합니다.
바실리 홀

API를 직접 호출하는 것은 좋은 생각입니다 ....하지만 MVC 뷰는 서버에서 생성되므로 부분 뷰 (뷰)를 렌더링하기 전에 특히 서버 처리와 관련이있는 서버에서 데이터를 처리 할 수 ​​있습니다 ... RESS 프레임 워크 (RESS : 응답 성이 뛰어난 웹 디자인 + 서버 측 구성 요소) ..... 그러나 MVC를 완전히 피할 수 있다면 최상의 사용 퓨어 클라이언트 프레임 워크 (Angular / ReactJS)
Manoj Kumar Bisht
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.