티스토리 뷰

반응형

웹 개발 실무 기술 A to Z

고성능 웹 애플리케이션을 구축하려면 대규모 트래픽을 처리할 수 있는 안정적인 아키텍처가 필요합니다.
✔️ 로드 밸런싱 (Load Balancing) → 서버 부하 분산
✔️ 캐싱 (Caching) → 데이터베이스 부하 감소 및 성능 향상
✔️ 마이크로서비스 확장 (Scalability) → 트래픽 증가에 따른 시스템 확장

이번 글에서는 고성능 웹 아키텍처 설계 방법 및 주요 기술을 소개하겠습니다.


1. 고성능 웹 아키텍처 설계의 중요성

✔️ 사용자 증가에 따른 성능 저하 방지
✔️ 트래픽 급증 시 자동 확장 가능
✔️ 서버 장애 발생 시 서비스 지속성 유지
✔️ 데이터베이스 부하 분산 및 응답 속도 최적화

최적의 아키텍처를 구축하면 트래픽이 증가해도 안정적인 서비스 운영 가능!


2. 로드 밸런싱 (Load Balancing)

2-1. 로드 밸런싱 개념

✔️ 트래픽을 여러 서버로 분산하여 부하를 줄이는 기술
✔️ 가장 부하가 적은 서버로 요청을 라우팅하여 성능 최적화
✔️ 장애가 발생한 서버를 자동으로 감지하고 트래픽을 다른 서버로 전환

2-2. 로드 밸런서 유형

로드 밸런서 설명 예제

L4 로드 밸런서 네트워크 계층(4계층, TCP)에서 부하 분산 Nginx, HAProxy
L7 로드 밸런서 애플리케이션 계층(7계층, HTTP)에서 부하 분산 AWS ALB, Traefik

2-3. Nginx를 이용한 로드 밸런싱 구현

(1) Nginx 설치

sudo apt update && sudo apt install nginx

(2) Nginx 로드 밸런서 설정 (/etc/nginx/sites-available/default)

upstream backend_servers {
    server 192.168.1.2:3000;
    server 192.168.1.3:3000;
}

server {
    listen 80;
    
    location / {
        proxy_pass http://backend_servers;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

(3) Nginx 재시작

sudo systemctl restart nginx

Nginx를 활용하면 여러 서버로 트래픽을 자동으로 분산 가능!


3. 캐싱 (Caching) – 데이터베이스 부하 감소

3-1. 캐싱이란?

✔️ 자주 사용되는 데이터를 미리 저장하여 빠르게 제공
✔️ 데이터베이스 조회 없이 캐시에서 즉시 응답 가능
✔️ API 성능 최적화 및 서버 부하 감소

3-2. 캐싱 방식

캐싱 방식 설명 예제

클라이언트 캐싱 브라우저에서 데이터 캐싱 LocalStorage, IndexedDB
서버 캐싱 API 응답을 캐싱하여 반복적인 요청 방지 Redis, Memcached
CDN 캐싱 정적 파일(이미지, CSS, JS) 저장 Cloudflare, AWS CloudFront

3-3. Redis를 이용한 API 응답 캐싱

(1) Redis 설치

sudo apt install redis-server

(2) Node.js에서 Redis 캐싱 적용

npm install redis
const redis = require("redis");
const client = redis.createClient();

client.on("error", (err) => console.log("Redis Error:", err));

const cacheMiddleware = (req, res, next) => {
  const key = req.originalUrl;
  client.get(key, (err, data) => {
    if (err) throw err;
    if (data) return res.json(JSON.parse(data));
    next();
  });
};

app.get("/api/products", cacheMiddleware, async (req, res) => {
  const products = await Product.find();
  client.setex(req.originalUrl, 3600, JSON.stringify(products)); // 1시간 캐싱
  res.json(products);
});

Redis를 활용하면 동일한 API 요청 시 빠른 응답 가능!


4. 마이크로서비스 확장 (Scalability)

4-1. 확장성 유형

확장 방식 설명

수직 확장 (Scale-Up) 더 강력한 서버로 업그레이드
수평 확장 (Scale-Out) 여러 서버를 추가하여 부하 분산

4-2. Docker와 Kubernetes를 활용한 마이크로서비스 확장

✔️ Docker로 컨테이너화하여 빠르게 배포 가능
✔️ Kubernetes를 사용하여 자동 확장 및 오케스트레이션

(1) Kubernetes에서 마이크로서비스 자동 확장 설정

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: node-app-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: node-app
  minReplicas: 2
  maxReplicas: 10
  metrics:
    - type: Resource
      resource:
        name: cpu
        targetAverageUtilization: 50

Kubernetes HPA(Horizontal Pod Autoscaler)를 활용하면 CPU 사용량에 따라 자동 확장 가능!


5. 고성능 웹 아키텍처 적용 전후 비교

5-1. 적용 전

  • 단일 서버 사용 → 트래픽 증가 시 서비스 지연 발생
  • API 요청마다 DB 조회 → 응답 속도 저하 및 성능 문제
  • 서버 장애 시 서비스 중단

5-2. 적용 후

✔️ 로드 밸런싱 적용트래픽 자동 분산 및 서버 장애 시 대체 서버 운영
✔️ 캐싱 적용 (Redis)자주 조회되는 데이터는 캐시에서 즉시 응답
✔️ 마이크로서비스 확장 (Kubernetes)트래픽 증가에 따라 자동 확장

고성능 아키텍처를 적용하면 웹 애플리케이션이 대규모 트래픽에도 안정적으로 운영 가능!


6. 마무리 및 다음 글 예고

이번 글에서는 고성능 웹 아키텍처 구축을 위한 로드 밸런싱, 캐싱, 마이크로서비스 확장 방법을 살펴봤습니다.
다음 글에서는 **웹 애플리케이션 성능 최적화 (코드 스플리팅, Gzip 압축, 웹팩 최적화)**을 소개하겠습니다.

다음 글 예고: "웹 애플리케이션 성능 최적화 – 코드 스플리팅, Gzip 압축, 웹팩 최적화" 🚀

 

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/03   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
글 보관함
반응형