티스토리 뷰

반응형

아래 글은 “웹 개발 기초부터 실무까지” 시리즈의 여덟 번째 글입니다. 이번에는 웹 애플리케이션의 성능 최적화 및 보안 강화 방법을 다루겠습니다.
배포가 완료된 후에도, 웹 애플리케이션이 빠르고 안전하게 동작하도록 최적화하는 과정이 필요합니다.
이를 위해 프론트엔드, 백엔드, 데이터베이스 수준에서 다양한 성능 개선 및 보안 전략을 적용해 보겠습니다.


1. 웹 성능 최적화란?

1-1. 성능 최적화의 중요성

  • 빠른 로딩 속도: 사용자가 이탈하지 않도록 페이지를 빠르게 불러오기
  • 효율적인 자원 사용: 서버 및 데이터베이스의 부하를 줄여 비용 절감
  • 검색엔진 최적화(SEO) 향상: 페이지 속도가 빠를수록 검색 순위에 긍정적 영향

1-2. 성능 최적화 주요 영역

  1. 프론트엔드 최적화
  2. 백엔드 최적화
  3. 데이터베이스 최적화
  4. 캐싱 및 CDN 활용
  5. 보안 강화

2. 프론트엔드 최적화 (React 기반)

2-1. 코드 압축 및 번들링

  • React의 npm run build 명령어를 실행하면 코드가 압축되고, 불필요한 공백·주석이 제거됨
  • 웹팩(Webpack)의 **코드 스플리팅(Code Splitting)**을 사용하면 초기 로딩 속도를 향상할 수 있음
    import React, { lazy, Suspense } from "react";
    
    const HeavyComponent = lazy(() => import("./HeavyComponent"));
    
    function App() {
      return (
        <Suspense fallback={<div>Loading...</div>}>
          <HeavyComponent />
        </Suspense>
      );
    }
    

2-2. 이미지 최적화

  • WebP 포맷 사용 (.png, .jpg보다 가볍고 품질 유지)
  • lazy loading 적용 → 사용자가 화면을 스크롤할 때 이미지를 로드
    <img src="image.webp" loading="lazy" alt="Example" />
    

2-3. CSS 최적화

  • CSS 파일 크기 줄이기: 불필요한 스타일 제거 (purgecss 활용)
  • CSS 파일을 미니파일(minify) 후 배포
    npm install purgecss
    

3. 백엔드 최적화 (Express 기반)

3-1. API 응답 속도 개선

  • 데이터 전송량 최소화: 클라이언트가 필요한 데이터만 반환
  • app.get("/api/todos", async (req, res) => { const todos = await Todo.find({}, "text completed"); // 필요한 필드만 반환 res.json(todos); });
  • Gzip 압축 활성화: Express에서 응답 압축을 적용해 네트워크 트래픽 감소
    const compression = require("compression");
    app.use(compression());
    
  • npm install compression

3-2. 요청 수 제한 (Rate Limiting)

  • DDoS 공격 방지 및 과도한 요청 제한
    npm install express-rate-limit
    
    const rateLimit = require("express-rate-limit");
    
    const limiter = rateLimit({
      windowMs: 15 * 60 * 1000, // 15분 기준
      max: 100, // IP당 100개 요청 제한
    });
    
    app.use(limiter);
    

4. 데이터베이스 최적화 (MongoDB 기반)

4-1. 데이터 인덱싱(Indexing)

  • 자주 조회하는 데이터에 인덱스를 적용하면 성능이 향상됨
    TodoSchema.index({ text: 1 });
    

4-2. 페이징 처리 (Pagination)

  • 한 번에 너무 많은 데이터를 불러오는 문제 방지
    app.get("/api/todos", async (req, res) => {
      const page = parseInt(req.query.page) || 1;
      const limit = 10;
      const todos = await Todo.find()
        .skip((page - 1) * limit)
        .limit(limit);
      res.json(todos);
    });
    

5. 캐싱(Caching) 및 CDN 활용

5-1. 캐싱(Cache) 적용

  • Redis를 활용해 자주 사용하는 데이터를 메모리에 저장하면 API 속도가 빨라짐
    npm install redis
    
    const redis = require("redis");
    const client = redis.createClient();
    
    app.get("/api/todos", async (req, res) => {
      client.get("todos", async (err, cachedData) => {
        if (cachedData) {
          return res.json(JSON.parse(cachedData)); // 캐시된 데이터 반환
        }
    
        const todos = await Todo.find();
        client.setex("todos", 3600, JSON.stringify(todos)); // 1시간 캐싱
        res.json(todos);
      });
    });
    

5-2. CDN(Content Delivery Network) 사용

  • **정적 파일(JS, CSS, 이미지)**을 CDN을 통해 배포하면 로딩 속도가 향상됨
  • 대표적인 CDN 서비스: Cloudflare, AWS CloudFront, Fastly

6. 보안 강화

6-1. HTTPS 적용

  • Let's Encrypt를 사용하여 무료 SSL 인증서 적용
  • Netlify, Vercel, Render에서 기본적으로 HTTPS 제공

6-2. 환경 변수(.env) 사용

  • 데이터베이스 URL, API 키 등 중요한 정보를 코드에서 숨기기
    require("dotenv").config();
    const MONGO_URI = process.env.MONGO_URI;
    

6-3. CORS 정책 설정

  • 백엔드 서버에서 CORS 설정을 통해 특정 도메인만 API 요청을 허용
    npm install cors
    
    const cors = require("cors");
    app.use(cors({ origin: "https://myfrontend.com" })); // 허용할 도메인만 추가
    

6-4. 보안 패키지 적용

  • **helmet**을 활용해 HTTP 보안 헤더 적용
    npm install helmet
    
    const helmet = require("helmet");
    app.use(helmet());
    

6-5. JWT 인증 적용

  • 사용자 인증을 위해 JWT(JSON Web Token) 적용
    const jwt = require("jsonwebtoken");
    
    function authenticateToken(req, res, next) {
      const token = req.header("Authorization");
      if (!token) return res.status(401).json({ error: "Unauthorized" });
    
      jwt.verify(token, process.env.JWT_SECRET, (err, user) => {
        if (err) return res.status(403).json({ error: "Invalid Token" });
        req.user = user;
        next();
      });
    }
    

7. 마무리 및 다음 글 예고

이번 글에서는 웹 애플리케이션의 성능 최적화 및 보안 강화 방법을 다뤘습니다.
웹 애플리케이션은 배포 후에도 지속적인 속도 개선과 보안 점검이 필요하며, 성능 최적화를 통해 사용자 경험을 개선할 수 있습니다.

다음 글에서는 웹 개발 실무에서 자주 사용하는 툴과 협업 방법을 다룰 예정입니다.

다음 글 예고
“웹 개발 시리즈 #9 – 웹 개발 실무에서 사용하는 협업 도구 및 워크플로우”

질문이나 추가로 다뤄줬으면 하는 내용이 있다면 댓글로 남겨주세요! 🚀

 

※ 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
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
글 보관함
반응형