Node.js based API System Architecture

Cein1·2022년 9월 26일
0

Node.js

목록 보기
1/2

1. Backend Developer

1-1) Backend System 개발

(앞단) API 개발
(뒷단) 데이터 수집, 분석, 관리 등의 데이터 관련 시스템 개발

1-2) 서버구축 및 운영

DevOps (Development + Operation)
시스템 운영 외에도 빌드, 테스트, 배포 등. 하나의 서비스의 F.개발 T.배포까지의 과정을 자동화하여 전체적인 개발사이클을 더 빨리, 효율적으로 진행할 수 있는 개발환경을 구축하는 역할도 담당합니다.

배경
AWS 등의 클라우드 서비스의 발달
--> System Infrastructure 구축과 관리를 위해 실제 서버 하드웨어를 직접 다루지 않아도 됨
--> 개발자들이 직접 System Infrastructure를 구현하게 됨

2. Let's Build Instagram System

인스타그램(Instagram) 웹 API 시스템을 개발해서 서비스를 운영한다고 가정합시다

3. Developement of Simple API and Datavase

우리가 인스타그램 서비스를 처음 만드는 초기 개발팀이라고 합시다. 초기 서비스 제품을 만들 때는 서비스를 이용하는 사용자가 많을지 적을지 판단할 수 없는 단계입니다. 물론 이미 서비스를 기획하는 시점에서 사용자 연령대와 사용량 등을 예측할 수 있는 있겠지만 어디까지나 예측입니다.

클라이언트의 HTTP 요청을 처리할 수 있는 한 대의 서버(MacOS) 위에
Node.js 기반의 API 애플리케이션과 MySQL 기반의 데이터베이스 애플리케이션이 구축되어 있는 구조 입니다.

3-1) Node.js based Simple HTTP API

엔드포인트(End-point)
API에서 서버자원(resource)에 접근할 수 있도록 하는 URI(Uniform Resource Identifier, )입니다. (URI는 네트워크상 자원을 가리키는 일종의 고유식별자(ID)를 말합니다)

  1. 회원가입 엔드포인트
  2. 로그인 엔드포인트
  3. 게시물 엔드포인트
  4. 댓글 엔드포인트
  5. 좋아요 엔드포인트

3-2) RDBMS(Relational Database Management System)

MySQL

  • 관계형 데이터베이스의 이해
  • 데이터베이스(스키마) 설계 및 구축
  • 기본적인 SQL(Structured Query Language) 활용

3-3) HTTP

프론트엔드 시스템과 백엔드 API 시스템은 일반적으로 HTTP라는 통신 프로토콜을 기반으로 통신합니다. Node.js 기반으로 만들어 나갈 API 시스템과 DB 시스템 역시 HTTP를 기반으로 통신합니다.

  • HTTP 핵심 요소
  • HTTP 구조
  • 자주 사용되는 HTTP 메소드와 Status Code

3-4) Linux & Terminal

Linux의 핵심에 대해 학습합니다

  • Linux Directory Structure
  • PATH
  • Configs
  • Shell Commands

대부분의 백엔드 시스템이 리눅스 기반의 OS에서 운영됩니다. 리눅스 서버에 접속해서 작업을 할 때 텍스트 터미널을 통해서 작업을 하는 경우가 대부분입니다. 예를 들어, 백엔드 시스템에 오류가 났을 때 서버에 접속해 로그를 보면서 오류를 해결해야 하는 경우 모든 작업이 터미널 상에서 이루어지므로 명령어 인터페이스(CLI)와 터미널 환경에 익숙해져야 합니다.

4. Better RESTful API System

4-1) Node.js & Express.js & TypeORM based API

Express.js
많은 HTTP 유틸리티 메서드와 미들웨어를 제공합니다.

TypeORM 라이브러리
API에 DB시스템을 연결하고, 데이터를 읽고 쓰는 요청을 보내는 CRUD 엔드포인트를 구현합니다. 이때, SQL 심화내용을 통해 복잡한 데이터 작업을 할 수 있는 역량을 기릅니다.

Error handling, Pagination, Sorting, Filtering, middleware 등 현업에서 실제로 자주 요구되는 기능들을 학습하고 구현합니다.

4-2) Layered Pattern

백엔드 API의 전체구조. 즉, 코드의 Architecture에 대해서 학습합니다.
이 과정에서 왜 코드의 아키텍처가 중요한지 그리고 널리 사용되는 아키텍처 패턴에 대해서 알아봅니다.

  • API 아키텍처
  • 레이어드 패턴(Layered pattern)

API 코드를 더 체계적이고 효율적인 구조로 만드는 실습을 통해 확장성 있는 코드구조를 가진 API가 되도록 만들어봅시다.

4-3) RESTful API

API의 엔드포인트 구조를 구현하는 방식 중에 가장 널리 사용되는 RESTful HTTP API 엔드포인트 아키텍처 패턴을 학습합니다.

RESTful API
API에 전송하는 자원(resource)를 URI로 표현하고 해당 리소스에 행하고자 하는 의도를 HTTP 메소드로 정의하는 방식입니다

4-4) 인증(Authentication) - 인가(Authorization)

인증
사용자의 신원을 확인하는 절차로 일반적으로 웹사이트에서 사용자가 로그인을 하여 ID와 PW를 확인하는 절차를 이야기합니다.

인가
사용자에게 특정 리소스 또는 기능에 대한 액세스 권한을 부여하는 프로세스이며, 종종 액세스 제어 또는 클라이언트 권한과 같은 의미로 사용됩니다.

로그인 기능을 담당하는 인증 엔드포인트를 구현합니다.
특히 사용자의 PW 암호화에 대해서 자세하게 알아보도록 합니다. bcrypt 암호 알고리즘, Json Web Token에 대한 개념을 학습합니다.

4-5) API Documentation

API 문서화
백엔드가 작성한 각각의 API 기능을 문제없이 사용하기 위해서, 개발자간 어떠한 요소를 주고 받아야 하는지 일목요연하게 정리하는 작업입니다. API 문서화 기능을 제공해주는 Postman 툴을 사용하여 API 문서화 작업을 진행합니다.

5. Advanced API System and Deployment

지금까지는 로컬 환경에서의 개발을 말했습니다. 로컬 환경에서의 개발은 어디까지나 기능 구현과 테스트가 목적입니다. 실제로 개발한 API 시스템을 사용자들이 사용할 수 있게 만들기 위해서는 24시간 전원이 꺼지지 않고 안정성이 보장된 환경에서 실행될 수 있어야 합니다.

지금부터는 실무에 가까운 형태의 API를 개발하고, Amazon Web Service라는 Cloud Provider를 활용해서 자체 보안 향상을 고려한 네트워크 설계와 서버를 구축해 서비스를 배포하게 됩니다. 애플리케이션 배포 뿐만 아니라 API 시스템에 테스트 전략(Unit Test)과 컨테이너 가상화 기술(Docker)을 접목시켜 더욱 안정적인 시스템을 구축합니다.

5-1) Advanced API Development

  • Node.js/ Express.js/ TypeORM 기반의 실무에 적합한 API 구조를 디자인하고 서버 세팅하는 방법을 학습합니다
  • 다양한 서비스 경험을 통해서 실무 수준의 RESTful API를 구현합니다
  • 코드 전반적으로 programming best practices 적용합니다
  • 적절한 자료구조와 알고리즘을 적용하여 최적화된 코드를 작성합니다

5-2) Unit Test

개발한 API 시스템이 정상적으로 작동하는지 확인하는 과정인 소프트웨어 테스트 전략에 대해서 알아봅니다. 다양한 테스트 전략 및 방법에 대해서 알아보고, 그 중에서도 가장 중요한 단위 테스트라고 하는 Unit Test에 대해서 자세히 학습합니다.

시스템 테스트 전략 3가지는 다음과 같습니다.

  • UI test / End-To-End test
  • Integration test
  • Unit Test

Javascript 테스트 프레임워크인 Jest를 사용하여 개발한 API 시스템을 테스트할 수 있는 테스트 코드를 작성합니다. 이 과정을 통해서 테스트의 중요성에 대한 마인드 셋을 갖게 됩니다.

5-3) Docker

컨테이너 가상화(Container Virtualization) 기술입니다. Docker는 가상화 컨테이너에 application (ex. Node.js based application) 배포를 자동화 시켜주는 오픈소스 엔진입니다.

Docker는 container 가상화 실행 환경 위에 application 배포 엔진을 더함으로서 사용자의 코드를 어디서든 빠르고 가볍게 실행시킬 수 있는 기술을 제공합니다

개발한 API를 도커를 활용해서 이미지를 만드는 방법과 실행하는 방법에 대해서 학습합니다.

5-4) Deploy to Amazon Web Services (AWS)

AWS
아마존에서 제공하는 클라우드 서비스로, 시스템 배포 및 운영을 하기위해 필요한 Server, DB, Network 등의 물리적 장치를 설치 걱정하지 않고 클라우드 서비스 제공자의 사이트 혹은 I/F를 통해서 쉽게 설정하고 사용할 수 있도록 해주는 서비스입니다.

AWS를 기반으로 API를 배포 및 운영하기 위한 Infrastructure를 직접 디자인하고 배포하는 방법을 학습합니다.

AWS에서 핵심 서비스인 IAM, EC2(Elastic Compute Cloud), RDS(Relational Database Service), S3(Simple Storage Service), VPC(Virtual Private Cloud)에 대해서 학습합니다.

실제로 API 코드를 Github에 올리고, RDS 서비스의 MySQL을 DB로 사용하여 EC2 서버에 API를 배포하는 실습을 진행합니다.

6. System is Getting Bigger

사용자가 증감함에 따라서 더 이상 하나의 서버만으로는 트래픽을 감당할 수 없게 되는 시점이 찾아옵니다. 이렇게 증가하는 트래픽을 감당하기 위해서는 두 가지 전략을 선택할 수 있습니다. 스케일 업(Scale up)과 스케일 아웃(Scale out)입니다. 대부분 서버 한 대의 성능을 높이는 방법(Scale up)보다 더 많은 서버를 운영하는 Scale out 방식을 사용합니다. 이때, 늘어난 서버에 트래픽(http request)을 핸들링해 줄 수 있는 Load Balancer에 대해서 학습합니다.

시스템이 커지면서 트래픽 뿐만 아니라 개발 및 배포 과정에도 많은 어려움이 생기게 됩니다. 예를 들어 배포해야 하는 서버 수가 증가함에 따라 사람이 매뉴얼하게 배포하기에는 많은 공수가 들고 실수도 있을 수 있습니다. Github Actions 같은 CICD 시스템을 사용하여 테스트와 배포의 많은 부분을 자동화할 수 있습니다.

다음은 트래픽 증가와 시스템이 커지면서 필요한 Infrastructure Architecture 입니다.

6-1) Load Balancing - More People Start Using It!

사용자가 증가함에 따라 더 이상 서버 한 개만으로는 트래픽을 감당할 수 없게 되고, 증가하는 트래픽을 감당하기 위해서 더 많은 서버를 운영해야 하는 상황을 고려합니다.

사용자 요청을 처리해야 하는 API 서버의 수를 늘리고, 백엔드 서버들에 전송되는 HTTP나 다른 종류의 네트워크 트래픽을 균등하게 분배해주는 역할을 할 수 있는 Load balancer를 연결해주면서 더 많은 트래픽을 처리할 수 있는 시스템으로 발전할 수 있습니다.

AWS에서 제공하는 ALB나 ELB를 사용하여 쉽게 구현할 수 있지만, Nginix라는 Proxy 서버를 직접 구현하여 Load Balancing의 개념 및 부하 분산 알고리즘을 학습하고 실제로 구현합니다.

6-2) CI/CD (Continuous Integration / Continuous Deployment)

Continuous Integration
개발자가 커밋과 푸쉬를 한 후, 빌드부터 테스트 그리고 develop 브랜치로 merge되는 과정을 자동화하여 개발자가 코드를 커밋하고 푸쉬하는 만큼 지체없이 바로 테스트와 merge가 (하루에도 여러번) 지속적으로 이루어질 수 있도록 하는 것을 말합니다.

Continuous Deployment
CI 다음 과정들을 자동화하여, 개발자가 개발을 끝내고 커밋 및 푸쉬를 하면 그대로 모든 테스트를 자동으로 거치고 바로 production 배포까지 완료되는 것을 이야기합니다

0개의 댓글