백엔드를 API로 작성해야합니까?


322

오늘 MVC 애플리케이션에 대해 열띤 토론을했습니다. 우리는 MVC ( ASP.NET )로 작성된 웹 사이트를 가지고 있으며 일반적으로보기에서 무언가의 패턴을 따릅니다.-> 컨트롤러를칩니다. 컨트롤러 방법 자체)-> 모델보기-> 헹굼 및 반복.

그는 우리 코드가 너무 밀접하게 결합되어 있다고 말했다. 예를 들어 데스크톱 응용 프로그램을 원한다면 기존 코드를 사용할 수 없습니다.

그가 말한 솔루션과 모범 사례는 API를 구축 한 다음 API를 기반으로 웹 사이트를 구축 한 다음 데스크톱 애플리케이션, 모바일 앱 등을 구축하는 것은 매우 간단합니다.

이것은 여러 가지 이유로 나에게 나쁜 생각처럼 보입니다.

어쨌든 나는이 연습을 논의 할 수있는 인터넷 검색으로 아무것도 찾을 수없는 것 같습니다. 누구나 장단점, 왜 해야하는지, 왜 더 이상 읽지 말아야하는지에 대한 정보가 있습니까?

나는 그것이 나쁜 생각이라고 생각하는 몇 가지 이유 :

  • 백엔드를 API에서 실행하기에는 너무 추상적입니다. 당신은 그것을 너무 유연하게 만들어서 다루기 어려운 혼란을 만들려고합니다.

  • MVC에 내장 된 모든 것은 역할 및 인증과 같이 쓸모없는 것처럼 보입니다. 예를 들어, [Authorize] 속성 및 보안; 당신은 자신의 롤을해야합니다.

  • 모든 API 호출에는 보안 정보가 첨부되어 있어야하며 토큰 시스템 등을 개발해야합니다.

  • 프로그램이 수행 할 모든 단일 기능에 대해 완전한 API 호출을 작성해야합니다. 구현하려는 거의 모든 메소드를 API에서 실행해야합니다. 모든 사용자에 대한 가져 오기 / 업데이트 / 삭제와 서로 다른 작업 (예 : 사용자 이름 업데이트, 사용자를 그룹에 추가 등)에 대한 변형이 있으며 각각 고유 한 API 호출입니다.

  • API와 관련하여 인터페이스 및 추상 클래스와 같은 모든 종류의 도구가 손실됩니다. WCF 와 같은 기능은 인터페이스를 매우 강력하게 지원합니다.

  • 사용자를 생성하거나 일부 작업을 수행하는 방법이 있습니다. 50 명의 사용자를 만들려면 50 번만 호출하면됩니다. 이 방법을 API로 사용하기로 결정하면 로컬 웹 서버가 명명 된 파이프에 연결할 수 있으며 아무런 문제가 없습니다. 데스크톱 클라이언트도 충돌 할 수 있지만 갑자기 대량 사용자 생성에는 인터넷을 통해 API를 50 번 망치게됩니다. 좋지 않아 따라서 대량 메서드를 만들어야하지만 실제로는 데스크톱 클라이언트 용으로 만드는 것입니다. 이 방법으로 a) 통합하는 것을 기반으로 API를 수정하고 직접 통합 할 수는 없으며 b) 추가 기능을 만들기 위해 더 많은 작업을 수행해야합니다.

  • 야 그니 . 예를 들어 하나의 웹과 하나의 Windows 응용 프로그램과 같이 동일한 기능을하는 두 개의 응용 프로그램을 작성할 계획이 아니라면 엄청난 양의 추가 개발 작업입니다.

  • 엔드 투 엔드를 단계별로 진행할 수 없으면 디버깅이 훨씬 어려워집니다.

  • 예를 들어, 일부 코드는 현재 사용자를 얻거나, 사용자가 관리자 역할에 있는지 확인하고, 사용자가 속한 회사를 얻거나, 다른 구성원의 목록을 얻고, 모두를 보낼 수 있습니다. 이메일. 이를 위해서는 많은 API 호출이 필요하거나 원하는 특정 작업을 위해 맞춤형 메소드를 작성해야합니다.이 맞춤형 메소드의 유일한 이점은 속도이지만 단점은 융통성이 없을 것입니다.

  • 아마도 더 많은 이유는 이것들이 내 머리 꼭대기에 있습니다.

두 개의 동일한 응용 프로그램이 실제로 필요하지 않으면 나에게 좋아 보입니다. 그러면 가치가 없습니다. 이처럼 빌드 된 ASP.NET 응용 프로그램을 본 적이 없으므로 두 개의 별도 응용 프로그램 (API 및 코드)을 작성하고 버전을 제어해야합니다 (사용자 페이지에 새로운 필드가 있으면 d API와 소비 코드를 동시에 업데이트하여 악영향을 방지하거나 강력한 추가 작업을 수행해야합니다.


편집 : 몇 가지 훌륭한 반응, 실제로 이것이 모두 의미하는 바를 시작하기 시작했습니다. 내 질문을 확장하기 위해이 API 구조를 따르도록 MVC 앱을 어떻게 구성합니까?

예를 들어, 사용자에 대한 정보를 표시하는 웹 사이트가 있습니다. MVC에서는 다음이 있습니다.

UserViewModel Controller를 표시하는 View-(CS) HTML 페이지-GetUser ()를 호출하고 GetUser 메소드가있는 View Manager 클래스 (API 정렬)에 전달하는 UserViewModel을 작성합니다.

컨트롤러는 GetUser ()를 수행하지만 데스크톱 앱도 필요합니다. 이것은 GetUser가 어떤 종류의 API를 통해 노출되어야 함을 의미합니다. TCP 연결 (WCF 또는 원격)을 원할 수 있습니다. 지속적인 연결이 약하기 때문에 RESTful 한 모바일 앱도 필요합니다.

그러면 GetUser () 메소드를 가진 WCF 웹 서비스와 각각의 API를 작성하고 코드는 그냥 수행 return new UserManager().GetUser()합니까? 그리고 같은 일을하는 mvc 4 웹 API 방법? MVC 컨트롤러 메소드에서 직접 GetUser를 계속 호출하면서?

또는 세 가지 (웹 API REST 서비스) 모두에 대해 작동하는 솔루션을 선택하고 그 위에 모든 것을 구축하여 세 가지 앱 모두 API 호출 (mvc 호출)을 로컬 컴퓨터로 만듭니다.

그리고 이것은 이론적으로 완벽한 시나리오입니까? 특히 RESTful 방식으로 작업을 수행 할 수있는 방식으로 개발해야하는 경우 이러한 방식으로 개발할 때 큰 오버 헤드가 발생할 수 있습니다. 나는 이것들 중 일부가 답장에 포함되어 있다고 생각합니다.


편집 2 : 더 많은 내용을 읽은 후에는 설명 할 수 있다고 생각하는 의견을 아래에 넣었습니다. 질문은 내가 생각하는 약간의 트릭 질문입니다. API로 백엔드를 작성하면 혼란스럽게 생각하면 모든 것이 (mvc 앱, 데스크톱 앱, 모바일 앱) 호출하는 단일 웹 서비스가 있어야한다고 생각합니다.

결론은 비즈니스 로직 계층이 올바르게 분리되었는지 확인하는 것입니다. 내 코드를 보면 이미이 작업을 수행합니다. 컨트롤러가 GetUser()관리자 를 호출 한 다음 뷰에서 렌더링 할 뷰 모델을 만듭니다. 실제로 비즈니스 로직 계층 API입니다. 그러나 데스크톱 앱에서 호출하려면 WCF 서비스와 같은 것을 작성하여 쉽게 호출해야합니다. GetUser()코드를 포함 하는 WCF 메소드 만 return MyBusinessLayer.GetUser()있으면 충분합니다. 따라서 API는 비즈니스 로직이며 WCF / 웹 API 등은 외부 응용 프로그램이 호출 할 수있는 코드입니다.

따라서 비즈니스 로직 계층을 필요한 것에 따라 다른 API로 랩핑해야하고 다른 앱에서 수행하려는 각 작업마다 API 메소드를 작성해야한다는 오버 헤드가 있습니다. 인증을 수행하는 방법을 정렬하지만 대부분 동일합니다. 비즈니스 로직을 별도의 프로젝트 (클래스 라이브러리)에 집어 넣으면 아무런 문제가 없을 것입니다!

이 해석이 정확하기를 바랍니다. 모든 토론 / 의견에 감사드립니다.


25
그것이 나쁜 생각이라고 생각하는 이유를 밝힐 수 있습니까? 요즘 나는 그것을하지 않을 이유가 없다고 인정해야합니다. 다른 장점들 중에서도 애플리케이션을 다른 플랫폼으로 이식하는 것이 훨씬 쉬우 며 백엔드 코드를 건드리지 않고도 프론트 엔드에서 뛰어난 유연성을 제공합니다.
Laurent S.

12
@ SLC : API를 말할 때 SOAP 또는 REST 인터페이스와 같은 웹 서비스 API를 의미합니까? 백엔드를 API로 만들어야하지만 웹 서비스로 만들면 안됩니다.
JacquesB 2016 년

7
@IanNewson "예를 들어 모바일 앱은 기능이 적은 경향이 있습니다." I 모바일 앱은 ... (아직 모두가 이런 식으로 할 것) 두 번째 클래스 시민해야하는 이유를 설득력있는 이유를 들어 본 적이없는
마이클

3
@IanNewson 어쩌면 그것은 단지 나일지도 모르지만 ... 나는 항상 모바일에서 내가 할 일이 거의없는 지점까지 모바일에서 어떤 일이나 다른 일을 할 수 없어서 자신을 혼란스럽게 생각합니다.
Michael

11
YAGNI가 적용되지만 내 경험에 따르면 앱은 몇 년마다 UI를 다시 작성하거나 모두가 필요하다고 불평합니다. 새로운 프론트 엔드 기술이 도착했기 때문에 비즈니스 로직을 잃지 않으면 좋을 것입니다.
corsiKa

답변:


282

네 그렇습니다.

백엔드를 재사용 할 수있을뿐만 아니라 보안을 강화하고 설계를 개선 할 수 있습니다. 단일 시스템의 일부로 백엔드를 작성하는 경우 확장, 교체 또는 향상이 쉬운 모 놀리 식 디자인을 만들고 있습니다.

이것이 현재 인기있는 영역 중 하나는 Microservices 입니다. 백엔드가 클라이언트 시스템이 사용하는 API를 각각 제공하는 많은 작은 (또는 큰) 서비스로 분할되는 경우. 응용 프로그램에서 많은 타사 데이터 소스를 사용한다고 상상한다면 이미 수행 중일 수 있습니다.

또 다른 이점은 각 서비스의 구성 및 유지 관리가 다른 팀에 전달 될 수 있으며 다른 팀 생산 제품에 영향을 미치지 않는 기능을 추가 할 수 있다는 것입니다. 서비스가 완료되고 서비스를 릴리스 할 때만 제품에 기능을 추가하여 소비합니다. 이렇게하면 개발이 훨씬 순조롭게 진행될 수 있습니다 (전반적으로 속도는 느리지 만 품질은 좋아지고 이해할 수있는 경향이 있습니다)


편집 : OK 문제가 보입니다. API를 원격 라이브러리로 생각합니다. 그렇지 않습니다. 서비스를 더 많은 데이터 제공 서비스로 생각하십시오. 서비스를 호출하여 데이터를 가져온 다음 해당 데이터에 대한 작업을 로컬로 수행합니다. 사용자가 로그온했는지 확인하려면 " GetUser"를 호출 한 후 'logged on'값 을 확인하십시오 . ( 물론 예를 들어 YMMV ).

대량 사용자 생성에 대한 예는 변명을하는 것입니다. 모 놀리 식 시스템에서 수행 할 수있는 모든 작업은 여전히 ​​서비스 아키텍처에서 수행 할 수 있습니다 (예 : 사용자 배열을 대량 생성하도록 전달했거나 하나의 서비스를 생성 할 수 있습니다. 서비스와 동일한 작업을 계속 수행 할 수 있습니다).

MVC는 이미 격리 된 서비스 개념에 기반을두고 있으며 MVC 프레임 워크 만 단일 프로젝트로 묶습니다. 그렇다고 프레임 워크가 제공하는 번들 헬퍼 이외의 것을 잃어버린 것은 아닙니다. 다른 프레임 워크를 사용하면 다른 도우미를 사용해야합니다. 또는이 경우 자신의 롤링 (또는 라이브러리를 사용하여 직접 추가)하십시오.

디버깅도 쉽습니다. API를 철저히 테스트하여 디버깅 할 필요가 없습니다. API를 디버깅 할 필요가 없습니다. 엔드 투 엔드를 디버깅 할 수 있으므로 Visual Studio는 여러 프로세스에 동시에 연결할 수 있습니다.

보안을 구현하는 추가 작업과 같은 것이 좋습니다. 현재 모든 코드를 웹 사이트에 묶으면 해커가 액세스 할 수 있으면 DB가 포함 된 모든 코드에도 액세스 할 수 있습니다. API로 분할하면 해커가 API 계층도 해킹하지 않는 한 코드로 거의 작업을 수행 할 수 있습니다. 그들은 OS 또는 웹 서버를 해킹했으며 DB에 직접 연결되어 " select * from users"를 쉽게 실행할 수 있습니다 .

필자는 이와 같이 작성된 많은 웹 사이트 (및 클라이언트-서버 응용 프로그램)를 보았습니다. 금융 서비스 산업에서 일할 때 아무도 너무 많은 보안 위험 때문에 웹 사이트를 올인원으로 작성하지 않았으며, 많은 개발이 안정적인 (예 : 레거시) 백엔드 데이터 처리에 비해 GUI가 많기 때문에 시스템. 서비스 스타일 아키텍처를 사용하여 DP 시스템을 웹 사이트로 쉽게 노출 할 수 있습니다.

2 차 편집 : 주제에 대한 일부 링크 (OP의 경우) :

웹 사이트와 관련하여 이것에 대해 이야기 할 때 웹 서버는 다른 계층을 호출하는 클라이언트이기 때문에 렌더링을 위해 브라우저로 전송되는 UI보기를 구성하기 때문에 프레젠테이션 계층으로 간주해야합니다. 큰 주제이며 데이터 중심 또는 도메인 중심의 응용 프로그램을 설계하는 여러 가지 방법이 있습니다 (일반적으로 도메인 중심은 '순수한 것으로 생각되지만 YMMV`` 라고 생각합니다 ). 그러나 그 사이에는 논리 계층을 고수하는 것이 있습니다 클라이언트와 DB. 중간, API, 계층이 모델과 동등한 것으로 간주하면 MVC와 약간 같으며 모델 만 DB의 단순한 래퍼가 아니며 더 풍부하고 훨씬 더 많은 작업을 수행 할 수 있습니다 (예 : 2 개의 데이터 소스에서 데이터 집계, 게시) -API에 맞게 데이터를 처리하고 데이터를 캐시하는 등)


2
건축 우주 비행사 관점에서 그렇습니까? 서비스 관점에서 두 번째 및 세 번째 단락을 이해할 수 있지만 GetUser, CreateUser, IsUserLoggedIn 및 이전에는 한 줄의 코드로 API 호출로 변환 된 수백 가지의 작은 함수에 대해 이야기하고 있습니다.
NibblyPig

12
웹 사이트로 작성한다고 상상해보십시오. 작은 기능은 모두 대화식으로 대화 할 수 없으므로 페이지를 구성하는 동안 데이터를 가져와 로컬로 캐시해야합니다. 시스템에 적합한 클라이언트). 이를 위해서는 디자인을 "요청시 반응"에서 "선착 적 예측"으로 변경해야하지만 대부분의 시스템에서 API 호출이 이루어집니다. 보다 세분화되고 데이터 중심적인 API를 설계하십시오. 따라서 IsUserLoggedOn은 API 호출 일 필요가 없으며 로컬로 검사 한 후에는 "GetUserDetails"만 있으면됩니다.
gbjbaanb

5
우리는 마지막 직장에서이 방법을 사용했고 훌륭하게 작동했습니다. 우리의 주요 제품은 웹 응용 프로그램 이었지만 웹 응용 프로그램이 모든 데이터에 대해 수행 한 것과 동일한 웹 서비스에 액세스 할 수있는 데스크톱 응용 프로그램 및 Excel 시트를 만들 수 있었고 고객에게 서비스를 추가로 노출 할 수있었습니다. 그들에 대한 프로그램.
Kik

2
또 다른 이점이 있습니다. 백엔드 API를 웹 사이트 고객에게 노출 할 수 있습니다. 우리 회사에서이 작업을 수행했으며 일부 대규모 소프트웨어 회사 고객 (호스트에서 백엔드를 사용해 본 후)은 자체적으로 자체 호스팅 제품으로 백엔드를 정리하기 위해 비용을 지불했습니다. 제품에 따라 일부 고객은 프론트 엔드 한척의 작은 관심과 당신의 제품이 실제로 무엇에 더 많은 관심 않습니다 백엔드 -. 그것은 판매 할 또 다른 제품입니다.
리드

2
또한 웹 서비스에서 동일한 논리를보다 쉽게 ​​사용할 수 있습니다. 우리 팀이 항상 할 필요는 없다고 생각하는 것 중 하나입니다. 단위 테스트도 쉬워집니다.
ps2goat

87

API 빌드를 피할 수는 없습니다 . "단지 웹 사이트"를 구축하더라도 여전히 백엔드에서 데이터를 가져와야합니다. 그러나이 작업을 수행하기로 결정했습니다 ( 실제로 API).

이를 알면 실제 질문은 API를 빌드할지 여부가 아니라 API를 빌드하는 방법 입니다. 임시 작업 으로 즉석에서 수행 할 수 있으며 실제로 많은 웹 사이트가 이와 같이 정확하게 구축되어 있거나 다른 상황에서 사용할 수 있도록 신중하게 디자인 할 수 있습니다. 이러한 맥락에서 동료가 옳다는 것이 분명해집니다. 먼저 API를 수행 한 다음 그 위에 사이트를 구축해야합니다.

그럼에도 불구하고 이것은 지적한 바와 같이 몇 가지 우려를 불러 일으킨다. 그것들을 해결하려면 :

백엔드를 API에서 실행하기에는 너무 추상적입니다. 너무 유연하게 만들어서 관리하기 어려운 엉망으로 만들려고합니다.

그것은 당신이 어떻게하는지에 달려 있습니다. 으로 조지 폴리 -A는 그의 뛰어난 텍스트로 지적 그것을 해결하는 방법 , 자주 "더 일반적인 문제는 해결하기 쉬울 수 있습니다." 이것을 Inventor의 Paradox 라고합니다 . 프로그래밍의 경우, 종종 분리를 통해 작동합니다. 백엔드는 더 이상 데이터가 들어오고 나가는 데이터 형식에 대해 신경 쓸 필요가 없으므로 코드가 훨씬 간단 해집니다. 데이터 파서 및 렌더러는 더 이상 데이터가 생성하는 데이터에 대해 신경 쓸 필요가 없으므로 더 간단 할 수 있습니다. 코드를 더 관리하기 쉬운 덩어리로 나누면 모두 작동합니다.

MVC에 내장 된 모든 것은 역할 및 인증과 같이 쓸모없는 것처럼 보입니다. 예를 들어, [Authorize] 속성 및 보안; 당신은 자신의 롤을해야합니다.

나는 도구를 배우기를 거부하는 사람들과 동정하기가 매우 어렵다고 고백한다. 당신이 그들의 사용을 이해하지 못한다고해서 그들이 쓸모 없다는 것을 의미하지는 않으며, 반드시 자신의 것을 굴려야한다는 것을 의미하지는 않습니다 . 꽤 대조적 인 것; 대안을 이해 하기 전까지는 자신의 툴을 사용하지 말아야합니다. 그래야 툴 과 동일한 문제를 해결할 수 있습니다 (자신 만의 방식으로도).

리눅스 를 쓰는 것으로 가장 유명 하지만 현재 세계에서 가장 인기있는 버전 제어 시스템 중 하나 인 git 을 쓴 Linus Torvalds를 고려하십시오 . 그의 디자인에서 구동 요소 중 하나에 깊은 반대였다 서브 버전 (다른 매우 인기 VCS 시간 자식에, 틀림없이 가장 인기를 작성되었습니다) 그는 Subversion이 할 수있는 모든 것을, 가능한 범위 내에서 그 문제를 다르게 해결하기로 결심했습니다. 이를 위해 그는 동일한 문제 영역을 이해하고 다른 접근 방식을 취할 수 있도록 정확하게 Subversion의 전문가가되어야했습니다 .

또는 도구를 배우는 과정에서 도구가 그대로 유용하며 교체 할 필요가 없다는 것을 알게 될 수도 있습니다.

모든 API 호출에는 보안 정보가 첨부되어 있어야하며 토큰 시스템 등을 개발해야합니다.

예. 이렇게해야합니다.

프로그램이 수행 할 모든 단일 기능에 대해 완전한 API 호출을 작성해야합니다. 구현하려는 거의 모든 메소드를 API에서 실행해야합니다. 모든 사용자에 대한 가져 오기 / 업데이트 / 삭제와 서로 다른 작업 (예 : 사용자 이름 업데이트, 사용자를 그룹에 추가 등)에 대한 변형이 있으며 각각 고유 한 API 호출입니다.

반드시 그런 것은 아닙니다. REST 와 같은 아키텍처가 사용되는 곳 입니다. 응용 프로그램이 작동하는 리소스와 해당 리소스에 적용 할 수있는 작업을 식별 한 다음 다른 것에 대해 크게 걱정하지 않고 구현합니다 .

API와 관련하여 인터페이스 및 추상 클래스와 같은 모든 종류의 도구가 손실됩니다. WCF와 같은 기능은 인터페이스를 매우 강력하게 지원합니다.

반대로 API를 사용할 때는 인터페이스가 훨씬 중요해집니다 . 그것들은 당신이 표현한 표현으로 나옵니다. 요즘 대부분의 사람들 은이를 위해 JSON 기반 형식을 지정 하지만 원하는대로 지정하면 원하는 형식을 사용할 수 있습니다. 콜백 결과를 백엔드에서 렌더링하고 프런트 엔드에서 원하는 유형 (같은 종류의 객체)으로 구문 분석합니다. 오버 헤드는 작고 유연성의 이점은 엄청납니다.

사용자를 생성하거나 일부 작업을 수행하는 방법이 있습니다. 50 명의 사용자를 만들려면 50 번만 호출하면됩니다. 이 방법을 API로 사용하기로 결정하면 로컬 웹 서버가 명명 된 파이프에 연결할 수 있으며 아무런 문제가 없습니다. 데스크톱 클라이언트도 충돌 할 수 있지만 갑자기 대량 사용자 생성에는 인터넷을 통해 API를 50 번 망치게됩니다. 좋지 않아 따라서 대량 메서드를 만들어야하지만 실제로는 데스크톱 클라이언트 용으로 만드는 것입니다. 이 방법으로 a) 통합하는 것을 기반으로 API를 수정하고 직접 통합 할 수는 없으며 b) 추가 기능을 만들기 위해 더 많은 작업을 수행해야합니다.

기존 메소드의 대량 버전을 작성하는 것은 "더 많은 작업"이라고 부르는 것이 아닙니다. 원자 성과 같은 것들에 대해 걱정하지 않는다면, 벌크 방법은 원본에 대한 매우 얇은 프론트 엔드에 지나지 않을 수 있습니다.

야 그니 . 예를 들어 하나의 웹과 하나의 Windows 응용 프로그램과 같이 동일한 기능을하는 두 개의 응용 프로그램을 작성할 계획이 아니라면 엄청난 양의 추가 개발 작업입니다.

아니요, YANI (이미 필요합니다). 위와 같이 설명했습니다. 유일한 질문은 얼마나 많은 디자인 작업을 넣을 것인가입니다.

엔드 투 엔드를 단계별로 진행할 수 없으면 디버깅이 훨씬 어려워집니다.

엔드 투 엔드를 단계별로 진행할 수없는 이유는 무엇입니까?

그러나 요점까지는, 모든 디스플레이 크루프를 잘라내는 쉽게 인식되는 형식으로 데이터를주고받을 수 있다는 것이 실제로 디버깅을 어렵지 않게 만드는 경향이 있습니다.

예를 들어, 일부 코드는 현재 사용자를 얻거나, 사용자가 관리자 역할에 있는지 확인하고, 사용자가 속한 회사를 얻거나, 다른 구성원의 목록을 얻고, 모두를 보낼 수 있습니다. 이메일. 이를 위해서는 많은 API 호출이 필요하거나 원하는 특정 작업을 위해 맞춤형 메소드를 작성해야합니다.이 맞춤형 메소드의 유일한 이점은 속도이지만 단점은 융통성이 없을 것입니다.

REST 는 객체 의 개별 속성 대신 완전한 객체 ( 자원 , REST 이론의 용어를 사용하기 위해)를 사용 하여이를 해결 합니다 . 사용자 이름을 업데이트하려면 사용자 개체를 가져 와서 이름을 변경하고 사용자를 다시 붙여 넣습니다. 사용자 이름을 변경하는 동시에 다른 변경을 수행 할 수도 있습니다. 보다 일반적인 문제는 객체의 개별 속성을 업데이트하기위한 개별 호출을 모두 제거 할 수 있기 때문에 해결하기가 더 쉬워집니다.로드하고 저장하기 만하면됩니다.

어떤면에서 이것은 하드웨어 측면의 RISC 아키텍처 와 다릅니다 . RISC와 CISC (이전 버전) 의 주요 차이점 중 하나는 CISC 아키텍처에는 메모리에서 직접 작동하는 많은 명령어가 포함되는 반면 RISC 아키텍처는 레지스터에서 주로 작동하는 경향이 있다는 것입니다. 순수한 RISC 아키텍처에서는 메모리에 대한 유일한 작업은 다음과 같습니다. LOAD (메모리에서 레지스터로 무언가 복사) 및 STORE (레지스터에서 값을 가져 와서 메모리에 저장)

이것은 레지스터에서 메모리로 더 많은 트립을 수행하는 것을 의미하므로 시스템 속도가 느려질 것입니다. 그러나 실제로는 반대의 경우가 종종 발생합니다. 프로세서 (클라이언트)는 메모리 (서버) 로의 트립간에 더 많은 작업을 수행하며 , 이로 인해 속도가 향상됩니다.

간단히 말해 : 동료가 옳습니다. 이것은 갈 길입니다. 작은 선행 작업에 대한 대가로, 그것은 극적으로 당신의 웹 사이트에 대한 코드를 단순화 하고 다른 웹 사이트와 앱을 더 잘 통합 할 수 있습니다. 그것은 지불 할 가치가있는 가격입니다.

더 읽을 거리 :

  1. REST API 설계-자원 모델링

7
이것들도 사실상 일종의 API를 가지고 있습니다 . 그들은 다른 많은 개발자들을 공포에 빠뜨리는 경향이 있지만 API는 모두 동일합니다. 잘 디자인 된 것은 아닙니다.
Spooniest 2016 년

7
그 결과 API가 매우 열악 해져서 많은 사람들이 API로 생각하지 않습니다. 그러나 여전히 프런트 엔드가 백엔드와 상호 작용하는 방식을 정의하지만 그렇게 조잡 할 수도 있습니다. 이것을 API로 생각하면 잘 수행하는 것이 중요합니다.
Spooniest 2016 년

1
리눅스 커뮤니티가 커널에 사용 된 상용 Bitkeeper DVCS의 사용에 반항했기 때문에 Linus가 git을 만들었다 고 생각합니다.
gbjbaanb

2
첫 번째 문장은 나의 모든 혼란을 없애줍니다. API라는 용어를 웹 서비스와 연관 시켰기 때문에 이것이 혼란 스러웠던 주된 이유입니다.
NibblyPig 2016 년

4
@IanNewson : 코드와 인터페이스하는 방법이 있는데,이를 http라고합니다. 관련성이없는 요구 사항이 많고 관련이없는 데이터를 많이 리턴 할 수 있지만 이것이 API를 크게 만드는 이유입니다.
jmoreno

63

마이크로 서비스가 지금은 모든 분노라는 것을 알고 있지만 항상 가치가있는 것은 아닙니다. 그렇습니다. 느슨하게 결합 된 코드가 목표입니다. 그러나 더 고통스러운 개발주기를 희생해서는 안됩니다.

좋은 중간 근거는 솔루션에서 별도의 데이터 프로젝트를 만드는 것입니다. 데이터 프로젝트는 .NET 클래스 라이브러리입니다. 그러면 ASP.NET MVC 프로젝트는 데이터 라이브러리에 대한 참조를 추가하고 모든 모델은 데이터 프로젝트에서 가져옵니다. 그런 다음 데스크톱 또는 모바일 앱을 만들 때가되면 동일한 코드를 참조 할 수 있습니다. 따라서 공식 API는 아니지만 하나의 기능을합니다. API로 액세스 할 수있게하려면 데이터 프로젝트에서 랩퍼 역할을하는 간단한 웹 프로젝트를 작성할 수 있습니다.

Microsoft는이 개념을 Portable Class Libraries 라고 부르고 있습니다.


13
동일한 공유 데이터 구조를 호출하여 로직이 UI 계층에 배치 된 프로젝트를 유지해야했습니다. 그 때문에 " 버그 하나를 30 번 수정 해야했습니다 ("같은 논리를 다시 사용해야한다면 API를 복사 할 필요가 없습니다 "). 로직 레이어가 있었지만 (현재 존재 함) 단 하나의 수정만으로 충분했을 것입니다.
SJuan76

1
이 답변은 해당 라이브러리를 자체 NuGet 패키지에 배치하고 자체 NuGet 패키지 피드 / 서버를 호스팅하는 것 외에도 좋은 방법입니다. 까다로운 네트워크에 대해 걱정할 필요가 없으며 모든 호출을 스레드에 로컬로 (따라서 더 빠르게) 만들 수 있으며 NuGet을 사용하여 클래스 lib에 적절한 버전을 도입하면 다른 팀이 업그레이드 할 때 유연성을 얻을 수 있습니다.
Greg Burghardt

34

아니해서는 안됩니다 . 동일한 백엔드에 액세스하는 대체 프론트 엔드 (예 : 모바일 또는 데스크탑 앱 또는 별도의 웹 애플리케이션)를 작성할 계획이없는 경우 웹 서비스 계층을 도입해서는 안됩니다. 야 그니 .

느슨한 결합은 항상 바람직하지만 (높은 응집력과 함께) 설계 원칙이며 다른 서버에서 객체를 물리적으로 분리해야한다는 의미는 아닙니다! 잘못 설계된 서비스 API는 서버 경계에 걸쳐 긴밀한 결합을 생성 할 수 있으므로 API가 있다고해도 느슨한 결합이 보장되지는 않습니다.

향후 서비스 API가 필요한 경우 언제든지 해당 시점에 서비스 API를 도입 할 수 있습니다. 코드를 멋지게 계층화 (데이터 액세스 및 비즈니스 로직이 완전히 분리 된 양식 UI 로직)로 유지하는 한, 지금보다 더 소개하기가 어렵지 않습니다. 실제 요구 사항을 충족하도록 설계 할 경우 결과 디자인이 훨씬 향상됩니다.


참고 질문은 웹 서비스 API를 만들어야 하는지 여부입니다. 문제는 API라고 말하지만 API는 라이브러리의 인터페이스를 의미 할 수도 있으며 물론 모든 레이어에는 정의에 따라 API가 있습니다. 결론은 비즈니스 로직과 데이터 액세스 레이어가 디자인 레벨에서 UI 로직과 완전히 분리되어야하지만 필요하지 않은 경우 웹 서비스 레이어를 도입해서는 안된다는 것입니다.


8
잘못 설계된 것은 좋지 않습니다. API 구축은 더 이상 시간이 걸리지 않으며 미래를 보장합니다. 요즘 변화에 적응할 수있는 능력, 알지도 못하지만 생각보다 더 빨리 올 수있는 모든 요구를 충족시킬 수있는 강력한 기반을 구축하는 것이 좋습니다.
Laurent S.

9
@Bartdude : 미래를 위해 "미래 방지"를 위해 불필요한 복잡성을 소개하는 것은 단지 자원 낭비입니다.
JacquesB

6
@Bartdude api를 추가하는 것은 확실히 더 많은 시간입니다. 당신이 다르게 주장 할 수 있다고 어떻게 생각하는지 모르겠습니다.
이안 뉴슨

13
"웹 서비스 계층을 도입해서는 안됩니다"API! = 웹 서비스. API 뒤에 비즈니스 로직이있는 경우 어느 시점에서 해당 API를 웹 서비스로 노출 할 수 있습니다 . 그러나 선행 요구 사항은 아닙니다.
Celos 2016 년

2
@JacquesB : ... 필요한지 확실하지 않으면 기능을 개발하지 않습니다. 그것이 내가 YAGNI로부터 이해 한 것입니다. 그러나 아키텍처는 기능이 아니며 잘못된 아키텍처 선택으로 인해 비참한 실패가 발생할 수 있습니다. 다시 한 번 나는이 논의가 일어날 수 있다고 가정하는데, 때로는 예산, 시장 출시, 자원 또는 지식 부족으로 인한 경우가 아닐 수도있다. 나는 종종 나와 같은 토론을하면서 당신의 요점을 이해합니다 ^ _ ^
Laurent S.

29

우리 회사에는 이와 같은 응용 프로그램이 하나 있습니다. 처음에 우리는 다른 개발자가 만든 프론트 엔드에 대한 API로 백엔드를 구축하도록 위임 받았습니다. 다른 개발자가 프론트 엔드를 개발할 수 없었을 때 우리도 프론트 엔드를 구축하도록 위임 받았습니다. 이 접근법에는 확실히 이점이 있지만 비용이라는 큰 단점이 있습니다. 초기 빌드는 훨씬 더 많은 비용이 들고 유지 관리하는 코드가 많아지고 두 개의 별도 시스템도 배포되므로 지속적인 유지 관리 비용이 더 많이 듭니다. 추가 비용으로 인해 이는 항상 비즈니스 결정이어야하며 개발자가 부담하지 않습니다.

그것에 대해 설명하기 위해 위에서 언급 한 프로젝트 가이 접근법으로 인해 20 % 더 비싸다고 추정합니다. 어떤 종류의 회사에서 어떤 종류의 프로젝트를 진행하고 있는지 설명하지는 않지만, 제품을 개발하기 시작하는 경우 추가 비용이 제품을 만드는 몇 가지 추가 기능을 제공하는 것의 차이가 될 수 있습니다 성공.

적어도 보편적으로 그렇지 않은 또 다른 이유는 두 번째 인터페이스를 만들려고 할 때 기능에 대한 일대일 매핑이 거의 없기 때문입니다. 예를 들어 모바일 앱을 만드는 경우 기능이 적은 경향이 있습니다. 이는 일부 API 메소드가 재사용되지 않음을 의미합니다. 따라서 동료와의 타협은 가장 중요한 / 중요한 호출을 결정하고 API에 추가하고 다른 모든 방법에는 더 전통적인 방법을 사용하는 것입니다.

고려해야 할 또 다른 요점은 동료가 기존 코드를 재사용 할 수 없다고 말하고 있다는 점입니다. 비즈니스 로직이 분리되어 있으면 사실이 아닙니다. 내부 API 주위에 씬 웹 서비스 래퍼를 작성하기 만하면되는데, 이는 그리 큰 일이 아닙니다. 어쨌든 전혀 변경하지 않고 다른 프런트 엔드에 웹 서비스 계층을 재사용 할 수 있다고 생각하는 것은 순진합니다.


22

신청 유형과 시장 유형에 따라 다릅니다.

이런 식으로 갈 때 장단점이 있습니다. 한 가지 방법이 다른 방법 보다 낫다 는 명확한 대답은 아닙니다 .

개인적인 경험으로 이야기하겠습니다. 저는 2007 년에이 방향으로 작업 한 코드베이스를 사용하기로 결정한 사람이었습니다.이 코드베이스는 현재 백만 줄의 코드 순서로되어 있으며 그 중 절반은 엄청난 양의 웹 서비스 뒤에 숨겨진 서버 코드입니다. API의 다른 절반은 클라이언트, 데스크탑 네이티브, 데스크탑 웹, 모바일, 백엔드 통합 등의 모종입니다.이 결정은 단점이 없었지만 20/20의 후 시점으로 다시 할 것이라고 말할 수 있습니다. . 관련 절충 사항 중 일부를 알려 드리겠습니다.

혜택

  • 적응성. 데스크톱 경험을 향상시키기위한 모바일 앱 구축 요청이든 SAP의 백엔드 통합 요청이든 상관없이 이미 호출 할 API가 있으면 더욱 쉬워집니다. 이러한 요청을 충분히 받으면 API로 유기적으로 발전 할 것입니다. API 앞에 표준 웹 서비스가 있는지 또는 웹 서비스가 맞춤형으로 제공되는 내부 API인지에 대한 유일한 질문입니다.

  • (팀의) 확장 성. 우리의 경우에 우리는이 API를 기반으로 많은 개발자 그룹을 보유하고 있습니다. 우리는 전담 API 팀을 보유하고 있으며, 서로 다른 그룹과 대화하고 요구 사항을 요약하며 다목적 API를 구성합니다. 더 이상 사람들이 API를 기반으로 물건을 만들고 있다고 말하지 않았으며 회사를 위해 일하는 모든 사람이 아닙니다.

  • 보안. 코드베이스의 안전하지 않은 부분과 안전한 부분을 명확하게 구분하면 보안을 추론하는 데 도움이됩니다. UI와 백엔드 코드를 함께 모으면 문제가 혼동되는 경향이 있습니다.

절충

  • 적응성. API에 무언가를 "적절하게"구축하려면 작업을 수행해야합니다. 특정 문제를 해결하기 위해 UI 코드 내에서 DB 쿼리를 빠르게 실행할 수 없습니다. 또한 실제로 재사용 가능한 API는 빠른 솔루션이 일반적으로 잘못된 솔루션이되도록 많은 사용 사례를 고려해야합니다. 특히 이미 클라이언트 코드가 너무 많기 때문에 API의 유연성이 떨어집니다 (이러한 이유로 버전이 지정된 API로 전환 중).

  • 초기 개발 속도. 의심의 여지없이 API 우선 개발 속도가 느립니다. API 위에 충분한 클라이언트가 구축 된 경우에만 이기게됩니다. 그러나 API가 일반적인 수준으로 발전하기 전에 3 가지 클라이언트 구현이 필요하다는 것을 알게되었습니다. 초기 API 디자인의 대부분이 잘못되었으며 웹 서비스 구축 방법에 대한 가이드 라인을 강력하게 수정해야한다는 것을 알았습니다.

붉은 청어

당신은 이것들을 많이 언급했습니다. 실제로 실제로는 중요하지 않습니다.

  • 추출. 귀하의 API는 제품이 제공해야하는 모든 사용 사례를 포괄 할 수있을 정도로 추상화되어 있습니다. 웹 서비스가 없어도이를 수행하는 내부 API가 있거나 중복 코드가 많이 있습니다. 중복보다 추상화를 선호합니다.

  • 서버 측 MVC 스택을 포기합니다. 요즘 거의 모든 시스템에는 모바일 앱이 필요합니다. 그런 다음 해당 모바일 앱을 제공하기 위해 웹 서비스를 빌드 할 때 어쨌든 API 컨텍스트에서 인증 및 권한 부여를 수행하는 방법을 알아야합니다. 웹 서비스에서 수행하는 방식 중 하나만 수행하면 실제로 작업이 줄어 듭니다.

  • 대량 작업. 일반적으로 백엔드 작업을 시작하고 상태 조회를위한 작업 ID를 리턴하는 벌크 API를 작성하여 해결합니다. 그렇게 큰 거래는 아닙니다.

  • 디버깅. 전체적으로 시스템 문제를 해결하는 것이 약간 더 쉬워졌습니다. 프런트 엔드 및 백엔드 코드 모두에서 중단 점을 설정할 수 있으므로 실제로는 단계별로 어렵지 않으며 자동화 된 API 테스트를 작성하고 프로덕션 시스템을 모니터링하기 위해 API를 계측 할 수 있습니다.

  • 많은 독립적 인 작업. 그것은 당신이 디자인하는 방법의 문제입니다. 순수한 CRUD API가 필요하다고 주장하면 예,이 문제로 고통받을 것입니다. 그러나 일반적으로 좋은 아이디어 인 CQRS API를 보강하는 것이 좋으며 서비스가 프런트 엔드 인 내부 API가 있는지 확인한 경우 해당 내부 API를 쉽게 재사용하여 해당 특정 서비스를위한 서비스를 구성 할 수 있습니다 시나리오.

요약하자면

충분히 다른 상황에서 사용되는 시스템에서 API는 모든 요구를 충족시키는 가장 쉬운 방법이므로 자연스럽게 진화합니다. 그러나 YAGNI가 계속 진행되고 있습니다. 절충이 있으며 의미가있을 때까지 의미가 없습니다. 핵심은 독단적이지 않으며, 제품의 진화하는 요구를 충족시키기 위해 건축의 다양한 접근 방식에 대해 열린 마음을 유지하는 것입니다.


흥미로운 내용, API를 설계 할 때 잘못한 점과 배운 점을 자세히 설명 할 수 있습니까?
aaaaaaaaaaaa

3
세 가지 주요 실수는 (1) api를 기본 UI의 요구에 맞게 맞추고, (2) 세션을 사용하여 여러 요청에 걸쳐 상태를 구축하고 (우리는 세션이 없게 됨) (3) 생성 된 사용 만 지원하는 것이 었습니다 사용자가 구성 할 수있는 코드가 더 나은 식별자 인 식별자 인 db id (외부 시스템과의 통합을 위해 일반적으로 나중에 API 대신 API에서 사용하기 위해 시스템에 식별자를 업로드하려고합니다). 약한 문서 및 도움이되지 않는 오류 메시지와 함께이 세 가지를 사용하면 API를 도움없이 사용할 수 없습니다.
Joeri Sebrechts

10

동료가 설명하는 것은 서비스 지향 아키텍처입니다. 이것은 확장 성이 뛰어나고 테스트 가능하며 정상적인 코드 작성 방법이 될 수 있지만 실제로 만드는 것에 따라 다릅니다.

SOA에는 다음과 같은 몇 가지 중요한 이점이 있습니다.

확장 성

백엔드가 분리되었으므로 프론트 엔드는 플랫 파일까지도 일련의 템플릿이됩니다. 플랫 파일은 모든 CDN에서 제공하기에 매우 빠르고 저렴합니다. 그것들은 축소되어 정적 HTML로 사전 컴파일 된 다음 데이터 클라이언트 측으로 채워질 수 있습니다.

API는 일관성을 유지해야하지만 기존 기술을 능가하는 경우 스택을 중단하지 않고 더 빠른 기술로 교체 할 수 있습니다. 예를 들어 Go에서 다시 만들 수 있습니다. 부분적으로 다시 빌드하고 서버에로드를 분산시킬 수 있습니다. 인터페이스가 동일하게 유지되는 한 기술은 추상화됩니다.

테스트 가능성

MVC는 일반적으로 깨끗하게 시작되지만 실제로는 컨트롤러가 단일 리소스에 집중하는 경우는 거의 없습니다. 컨트롤러 메소드가 수행하는 작업이 많을수록 테스트 가능성이 줄어 듭니다.

API가이 문제를 회피합니다. 각 API 호출은 리소스를 가져 와서 제공합니다. 깨끗하고 테스트 가능합니다.

우려 분리 보장

프런트 엔드와 백 엔드가 완전히 이혼했습니다. 다른 개발자 나 디자이너에게 프론트 엔드를 제공 할 수 있습니다. 이것은 다른 수준으로 MVC입니다. MVC를 포기하고 싶지 않을 것입니다. SOA는 MVC이지만 그 밖의 것입니다.

단점

물론 몇 가지 단점이 있습니다. 모놀리스는 종종 더 빨리 진행됩니다. 익숙한 것일 수도 있습니다. 스택에 더 잘 맞을 수 있습니다. 툴은 모놀리스 생성에 최적화되어있을 수 있습니다.

이것들 중 어느 것도 내 의견으로는 특별히 좋은 이유가 아니며, 그들이 당신에게 적용된다면 retooling을 고려할 수도 있습니다.


이것은 지금까지 가장 명확한 대답입니다.
Tony Ennis

7

여기에 좋은 답변이 많이 있으므로 구현 경험을 추가하겠습니다.

이것이 내가하는 일 :

  • 모든 / 전용 DB 상호 작용을 처리하는 데이터베이스 액세스 계층을 작성하십시오 (보통 수동 SQL은 ORM이없는 속도 및 제어에 사용됨) . 삽입, 업데이트, 삭제, 선택 ...
  • 필요한 API 함수를 노출 / 강화 하는 interface( virtual class)를 만듭니다 . 구현시 고도로 전문화 된 DBAL 기능을 사용하여 결과를 달성합니다. 또한 컴파일러 수준에서 API를 시행하는 데 도움이되므로 Server + API 구현에 모든 기능이 내장되어 있는지 확인하십시오.
  • 인터페이스 (실제 API) 를 구현 하고 보안 제한을 적용 하는 두 번째 계층을 만듭니다 . 여기에서 외부 API와 상호 작용할 수도 있습니다.
  • 웹 사이트는 원격 액세스 가능한 API (예 : SOAP, JSON)를 거치지 않고 2 차 계층을 직접 (성능을 위해 ) 사용 합니다.
  • 인터페이스를 구현하고 2 차 계층을 실제 원격 액세스 가능 API로 외부 데스크탑 / 모바일 클라이언트 (비웹 사이트 액세스)에 노출시키는 독립형 서버입니다 . 요청을 디코딩하고 응답을 인코딩하고 클라이언트를 관리 / 연결 끊기 만하면됩니다. 또한 다른 연결된 피어 (일반적으로 웹 사이트에 필요하지 않은 기능)에 의해 생성 된 이벤트를 클라이언트에게 대량으로 알리는 푸시 백 기능을 지원합니다 .

따라서 기술적으로 API는 두 번째 계층입니다. 웹 사이트에서 직접 사용하고 서버를 통해 원격 클라이언트에 노출합니다. 코드가 재사용되고 재사용 가능한 코드 덩어리가 인라인되지 않습니다. (이 규칙에 따라 생활하고 죽으면 모든 것이 굉장합니다) 유지 관리, 테스트 등 모든 것을 도와줍니다.

사이트가 AJAX이고 JSON에서 실행되지 않는 한 웹 사이트를 데스크톱 / 모바일 API 서버에 연결하지 마십시오 . 그러나 사이트에서 마크 업으로 동적 콘텐츠를 렌더링하는 경우 중간 API를 거치면 성능이 향상됩니다. 웹 사이트는 빨라야합니다! 원격 클라이언트 액세스는 조금 느려질 수 있습니다.

추신 : 예, 더 많은 바퀴가 함께 작동하기 때문에 유지 보수가 조금 더 복잡하지만 장기적으로는 더 쉽습니다. 따라서 프로젝트가 오래 지속되고 약간 복잡하다면 항상 API를 사용하십시오. 또한 각 레이어를 자체적으로 테스트하는 것이 훨씬 쉽습니다.


그것은 매우 시원하게 들리며 특히 API 유형 함수에 인터페이스를 배치하는 것이 좋습니다. 다음에 프로젝트를 만들 때이 설정을 시도하겠습니다!
NibblyPig

6

경합의 요점은 API를 사용해야하는 것이 아니라 "API"가 실제로 무엇인지입니다. 설계된 API를 사용하는 유일한 대안은 코드의 무작위 혼란 인 API를 사용하는 것입니다. 당신은 API가 일을 너무 유연하게 만들어서 일을 관리 할 수 ​​없게 만든다고 썼습니다. 이는 API가 무엇인지에 대한 완전하고 철저한 오해를 의미합니다. 그 오해가 당신과 당신의 동료 사이에 공유되지 않는다면, 당신은 완전히 다른 것들에 대해 논쟁함으로써 많은 시간을 낭비합니다.

잘 정의 된 API를 사용하지 않으면 원하는대로 수행 할 수 있습니다. 정의상 이것은 가장 유연한 옵션입니다. 또한 정의에 따라 "원하는대로하십시오"는 여전히 API입니다. API 의 유일한 작업은 유연성을 제거하는 것입니다. 유연성을 제거함으로써 좋은 API는 사용자가 유사한 방식으로 유사한 일을하도록 권장합니다.

물론 잘못된 API는 너무 많거나 너무 적은 유연성을 제공하거나 동시에 둘 다 제공 할 수 있습니다. 제대로 설계되지 않은 API는 "anything goes"접근 방식보다 훨씬 빠르게 프로젝트를 중단시킬 수 있습니다. 그러나 모범 사례는 단순히 응용 프로그램과 함께 API를 개발하고 발전시키는 유능한 프로그래머를 보유하는 것입니다.

예를 들어, 일부 코드는 현재 사용자를 얻거나, 사용자가 관리자 역할을하고 있는지, 사용자가 속한 회사를 얻거나, 다른 구성원의 목록을 가져오고, 보낼 수있는 많은 독립적 인 작업이 필요합니다. 모든 이메일. 이를 위해서는 많은 API 호출이 필요하거나 원하는 특정 작업을 위해 맞춤형 메소드를 작성해야합니다.이 맞춤형 메소드의 유일한 이점은 속도이지만 단점은 융통성이 없을 것입니다.

괜찮은 API에서 필요한 API 호출 수는 아마도 1 일 것입니다. 예, 융통성이 없지만 왜 융통성을 원하십니까?


4

그는 우리 코드가 너무 밀접하게 결합되어 있다고 말했다. 예를 들어 데스크톱 응용 프로그램을 원한다면 기존 코드를 사용할 수 없습니다.

당신 은요? 그렇지 않다면, 그것은 꽤 관련이없는 진술입니다.

2015 년에 새로운 응용 프로그램 을 구축하려는 경우 서버 생성 HTML 페이지가 아닌 API를 포함하는 사용자 인터페이스를 사용하여 무언가를 심각하게 살펴보십시오. 비용은 분명하지만 이점도 있습니다.

그러나 여러 가지 다른 인터페이스를 가질 구체적인 계획이없는 기존 사이트 가있는 경우 (내가 알 수있는 한) 그의 의견은 관련이 없습니다.


4

짧은 버전 : 컨트롤러가 무엇이든 API를 효과적으로 관리합니다. ASP.NET은 그것을 모호하게 할 수 있습니다.

더 긴 버전 :

맥주에 대한 정보를 제공하고 선택적으로 판매하는 기본 MVC 웹 앱에 대해 생각해보십시오. 경로는 어떻게 생겼습니까?

/sign_in
/sign_out
/beer
/beer/{beer_name}
/order
/order/{order_number}

일반적인 웹앱에는 다음과 같은 몇 가지 보조 경로가있을 수 있습니다.

/beer/new
/beer/{beer_name}/edit
/beer/{beer_name}/delete
/order/new
/order/{order_number}/edit
/order/{order_number}/delete

웹 API에서는 HTTP 메소드에서 유추되므로 필요하지 않습니다.

위의 대칭을 감안할 때 이것이 API와 컨트롤러가 너무 가까워서 동일한 것일 수도 있다는 매우 매력적인 사례라고 생각합니다.

일부 파기를 수행 한 후에 는 사용중인 ASP.NET 버전에 따라이 상태 있는 것으로 확인 되었습니다. 이전 MVC 5와 그 이전에는 두 구현을 제대로 통합 할 수있는 규칙과 인터페이스가 없었습니다. 이전 버전에서는 Web App이 View를 채우고 API는 HttpResponse를 제공합니다. 두 경우 모두 동일한 의미를 의미 적으로 생성합니다 .

MVC 6을 사용하는 경우 통합 컨트롤러 클래스에서 두 가지를 모두 얻을 수 있습니다. 이 모델에 대한 좋은 ASP 예제 코드를 찾지 못했지만 동일한 패턴의 Rails 코드를 찾았습니다. Diaspora 프로젝트의 "likes"에 대해이 컨트롤러를 고려하십시오 . 각 컨트롤러의 방법은 "수완 규칙"에 의해 정의 된 경로가 여기에 있는 API의 LCRUD에 그 금액을.

그러나 구현을 읽으면 각각 HTML, 모바일 HTML 또는 JSON에 응답 할 수 있습니다. 이는 뷰를 찾기위한 규칙과 결합하여 웹앱과 웹 API를 완전히 통합합니다. 또한 모든 메소드가 실제로 각 응답을 제공하는 것은 아닙니다 (UI에는 API가 요구하지 않는 메소드가 필요할 수 있으므로 그 반대도 마찬가지 임).

Rails는 한동안 대칭을 수용하여 매우 명확하게 만드는 반면 ASP.NET은이 모든 것을 늦게 알아 냈기 때문에 이것은 임피던스 불일치입니다.

추측:

사용중인 ASP 버전에 따라 동료가 옳고 그름 일 수 있습니다. 이전 MVC 버전에서는 API와 앱의 차이로 인해 ASP.NET의 모델에서 실제로 코드를 재사용 할 수 없었기 때문에 API를 미리 구축하는 것이 "모범 사례"가되었을 것입니다.

최신 버전에서는 통합 컨트롤러 기본 클래스에서 코드를 더 쉽게 재사용 할 수 있기 때문에 통합 코드를 사용하는 것이 더 합리적입니다.

두 경우 모두 Controller는 사실상 API입니다.


이 질문은 죽음에 대한 답변이되었지만 다른 답변이 명확하지 않다고 생각합니다. "API 작성을 피할 수 없습니다." 대답은 거의 문제가되지 않았으며, 같은 문제를 중심으로 받아 들여진 대답이 춤을 추었다. 그러나 둘 다 내가 요점을 몰아 넣는 느낌으로 ASP를 구체적으로 언급하지 않았습니다.
Jayson

더 많은 사람들에게이 말을 전하면 다른 사람들이 이것에 대해 어떻게 느끼는지 잘 알 수 있습니다.
NibblyPig

2

2006 년에 경력을 시작했을 때 이러한 유형의 아키텍처는 .NET 세계에서 가장 큰 분노였습니다. 비즈니스 로직 계층과 웹 프론트 엔드 사이에 웹 서비스를 사용하여 2000 년대 중반에 고안된 3 개의 개별 프로젝트를 수행했습니다. 물론 요즘 웹 서비스는 SOAP이지만 여전히 동일한 아키텍처입니다. 예상되는 이점은 프론트 엔드 또는 백엔드를 전환하고 심지어 데스크톱 프로그램을 개발하는 능력이었습니다. 궁극적으로 YAGNI는 사실로 판명되었습니다. 나는 이런 일이 발생하는 것을 본 적이 없다. 이번에는 프로젝트를 이런 식으로 나누는 비용 만 보았습니다. 나는 심지어 프로젝트 중 하나에서 웹 서비스를 추출하는 것을 끝내고 (다른 일을하는 동안 단계별로 제거하기 위해 반 년이 걸렸습니다) 팀 전체가 행복했습니다. 나는 그 이후로 그 접근법을 시도하지 않았으며 매우 특별한 이유가 없다면 나는하지 않을 것입니다. 이 아키텍쳐를 5 년간 사용해 본 경험이 있어도 필요하지 않다는 것을 알게되었고, 그 반대를 말해주는 전문가는 많지 않을 것입니다. 내가 필요한 프로젝트 만 그렇게 할 수 있습니다.

이제는 비즈니스 로직과 컨트롤러 / 발표자 사이의 계층을 개발하려고 노력하고 있습니다. 예를 들어 서비스 계층이 있고 쿼리를 노출하지 않으며 모든 서비스에 인터페이스를 사용하고 IoC가있는 컨트롤러에 인터페이스를 주입합니다. 내 아키텍처에 웹 서비스가 필요한 경우 합리적인 비용으로 웹 서비스를 도입 할 수 있습니다. 이 비용을 미리 지불하고 싶지 않습니다.

또한 마이크로 서비스의 아이디어를 매우 좋아하지만 마이크로 서비스는 수평 레이어가 아닌 수직 모듈을 의미한다는 것을 이해합니다. 예를 들어 페이스 북을 구축하는 경우 채팅 기능은 자체 서버 등에 별도로 배포되는 별도의 서비스가됩니다. 이것은 제가 권장하는 독립적 인 서비스 유형입니다.


2

타사에서 사용합니까? 그렇습니다 .

지금까지 사용하지 않겠습니까? 그렇습니다.
귀하는 제 3 자 로서 문서화되거나 문서화 가능 하거나 제 3 자에 의해 사용 가능한 API를 보유하여 재사용 성과 모듈성을 확실하게 제공 할 것입니다.

당신은 서두르고 있습니까? 아닙니다.
이후 리팩토링은 대부분의 방법론과 교사가 예측하고 말하는 것보다 쉽고 빠릅니다. 아무 것도없는 것보다 제대로 작동하는 것 (리팩터링 할 수 있고 리팩토링 될 수있는 나쁜 내부 설계로도)이있는 것이 더 중요합니다. (그러나 놀라운 내부 디자인, wohoo)

프론트 엔드는 이유 때문에 오늘의 빛을 보지 못했을까요? 그렇습니다 .
글쎄, 이것이 나에게 많은 일이 있었기 때문에 나는이 이유를 추가했다.
그리고 적어도 재사용 및 재배포를 위해 구성 요소가 남아 있습니다.


1

여기에 좋은 답변이 있습니다. 나는 이것을 부분 답변으로 게시합니다. 아마도 주석으로 더 좋을 것입니다. 그러나 수많은 게시물에 대해 동일한 의견을 고수하는 것은 좋지 않습니다.

YAGNI가 API를 작성하지 않은 이유라고 주장 할 수 없습니다.

API는 자연스럽고 논리적 인 테스트 엔드 포인트입니다. 따라서 0 일부터 API를 사용하는 두 가지 애플리케이션 인 UI와 테스트 스위트가 있습니다. 하나는 인간을위한 것이고 다른 하나는 기계를위한 것입니다. 그것들은 반드시 다릅니다. 프론트 엔드 동작 테스트는 백엔드 동작 테스트와는 매우 다른 작업입니다. 따라서 기술과 도구는 완전히 다릅니다. API를 사용하면 작업에 가장 적합한 도구를 사용할 수 있습니다. 또한 API로 제공되는 분리 기능을 통해 프론트 엔드 테스터는 백엔드 기능을 테스트 할 필요가 없습니다.

이 API는 또한 프론트 엔드 코더를 백엔드 코더의 우려로부터 보호하고 그 반대도 마찬가지입니다. 이것들은 우리 회사에서 매우 다른 기술입니다. API를 사용하면 우리가 가장 강한 곳에 집중할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.