댓글 검색 목록

[html] Good Bye 웹 API

페이지 정보

작성자 운영자 작성일 20-12-07 11:30 조회 732 댓글 0

단일 페이지 애플리케이션 또는 모바일 애플리케이션을 빌드 할 때 일반적으로 프런트 엔드와 백엔드를 연결하기 위해 웹 API (REST, GraphQL 등)를 구현해야 합니다. 기술적으로는 그리 어렵지 않지만 불행한 결과가 있습니다.


두 개의 행성을 상상해보십시오. "frontend"행성은 JavaScript를 사용하고 "backend"행성은 JavaScript 또는 기타 고급 언어를 사용합니다.


이제 이 행성들이 "응용 프로그램"이라는 전체를 형성하기 위해 광범위하게 협력해야 한다고 가정 해 보겠습니다.


안타깝게도 행성은 모국어를 사용하여 서로 직접 통신 할 수 없으며 훨씬 덜 정교한 언어를 사용하는 "웹 API"라는 타사에 의존해야 합니다.


실제로 대부분의 웹 API의 언어는 URL, 몇 가지 HTTP 동사 (GET, POST, DELETE 등) 및 일부 JSON의 조합으로 제한됩니다.


Frontend + Web API + Backend 


GraphQL을 사용하는 웹 API는 더 발전되었지만 JavaScript와 같은 프로그래밍 언어의 가능성보다 훨씬 뒤떨어져 있습니다.


  • 프로그래밍 패러다임은 절차적이거나 기능적입니다 (객체 지향 프로그래밍 없음).
  • 가장 기본적인 유형 만 지원됩니다 (Date,Map, Set 등은 잊어 버림).
  • 참조 개념이 누락되었습니다 (값으로 만 개체를 ​​전달할 수 있음).

프론트 엔드와 백엔드 사이에 기초적인 언어를 배치하면 많은 상용구가 추가되고 개발 경험이 망가집니다.


또 다른 문제는 웹 API가 걱정할 추가 레이어라는 것입니다. 그것은 설계, 구현, 테스트, 문서화 등을 거쳐야 합니다. 그리고 이 모든 것은 솔직히 엉덩이에 고통입니다.


그러나 가장 나쁜 것은 웹 API를 구축하면 일반적으로 코드베이스의 품질이 저하된다는 것입니다. 실제로 프런트 엔드와 백엔드가 웹 API로 분리되어있을 때 코드를 건조하고 일관성 있게 유지하는 것은 매우 어렵습니다.


이제 웹 API를 제거 할 수 있다고 상상해보십시오. 프런트 엔드가 모국어를 사용하여 백엔드와 직접 통신 할 수 있다고 상상해보십시오. 대단하지 않을까요?

Frontend + Backend 


좋은 소식은 Layr라는 라이브러리 세트 덕분에 오늘날 가능하다는 것입니다.


https://dev.to/mvila/good-bye-web-apis-2bel


안녕, 레이어! 


Layr를 사용하면 프런트 엔드와 백엔드가 물리적으로 분리되어 있지만 (다른 환경에서 실행 됨) 논리적으로 재결합됩니다 (동일한 환경에 있는 것처럼).


어떻게 작동합니까?


  1. 백엔드는 속성 및 메서드 중 일부가 프런트 엔드에 명시적으로 노출 된 하나 이상의 클래스로 구성됩니다.
  2. 프런트 엔드는 백엔드 클래스에 대한 일부 프록시를 생성하고 이러한 프록시를 일반 JavaScript 클래스인 것처럼 사용할 수 있습니다.

내부적으로 Layr는 RPC 메커니즘에 의존합니다. 따라서 표면적으로는 CORBA, Java RMI 또는 .NET CWF와 같은 것으로 볼 수 있습니다.


그러나 Layr는 근본적으로 다릅니다.


  • 분산 개체 시스템이 아닙니다. Layr 백엔드는 상태 비 저장이므로 스택 전체에 공유 객체가 없습니다.
  • 상용구 코드, 생성 된 코드, 구성 파일 또는 아티팩트는 포함되지 않습니다.
  • 간단하지만 강력한 직렬화 프로토콜 (Deepr)을 사용하여 체인 호출, 자동 일괄 처리 또는 부분 실행과 같은 고유 한 기능을 사용할 수 있습니다.

Layr는 JavaScript / TypeScript로 여정을 시작하지만, 해결하는 문제는 보편적이며 모든 객체 지향 언어로 이식 될 수 있습니다.


 

Layer를 사용하여 전체 스택 애플리케이션을 빌드 하는 것이 어떻게 보이는지 확인하기 위해 고전적인 "Counter"예제를 구현해 보겠습니다.


먼저 백엔드에서 "데이터 모델"과 "비즈니스 로직"을 구현합니다.


// backend.js

import {
  Component,
  primaryIdentifier,
  attribute,
  method,
  expose
} from '@layr/component';
import {ComponentHTTPServer} from '@layr/component-http-server';

class Counter extends Component {
  // We need a primary identifier so a Counter instance
  // can be transported between the frontend and the backend
  // while keeping it's identity
  @expose({get: true, set: true}) @primaryIdentifier() id;

  // The counter value is exposed to the frontend
  @expose({get: true, set: true}) @attribute() value = 0;

  // And the "business logic" is exposed as well
  @expose({call: true}) @method() increment() {
    this.value++;
  }
}

// Lastly, we serve the Counter class through an HTTP server
const server = new ComponentHTTPServer(Counter, {port: 3210});
server.start();


어머! 간단한 "카운터"예제를 위한 모든 코드? 물론 과도하게 보이지만 실제로는 데이터 모델, 일부 비즈니스 로직 및 모든 것을 노출하는 HTTP 서버로 풀 그레이드 백엔드를 구현했습니다.


이제 백엔드가 있으므로 프런트 엔드에서 사용할 수 있습니다.


// frontend.js

import {ComponentHTTPClient} from '@layr/component-http-client';

(async () => {
  // We create a client to connect to the backend server
  const client = new ComponentHTTPClient('http://localhost:3210');

  // We get a proxy to the Counter backend class
  const Counter = await client.getComponent();

  // Lastly, we consume the Counter
  const counter = new Counter();
  console.log(counter.value); // => 0
  await counter.increment();
  console.log(counter.value); // => 1
  await counter.increment();
  console.log(counter.value); // => 2
})();


여기서 무슨 일이 일어나고 있습니까? counter.increment() 메서드를 호출하면 카운터 값이 증가합니다. 이 메서드는 프런트 엔드에 존재하지 않습니다. 백엔드에서 구현되므로 이 환경에서 실행됩니다. 그러나 프런트 엔드의 관점에서 실제 실행 환경은 중요하지 않습니다. 메소드가 원격으로 실행된다는 사실은 구현 세부 사항으로 볼 수 있습니다.


프런트 엔드의 Counter 클래스를 확장하여 프런트 엔드와 관련된 기능을 구현할 수 있습니다. 다음은 카운터가 특정 값에 도달 할 때 메시지를 표시하도록 increment() 메서드를 재정의 하는 방법의 예입니다.


class ExtendedCounter extends Counter {
  async increment() {
    // We call the `increment()` method in the backend
    await super.increment();

    // We execute some additional code in the frontend
    if (this.value === 3)
      console.log('The counter value is 3');
    }
  }
}



이것이 프론트 엔드와 백엔드가 재결합했을 때의 모습입니다. 꽤 멋지지 않나요?


캐치는 무엇입니까? 


웹 API 없이도 모든 사람이 웹 API를 구축하는 이유는 무엇입니까?


웹 API를 구현해야 하는 한 가지 좋은 이유는 REST와 같은 확립 된 프로토콜을 통해 일부 외부 개발자에게 백엔드를 노출하려는 경우입니다. 하지만 솔직히 말해서 대부분의 응용 프로그램에는 이러한 요구 사항이 없습니다. 웹 API가 필요한 것으로 판명되면 모든 내부 요구에 대해 "API 없는"접근 방식을 계속 사용하면서 나중에 추가 할 수 있습니다.


또 다른 이유는 수백만 명의 사용자가 있는 대규모 애플리케이션에서 작업하는 경우입니다. 실제로 Layr가 제공하는 편리함은 비용 없이 제공되지 않으므로 가능한 가장 최적화 된 응용 프로그램을 원한다면 하위 수준의 솔루션을 사용하는 것이 좋습니다.


마지막으로 JavaScript 이외의 언어로 프런트 엔드 또는 백엔드를 구현하려는 경우 스택의 한쪽에서 Layr를 계속 사용할 수 있지만 그런 다음 Deepr 프로토콜을 말할 수 있는 API 클라이언트 또는 서버를 구현해야 합니다. 스택의 다른 쪽.


결론 


웹 API를 제거하면 코드베이스의 품질을 높이면서 풀 스택 애플리케이션을 훨씬 빠르게 빌드 할 수 있습니다.


일부 프로덕션 프로젝트를 포함하여 여러 프로젝트에 Layr를 사용하여 코드 양을 평균 50 % 줄이고 생산성을 크게 높일 수 있었습니다.


또 다른 중요한 측면은 개발 경험입니다. 프론트 엔드와 백엔드가 더 이상 웹 API로 분리되지 않기 때문에 독립형 애플리케이션을 개발하는 것과 비슷한 느낌을 받고 훨씬 더 재미 있습니다.



댓글목록 0

등록된 댓글이 없습니다.

웹학교 로고

온라인 코딩학교

코리아뉴스 2001 - , All right reserved.