express, aws,

Authentication, deployment of AWS EC2 and RDS, ERD, and performance testing

Dahna Dahna Follow Dec 05, 2024 · 23 mins read
Authentication, deployment of AWS EC2 and RDS, ERD, and performance testing
Share this

Authentication, deployment of AWS EC2 and RDS, ERD, and performance testing

import express from "express";  
import jwt from "jsonwebtoken";  
  
const app = express();  
app.use(express.json()); // for parsing application/json  
app.use(express.urlencoded({ extended: true })); // for parsing application/x-www-form-urlencoded  
  
const port = 3000;  
  
const users = [{ user: "user-1", password: "password-1", name: "name-1" }];  
const db = [{ title: "title-1", contents: "contents-1" }];  
  
function authorization(req, res, next) {  
  const auth = req.headers.authorization;  
  // Basic #####  
  if (!auth) res.sendStatus(401);  
  const auth2 = auth.split(" ");  
  if (!auth2) res.sendStatus(401);  
  if (auth2.length !== 2) res.sendStatus(401);  
  const value = auth2[1];  
  // Base64 Decoding  
  base64DecodedText = Buffer.from(value, "base64").toString("utf8");  
  console.log("Base64 Decoded Text : ", base64DecodedText);  
  const arr = base64DecodedText.split(":");  
  const id = arr[0];  
  const pw = arr[1];  
  const user = users[0];  
  if (id !== user.user) res.sendStatus(401);  
  if (pw !== user.password) res.sendStatus(401);  
  next();  
}  
  
function authorizationJWT(req, res, next) {  
  const auth = req.headers.authorization;  
  // Bearer ####  
  if (!auth) res.sendStatus(401);  
  const auth2 = auth.split(" ");  
  if (!auth2) res.sendStatus(401);  
  if (auth2.length !== 2) res.sendStatus(401);  
  const value = auth2[1];  
  const decoded = jwt.verify(value, "secret");  
  const user = users[0];  
  if (decoded.id !== user.user) res.sendStatus(401);  
  if (decoded.name !== user.name) res.sendStatus(401);  
  next();  
}  
  
app.get("/", (req, res) => {  
  res.send("Hello World!");  
});  
  
app.post("/token", (req, res) => {  
  const { id, pw } = req.body;  
  const user = users[0];  
  if (id !== user.user) res.sendStatus(401);  
  if (pw !== user.password) res.sendStatus(401);  
  const token = jwt.sign({ id: id, name: user.name }, "secret", {  
    expiresIn: 3600,  
  });  
  res.send({ token });  
});  
  
app.get("/notes", authorizationJWT, (req, res) => {  
  const data = db[0];  
  res.send(data);  
});  
  
app.listen(port, () => {  
  console.log(`Example app listening on port ${port}`);  
});  
  

1. Basic Authentication의 개념

  • Basic Authentication은 HTTP 표준 인증 방식 중 하나로, 클라이언트가 서버에 요청을 보낼 때, Authorization 헤더에 사용자 이름과 비밀번호를 Base64로 인코딩하여 전달합니다.
  • 일반적인 헤더 구조:
    Authorization: Basic <Base64(username:password)>  
    

    예: Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=

2. 언제 사용되는가?

  • 테스트용:
    • 간단한 API 인증 테스트를 할 때 사용됩니다.
    • 개발 중 API 호출을 Postman이나 cURL로 테스트할 때 유용합니다.
  • 초기 개발 환경:
    • 앱 초기 개발 중 인증 메커니즘을 단순화하기 위해 임시로 사용할 수 있습니다.
  • 내부 서비스 통신:
    • 신뢰할 수 있는 네트워크 환경에서 간단한 인증이 필요한 내부 서비스 간의 통신에 사용될 수 있습니다.

3. Express 앱에서 Basic Authentication의 사용 사례

Express로 만든 앱에서 Basic Authentication은 다음과 같은 상황에서 사용할 수 있습니다:

3.1. 간단한 인증 구현

  • 로그인 기능을 구현하지 않고, 간단히 특정 엔드포인트를 보호하고 싶을 때 유용합니다.
  • 예를 들어, 관리자만 접근 가능한 API를 Basic Authentication으로 보호.

3.2. 구현 방법

const express = require('express');  
const app = express();  
  
// Middleware for Basic Authentication  
function basicAuth(req, res, next) {  
    const authHeader = req.headers['authorization'];  
    if (!authHeader || !authHeader.startsWith('Basic ')) {  
        return res.status(401).send('Unauthorized');  
    }  
  
    // Decode base64 username:password  
    const base64Credentials = authHeader.split(' ')[1];  
    const credentials = Buffer.from(base64Credentials, 'base64').toString('ascii');  
    const [username, password] = credentials.split(':');  
  
    // Validate username and password  
    if (username === 'admin' && password === 'password123') {  
        next(); // Proceed to the next middleware or route handler  
    } else {  
        res.status(401).send('Unauthorized');  
    }  
}  
  
// Protect a route with Basic Authentication  
app.get('/protected', basicAuth, (req, res) => {  
    res.send('This is a protected route');  
});  
  
app.listen(3000, () => console.log('Server running on http://localhost:3000'));  

3.3. 테스트

위 예제를 실행한 후, 다음과 같이 요청을 보내면 작동합니다:

curl -u admin:password123 http://localhost:3000/protected  

4. 실사용 가능성

4.1. 적합한 경우

  • 내부 앱: 네트워크 보안이 철저히 유지되는 내부 네트워크에서 간단히 보호하고자 할 때.
  • API 테스트 및 디버깅: Postman, cURL 등으로 인증 테스트 시.

4.2. 부적합한 경우

  • 공개 서비스: 사용자 비밀번호가 평문으로 노출될 수 있으므로 보안에 취약.
  • 민감한 데이터: HTTPS 없이 전송 시, Basic Authentication은 보안 문제가 생길 수 있음.
  • 대규모 서비스: 대규모 사용자 인증이 필요하면 OAuth, JWT, Session 등의 더 안전하고 확장 가능한 방식을 사용.

결론

Express 앱에서 Basic Authentication Header Generator는 테스트나 내부 서비스에서 유용할 수 있지만, 실제 공개 사이트에서 사용하기에는 보안상 제한이 많습니다. 대신 HTTPS와 JWT 같은 더 안전한 인증 메커니즘을 고려하는 것이 좋습니다.

⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️

AWS EC2 + RDS 배포

  1. VPC 생성
  2. EC2 생성
    • 리전 확인
    • Launch instance -> 이름 작성, ubuntu, 버전 선택 -> Instance type 선택 -> Key pair 선택 or 생성 -> subnet 선택은 public으로 해야 사람들이 접근 가능 ->
      Auto-assign public IP Enable로 설정
  3. RDS 설정
    • 데이터베이스 생성
    • Connectivity에서 Connect to an EC2 compute resource선택
    • Database options 작성(initial database name 등.. 꼭 여기서 안해줘도 됨 EC2들어가서 할 수 있음)
  4. EC2 + RDS 연결
    • EC2에서 Connect
    • apt update
    • 데이터베이스 설치(MySQL의 경우) sudo apt install mysql-server
    • sudo apt-get install curl
    • 노드 관련 설치 curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash (https://nodejs.org/en/download/package-manager 에서 다시 확인해볼 것)
    • ~/.nvm/nvm.sh 쉘에서 실행되어 nvm을 사용할 수 있도록 설정
    • nvm install 16 (16자리에 버전 숫자 넣기)
    • node -e "console.log('Running Node.js ' + process.version)" 설치가 잘 됐는지 확인
    • mysql -h {rds-endpoint 가져와서 넣기} -P 3306 -u {rds에서 작성한 이름} -p
    • 패스워드 입력
    • show databases 데이터베이스가 생성 됐는지 확인
  5. AWS EC2 Express MySQL 설정
    • npm init -y
    • npm install express
    • npm install mysql2
    • touch index.js
    • vi index.js
    • i(편집) -> 기존의 index파일 내용 붙여넣기 -> :wq
    • touch database.js
    • vi database.js
    • i(편집) -> 기존의 database파일 내용 붙여넣기 -> :wq
    • vi package.json
    • “type” : “module”, 추가
  6. AWS EC2 네트워크 설정 및 테스트
    • node index.js : 실행
    • EC2에 Security Groups를 설정해줘야 함 -> Edit inbound rules -> Custom TCP, 포트번호, Anywhere
  7. pm2 설치로 계속 돌아가는 서버 만들기
    1
    • npm install pm2@latest -g : 설치
    • pm2 start index.js : 앱 실행
    • pm2 stop (id) : 실행 정지
    • pm2 delete (id) : 삭제

AWS EC2 Nginx 대응

Nginx는 Reverse Proxy 역할을 하며, SSL/TLS 인증서를 적용하여 HTTPs를 제공할 수 있다. 이 방법은 로드 밸런서를 사용하지 않고도 HTTPs를 구현할 수 있어 간단한 애플리케이션 배포에 적합함

  1. Nginx 설치
    • sudo apt update sudo apt install nginx -y
    • cd /etc/nginx
    • cd sites-available
    • sudo rm default
    • sudo touch default
    • sudo vi default
    • 내용은 섹션21 Nginx환경변수 설정 영상 참고..ㅎ HTTPs아님. 따로 찾아서 해봐야 함

⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️

ERD(Entity-Relationship Diagram)

ERD(Entity-Relationship Diagram)는 데이터베이스 설계에서 엔터티(Entity), 관계(Relationship), 속성(Attribute) 등을 시각적으로 표현하여 데이터 구조를 명확히 이해하고 설계하는 데 사용되는 다이어그램입니다. 데이터베이스 시스템의 논리적 구조를 시각화하는 데 매우 유용합니다.


1. Entity (엔터티)

정의:

  • 데이터베이스에서 관리해야 하는 객체 또는 개념을 나타냅니다.
  • 엔터티는 데이터로 표현될 수 있는 실체(사람, 사물, 개념 등)를 의미합니다.

특징:

  • 독립적인 실체로 존재할 수 있음.
  • 하나 이상의 속성을 가짐.

예시:

  • 학생(Student): 학생 ID, 이름, 학년 등의 속성을 가질 수 있음.
  • 강의(Course): 강의 ID, 강의명, 학점 등의 속성을 가질 수 있음.

표기법:

엔터티는 사각형으로 표현하며, 엔터티 이름은 대문자로 작성하는 것이 일반적입니다.


2. Relationship (관계)

정의:

  • 두 개 이상의 엔터티 간의 연결이나 연관성을 나타냅니다.
  • 엔터티 간의 상호작용 또는 종속성을 표현합니다.

특징:

  • 관계에도 속성을 가질 수 있음(예: 주문 날짜).
  • 관계는 방향성을 가질 수 있음.

예시:

  • 학생(Student)강의(Course) 사이의 “수강” 관계.
  • 고객(Customer)주문(Order) 사이의 “구매” 관계.

표기법:

  • 관계는 마름모로 표현하며, 관계 이름을 마름모 안에 작성합니다.

3. Cardinality (카디널리티)

정의:

  • 두 엔터티 간의 관계에서 어느 정도의 수로 연관되어 있는지를 나타냅니다.
  • 관계의 수량이나 제약 조건을 정의합니다.

종류:

  1. 1:1 (One-to-One):
    • 하나의 엔터티가 다른 엔터티와 하나만 연관될 때.
    • 예: 사람(Person) ↔ 여권(Passport).
  2. 1:N (One-to-Many):
    • 하나의 엔터티가 다른 엔터티와 여러 개 연관될 때.
    • 예: 회사(Company) ↔ 직원(Employee).
  3. N:M (Many-to-Many):
    • 여러 엔터티가 다른 여러 엔터티와 연관될 때.
    • 예: 학생(Student) ↔ 강의(Course).

표기법:

  • 표기 방식에 따라 숫자기호를 사용합니다.
    • 1, N, M으로 표시.
    • 관계선 위에 기호로 표기 (예: “1”과 “N”으로 표시).
    • Crows Foot Notation: 화살표나 갈라진 선을 사용.

ERD의 구성 요소 요약

구성 요소 설명 표기법
Entity 관리 대상 객체 (예: 학생, 강의, 고객) 사각형
Attribute 엔터티 또는 관계의 속성 (예: 이름, 학번, 주문 날짜) 타원형
Relationship 엔터티 간의 연결 또는 연관성 (예: 수강, 구매) 마름모
Cardinality 관계에서 엔터티 간의 수량 제약 (1:1, 1:N, N:M) 숫자나 기호로 표시

ERD의 예제

예제: 학생과 강의 간의 관계

  1. 엔터티:
    • 학생(Student): 학번, 이름, 학년.
    • 강의(Course): 강의 ID, 강의명, 학점.
  2. 관계:
    • 학생 ↔ 강의: “수강(Enroll)” 관계.
  3. 카디널리티:
    • 학생 ↔ 강의: N:M 관계 (한 학생이 여러 강의를 수강, 한 강의에 여러 학생이 수강).

ERD는 데이터베이스 설계의 필수 도구로, 시스템의 구조를 시각적으로 명확히 이해하고, 팀 간 소통을 원활히 하는 데 매우 유용합니다.

⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️

성능테스트

Redis란?

  • 데이터 저장소: 데이터를 메모리에 저장하여 디스크 기반 데이터베이스보다 훨씬 빠른 속도를 제공합니다.
  • Key-Value 스토어: 데이터를 키-값(key-value) 형태로 저장하며, 다양한 데이터 구조를 지원합니다.
  • 오픈 소스: BSD 라이선스를 기반으로 무료로 제공됩니다.
  • 고성능: 초당 수십만 개 이상의 요청을 처리할 수 있어 성능 테스트 및 실시간 애플리케이션에서 활용도가 높습니다.

Redis의 특징

  1. 인메모리(In-Memory) 데이터베이스:
    • 모든 데이터를 메모리에 저장하여 읽기 및 쓰기 속도가 매우 빠릅니다.
    • 디스크를 사용하는 데이터베이스보다 훨씬 낮은 지연 시간을 제공합니다.
  2. 다양한 데이터 구조 지원:
    • 단순한 문자열뿐만 아니라 리스트(List), 셋(Set), 해시(Hash), 정렬된 셋(Sorted Set), 비트맵(Bitmaps), 하이퍼로그로그(HyperLogLog) 등을 지원합니다.
    • 다양한 데이터를 효율적으로 관리할 수 있습니다.
  3. 캐싱 용도:
    • 자주 조회되는 데이터를 캐시에 저장해, 데이터베이스 접근을 줄이고 응답 속도를 높입니다.
    • TTL(Time-To-Live) 설정으로 자동 만료를 지원.
  4. 지속성(Persistence):
    • 데이터를 메모리에 저장하지만, 특정 시점에 데이터를 디스크에 저장하는 옵션을 제공합니다.
    • RDB (Redis Database) 스냅샷 방식과 AOF (Append-Only File) 로그 방식을 지원.
  5. 분산 환경 지원:
    • Redis 클러스터를 통해 데이터를 샤딩(Sharding)하여 분산 저장이 가능합니다.
    • 고가용성을 위해 Redis Sentinel로 장애 조치(Failover)를 제공합니다.

Redis와 성능 테스트의 연관성

  1. 성능 테스트의 캐시 활용:
    • Redis는 캐싱 시스템으로 자주 사용되며, 데이터베이스의 병목현상을 줄이는 데 도움이 됩니다.
    • 성능 테스트에서 Redis를 사용하면 애플리케이션의 처리량(Throughput)과 응답 시간(Latency)을 분석할 수 있습니다.
  2. 세션 관리:
    • 성능 테스트 시 많은 사용자가 로그인/로그아웃을 반복하면 세션 관리가 중요한 요소로 작용합니다.
    • Redis는 세션 데이터를 빠르게 읽고 쓰는 데 적합하며, TTL을 설정해 세션을 자동으로 만료시킬 수 있습니다.
  3. 큐 처리:
    • Redis는 Pub/SubList 구조를 활용해 작업 큐를 구성할 수 있습니다.
    • 성능 테스트에서 작업 대기열(Queue)을 처리하고, 각 요청이 적시에 완료되는지 확인할 수 있습니다.
  4. 부하 분산:
    • Redis 클러스터를 사용해 데이터를 분산 처리하여 부하를 줄이고, 테스트 환경에서 확장 가능성을 확인할 수 있습니다.
  5. 데이터 통계와 모니터링:
    • 성능 테스트 중 Redis를 사용해 메트릭(예: 요청 수, 오류 비율, 처리 속도)을 저장하고 실시간 분석을 수행할 수 있습니다.

Redis의 장점

  • 빠른 속도: 메모리 기반 저장소로 데이터 읽기 및 쓰기 속도가 빠름.
  • 확장성: 클러스터와 샤딩을 통해 시스템 확장이 가능.
  • 유연성: 다양한 데이터 구조 지원으로 여러 용도에 적합.
  • 안정성: Sentinel 및 클러스터로 장애 복구 지원.

Redis가 성능 테스트에서 사용되는 시나리오

  1. 캐싱 효과 검증:
    • 특정 데이터를 캐싱했을 때 시스템의 처리량 증가와 응답 시간 단축을 테스트.
  2. 고부하 환경 테스트:
    • 많은 동시 요청을 Redis에 처리하도록 하여, Redis 클러스터의 한계를 측정.
  3. 실시간 데이터 처리:
    • 실시간 대시보드나 로그 수집에서 Redis를 활용해 데이터의 처리 지연 시간 측정.
  4. 큐 기반 시스템:
    • 메시지 큐를 Redis로 구현하고, 대규모 작업 요청이 처리되는 속도와 안정성을 확인.

결론

Redis는 성능 테스트 환경에서 빠르고 효율적인 데이터 처리를 지원하는 중요한 도구입니다. 캐싱, 세션 관리, 큐 처리 등 다양한 역할을 수행하며, 고성능 시스템 설계 및 성능 최적화에서 필수적인 기술로 자리 잡고 있습니다. Redis를 활용하면 성능 테스트 결과를 더 정확하고 신뢰성 있게 측정할 수 있습니다.

AJV

AJV (Another JSON Validator)는 JSON 데이터를 검증하는 데 사용되는 JSON Schema 유효성 검사 라이브러리입니다. JSON 형식의 데이터를 처리할 때 데이터가 특정 구조와 규칙에 따라 작성되었는지 확인하기 위해 사용됩니다.

AJV는 성능이 뛰어나고 JSON Schema 표준을 광범위하게 지원하여 Node.js 및 브라우저 환경에서 널리 사용됩니다.


AJV의 주요 특징

  1. JSON Schema 지원:
    • JSON Schema Draft-07, Draft-2019-09, Draft-2020-12 등 최신 버전을 지원.
    • JSON 데이터를 체계적으로 검증할 수 있도록 돕는 스키마 기반 검증 제공.
  2. 고성능:
    • 빠른 데이터 검증이 가능하여 대규모 데이터를 처리할 때 적합.
  3. 유연성:
    • 커스텀 규칙 및 플러그인을 추가하여 스키마를 확장할 수 있음.
  4. JSON Schema 외 지원:
    • JSON을 검증할 뿐만 아니라 데이터 형식을 변환하거나 기본값을 추가할 수도 있음.
  5. 오픈 소스:
    • 무료로 제공되며, 활발히 유지 관리되는 프로젝트.

AJV의 주요 사용 사례

  1. API 요청/응답 데이터 검증:
    • RESTful API나 GraphQL에서 요청 데이터가 서버에 전달되기 전에 데이터 형식과 필수 필드가 올바른지 확인.
  2. JSON 파일 유효성 검사:
    • JSON 형식의 파일이 특정 구조를 따르는지 확인하여 데이터 품질 보장.
  3. 폼 데이터 검증:
    • 사용자 입력 데이터를 클라이언트나 서버에서 스키마 기반으로 검증.
  4. 실시간 데이터 처리:
    • IoT 기기, 로그 처리, 메시지 브로커 등을 통해 전달되는 JSON 데이터를 빠르게 검증.

AJV 설치

Node.js 프로젝트에서 사용하기 위해 AJV를 설치하려면 아래 명령을 실행합니다:

npm install ajv  

AJV 사용 예제

1. 스키마 정의

AJV는 JSON Schema로 데이터를 검증합니다. JSON Schema는 JSON 데이터의 구조를 정의하는 표준입니다.

{  
  "type": "object",  
  "properties": {  
    "name": { "type": "string" },  
    "age": { "type": "integer", "minimum": 0 },  
    "email": { "type": "string", "format": "email" }  
  },  
  "required": ["name", "email"]  
}  
  • type: 데이터 타입 지정 (예: object, string, integer 등).
  • properties: 객체의 속성과 해당 속성의 스키마 정의.
  • required: 필수 속성 지정.

2. AJV 코드로 검증하기

const Ajv = require("ajv");  
const ajv = new Ajv();  
  
// JSON Schema  
const schema = {  
  type: "object",  
  properties: {  
    name: { type: "string" },  
    age: { type: "integer", minimum: 0 },  
    email: { type: "string", format: "email" }  
  },  
  required: ["name", "email"]  
};  
  
// 유효성 검사할 JSON 데이터  
const data = {  
  name: "John Doe",  
  age: 30,  
  email: "john.doe@example.com"  
};  
  
// 검증 실행  
const validate = ajv.compile(schema);  
const valid = validate(data);  
  
if (valid) {  
  console.log("데이터가 유효합니다.");  
} else {  
  console.log("데이터가 유효하지 않습니다:", validate.errors);  
}  

결과

  • 데이터가 스키마와 일치하면 "데이터가 유효합니다." 메시지 출력.
  • 데이터가 스키마와 일치하지 않으면 validate.errors에 오류 목록이 반환됩니다.

AJV의 장점

  1. JSON Schema 표준 준수:
    • 최신 표준을 지원하며, 호환성을 유지.
  2. 확장성:
    • 커스텀 포맷과 키워드를 정의하여 복잡한 검증 로직도 처리 가능.
  3. 성능 최적화:
    • 데이터를 빠르게 검증하며, 대규모 시스템에서 성능 병목을 줄임.
  4. 광범위한 커뮤니티와 지원:
    • 활발한 유지 관리와 다양한 문서 및 예제를 제공.

AJV의 단점

  1. 스키마 작성 복잡성:
    • 복잡한 JSON Schema를 작성하는 데 시간이 걸릴 수 있음.
  2. 기능 학습 곡선:
    • JSON Schema의 다양한 키워드와 규칙을 이해해야 효과적으로 활용 가능.

AJV는 JSON 기반 애플리케이션에서 데이터 검증을 간단하고 효과적으로 수행할 수 있도록 설계된 강력한 도구입니다. 특히 API 설계, 데이터 처리, 입력 검증 등 다양한 환경에서 활용될 수 있어 JSON 처리와 관련된 개발에서 필수적인 라이브러리로 자리 잡고 있습니다.

Postman을 활용한 API성능 테스트

https://blog.postman.com/postman-api-performance-testing/

Postman은 API의 성능을 테스트하기 위해 실제 트래픽을 시뮬레이션하는 기능을 제공합니다. 이를 통해 API가 실제 환경에서 어떻게 동작하는지 평가할 수 있습니다.

API 성능 테스트란 무엇이며, 왜 필요한가?

현대의 디지털 환경에서 우수한 사용자 경험을 제공하는 것은 지속 가능한 비즈니스를 구축하고 경쟁에서 앞서 나가는 데 필수적입니다. API는 이러한 비즈니스의 핵심 요소로서, 그 품질과 신뢰성이 제품의 사용자 경험에 직접적인 영향을 미칩니다. 따라서 API가 기대되는 기능을 충족하는지 확인하는 기능 테스트뿐만 아니라, 예상되는 트래픽 볼륨을 처리할 수 있는지 확인하는 성능 테스트도 중요합니다.

API 성능 테스트는 실제 트래픽을 시뮬레이션하고, 이에 따른 API의 동작을 관찰하는 과정을 포함합니다. 이를 통해 응답 시간, 처리량, 가용성 등의 성능 지표를 평가할 수 있습니다. 이러한 테스트를 통해 다음과 같은 이점을 얻을 수 있습니다:

  1. 예상 부하 처리 능력 확인: API가 예상되는 사용자 수를 처리할 수 있는지 확인하고, 부하 변화에 따른 API의 응답을 평가합니다.

  2. 성능 최적화 및 개선: 사용자 경험을 향상시키기 위해 API의 성능을 최적화하고 개선할 수 있습니다.

  3. 병목 현상, 지연 및 실패 식별: 시스템의 확장성을 결정하고, 잠재적인 문제를 사전에 발견하여 해결할 수 있습니다.

Postman을 활용한 API 성능 테스트

Postman은 기존의 컬렉션과 요청을 활용하여 API의 성능을 테스트할 수 있는 기능을 제공합니다. 주요 기능은 다음과 같습니다:

  1. 부하 시뮬레이션: 여러 병렬 가상 사용자가 엔드포인트에 요청을 보내는 부하를 시뮬레이션할 수 있습니다.

  2. 실시간 성능 시각화: 시뮬레이션된 부하 하에서 API의 응답 시간, 처리량(초당 요청 수), 오류율 등의 성능 지표를 실시간으로 시각화하여 모니터링할 수 있습니다.

Postman에서의 성능 테스트 설정 방법

  1. 컬렉션 선택 및 실행: Postman에서 테스트할 컬렉션을 선택하고, 필요한 경우 환경을 설정한 후 ‘Run’ 버튼을 클릭합니다.

  2. 부하 설정: ‘Runner’의 ‘Performance’ 탭에서 부하 설정을 지정합니다. 여기서 가상 사용자의 수와 테스트 지속 시간을 설정할 수 있습니다.

  3. 실시간 모니터링: 테스트 실행 중에 응답 시간과 오류율을 실시간으로 관찰할 수 있습니다. 또한, 초당 요청 수 등의 지표를 함께 확인할 수 있습니다.

  4. 결과 분석: 테스트 완료 후, 응답 시간과 초당 요청 수 등의 지표를 분석하여 병목 현상이나 성능 저하의 원인을 파악할 수 있습니다.

실제 트래픽 시뮬레이션을 위한 부하 프로필 설정

Postman의 컬렉션 러너를 통해 실제 트래픽을 시뮬레이션할 수 있으며, 현재 두 가지 부하 프로필을 지원합니다:

  1. 고정 부하 프로필: 테스트 기간 동안 일정한 수의 가상 사용자를 적용합니다.

  2. 점진적 증가 부하 프로필: ‘Ramp up duration’ 동안 가상 사용자 수를 점진적으로 증가시켜 설정된 부하 수준에 도달한 후, 남은 기간 동안 해당 부하를 유지합니다.

가상 사용자를 통한 API 워크플로우 부하 시뮬레이션

가상 사용자는 동시에 API에 요청을 보내는 병렬 사용자들을 나타냅니다. 이러한 가상 사용자를 활용하여 실제 사용자 트래픽을 시뮬레이션하고, API의 성능을 평가할 수 있습니다.

Postman의 이러한 기능을 활용하면, 실제 환경에서의 API 성능을 미리 평가하고 최적화할 수 있어, 사용자에게 우수한 경험을 제공하는 데 큰 도움이 됩니다.

⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️

AWS App Runner와 Express

AWS App Runner는 모바일 앱과 직접적으로 관련된 기능을 제공하지는 않지만, 모바일 앱 백엔드를 구축하거나 모바일 앱과 통신하는 API 서비스를 배포하는 데 매우 유용합니다. 모바일 앱 자체는 클라이언트 측에서 실행되지만, 앱에서 필요한 데이터와 기능을 제공하는 서버 측 백엔드가 필요하며, App Runner는 이러한 백엔드를 배포하고 관리하는 데 적합합니다.


모바일 앱과 AWS App Runner의 연관성

1. 모바일 앱의 백엔드 서비스 호스팅

  • 모바일 앱이 서버와 통신하기 위해 사용하는 API(RESTful API, GraphQL API 등)를 App Runner를 통해 배포.
  • App Runner는 API 서버를 자동 확장 및 관리하므로, 트래픽이 증가하는 모바일 앱에서도 안정적으로 동작.

사용 사례:

  • 사용자 인증/인가 처리 (예: JWT 기반 인증).
  • 모바일 앱에서 요청한 데이터를 데이터베이스에서 조회하여 반환.
  • 알림 시스템, 결제 처리 등의 백엔드 로직 수행.

2. 실시간 데이터 및 업데이트

  • App Runner에서 실시간 데이터를 처리하고 제공하기 위한 웹소켓 서버나 Pub/Sub 메시징 시스템을 배포 가능.
  • 모바일 앱에 실시간 알림, 채팅, 상태 업데이트 등을 제공.

사용 사례:

  • 실시간 채팅 앱 백엔드.
  • 실시간 주식 데이터 스트리밍 서비스.

3. 파일 업로드 및 다운로드 지원

  • 모바일 앱에서 이미지, 비디오 등을 업로드하거나 다운로드할 때 이를 처리하는 백엔드를 App Runner로 배포.
  • App Runner가 요청을 받아 S3와 같은 스토리지 서비스로 데이터를 저장하거나 반환.

사용 사례:

  • 사용자 프로필 사진 업로드.
  • 앱 내 미디어 파일 다운로드.

4. 데이터 처리 및 비즈니스 로직

  • 모바일 앱에서 필요한 데이터를 처리하고 가공하는 비즈니스 로직을 App Runner에서 실행.
  • 예를 들어, 모바일 앱에서 특정 조건으로 데이터를 필터링하거나, 데이터를 가공해서 반환하는 로직 수행.

사용 사례:

  • 모바일 앱 사용자의 위치를 기반으로 가까운 상점 목록 제공.
  • 사용자 데이터를 분석하여 개인화된 추천 제공.

AWS App Runner의 모바일 앱 백엔드 활용 장점

  1. 자동 확장:
    • 모바일 앱 사용자가 급격히 늘어나더라도 트래픽 증가를 자동으로 처리.
  2. 빠른 배포:
    • 코드 변경 후 쉽게 새 버전을 배포 가능.
  3. 보안 내장:
    • HTTPS 기본 제공 및 AWS IAM을 통해 안전한 백엔드 환경 제공.
  4. 비용 효율성:
    • 소규모 모바일 앱 프로젝트에도 적합하며, 사용량에 따라 요금을 지불.
  5. 서버리스 환경:
    • 서버 관리 없이 애플리케이션에만 집중할 수 있음.

App Runner를 사용하는 모바일 앱 백엔드 예제

1. RESTful API 백엔드

모바일 앱이 사용할 RESTful API를 배포.

// Express.js 예제  
const express = require('express');  
const app = express();  
  
app.get('/api/user/:id', (req, res) => {  
  const userId = req.params.id;  
  // 데이터베이스 조회 예제  
  res.json({ id: userId, name: 'John Doe' });  
});  
  
app.listen(3000, () => {  
  console.log('Server running on port 3000');  
});  
  • 이 코드를 App Runner에 배포하면 모바일 앱에서 API 호출 가능 (/api/user/1).

2. 모바일 앱에 대한 파일 업로드 처리

S3와 연동하여 파일 업로드를 처리하는 백엔드 배포.

const AWS = require('aws-sdk');  
const express = require('express');  
const app = express();  
  
const s3 = new AWS.S3();  
  
app.post('/upload', (req, res) => {  
  const fileContent = Buffer.from(req.body.file, 'binary');  
  const params = {  
    Bucket: 'your-bucket-name',  
    Key: 'file-name.jpg',  
    Body: fileContent,  
    ContentType: 'image/jpeg',  
  };  
  
  s3.upload(params, (err, data) => {  
    if (err) return res.status(500).send(err);  
    res.json({ url: data.Location });  
  });  
});  
  
app.listen(3000, () => {  
  console.log('Server running on port 3000');  
});  
  • App Runner를 사용해 이 백엔드를 배포하면 모바일 앱에서 파일 업로드 가능.

AWS App Runner vs AWS Amplify

AWS Amplify는 모바일 앱 개발에 특화된 서비스로, 프론트엔드와 백엔드 통합 솔루션을 제공합니다.

특징 App Runner AWS Amplify
주요 용도 API 및 백엔드 애플리케이션 배포 모바일/웹 앱의 통합 백엔드 및 프론트엔드 관리
백엔드 지원 소스 코드, 컨테이너 이미지 GraphQL API, REST API, 인증, 스토리지, 호스팅
자동 확장 기본 제공 기본 제공
프론트엔드 지원 제공하지 않음 (백엔드만) 제공 (React, Angular, Vue 등)

결론

AWS App Runner는 모바일 앱의 백엔드 배포 및 관리를 간소화하기 위한 강력한 도구입니다. 만약 백엔드 서비스만 관리하고 싶다면 App Runner를 활용할 수 있고, 백엔드와 프론트엔드 통합 관리가 필요하다면 AWS Amplify가 더 적합할 수 있습니다. 모바일 앱과의 연동을 염두에 두고 필요한 서비스를 선택해 사용하면 됩니다.

Dahna
Written by Dahna Follow
Hi, I am Dahna, the author of this blog!