티스토리 뷰

반응형

웹 개발 실무 기술 A to Z

웹 애플리케이션의 성능을 높이기 위해서는 데이터베이스(DB) 최적화가 필수적입니다.
데이터가 많아질수록 쿼리 속도 저하, 서버 부하 증가, 트랜잭션 병목 현상이 발생할 수 있습니다.
이번 글에서는 인덱싱, 샤딩, 캐싱 전략을 활용하여 데이터베이스 성능을 최적화하는 방법을 알아보겠습니다.


1. 데이터베이스 성능 최적화가 중요한 이유

✔️ 빠른 검색 속도 → 인덱스를 활용하여 쿼리 실행 속도 향상
✔️ 서버 부하 감소 → 캐싱을 통해 반복적인 DB 조회 최소화
✔️ 확장성 확보 → 샤딩을 통해 트래픽 증가에도 안정적인 운영 가능


2. 인덱싱 (Indexing) – 쿼리 속도 최적화

2-1. 인덱스란?

인덱스(Index)는 DB 테이블의 특정 컬럼을 빠르게 검색하기 위한 데이터 구조입니다.
✔️ 대량의 데이터에서도 빠른 검색 가능
✔️ WHERE, ORDER BY, JOIN 연산 최적화 가능

2-2. 인덱스 적용 예제

(1) MySQL에서 기본 인덱스 생성

CREATE INDEX idx_user_email ON users(email);
  • users 테이블의 email 컬럼에 인덱스를 추가
  • 이후 WHERE email = 'user@example.com' 같은 검색 속도 향상

(2) 인덱스 적용 전후 성능 비교

EXPLAIN SELECT * FROM users WHERE email = 'user@example.com';
  • 인덱스 미적용 시: Full Table Scan 발생 → 전체 데이터를 검색
  • 인덱스 적용 시: Index Scan 발생 → 특정 데이터만 빠르게 조회

자주 검색되는 컬럼에는 인덱스를 추가하여 성능 향상 가능!

2-3. 인덱스 사용 시 주의할 점

✔️ 과도한 인덱스 사용 금지 → 인덱스가 많으면 INSERT/UPDATE 속도 저하
✔️ 고유한 데이터에 적합 → 중복 값이 많은 컬럼에는 인덱스 효과가 낮음


3. 샤딩 (Sharding) – 대규모 트래픽 분산 처리

3-1. 샤딩이란?

샤딩(Sharding)은 데이터를 여러 개의 데이터베이스 서버로 분산하여 저장하는 방식입니다.
✔️ 트래픽 증가 시 데이터베이스 부하 분산 가능
✔️ 데이터 저장 용량 증가
✔️ 단일 DB 장애 발생 시 전체 서비스 다운 방지

3-2. 샤딩 방식

샤딩 유형 설명 예제

수평 샤딩 (Horizontal Sharding) 동일한 테이블을 여러 개의 DB로 나눔 users_1, users_2
수직 샤딩 (Vertical Sharding) 테이블을 분리하여 저장 user_info, user_logs
해시 기반 샤딩 (Hash Sharding) 특정 키 값을 해싱하여 DB 분산 user_id % 3 → 해당 DB 저장

3-3. 샤딩 구현 예제

✔️ 예제: User ID 기반 수평 샤딩

function getDatabaseShard(userId) {
  const shardNumber = userId % 3; // 3개의 샤드로 분산
  return `database_${shardNumber}`; // 해당 샤드에서 데이터 조회
}

사용자 ID를 기반으로 특정 데이터베이스에서 조회하여 부하를 분산할 수 있음!


4. 캐싱 (Caching) – 자주 사용되는 데이터 미리 저장

4-1. 캐싱이란?

✔️ 자주 사용되는 데이터를 저장하여 DB 조회 감소
✔️ API 응답 속도 향상 및 서버 부하 감소

4-2. 캐싱 전략

캐싱 방식 설명 예제

클라이언트 캐싱 브라우저, 모바일 앱에서 데이터 저장 LocalStorage, IndexedDB
서버 캐싱 웹 서버에서 API 응답을 저장 Redis, Memcached
CDN 캐싱 정적 파일(이미지, CSS, JS) 저장 Cloudflare, AWS CloudFront

4-3. Redis를 이용한 서버 캐싱

(1) Redis 설치 및 설정

npm install redis

(2) Redis 캐싱 미들웨어

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

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(); // 캐시에 데이터 없으면 다음 미들웨어 실행
  });
};

(3) API 응답 캐싱

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

Redis를 활용하면 반복적인 DB 조회 없이 빠르게 데이터를 제공 가능!


5. 데이터베이스 성능 최적화 적용 전후 비교

5-1. 최적화 적용 전

  • 데이터 양 증가 → 검색 속도 저하
  • 동일한 요청 반복 처리 → DB 부하 증가
  • 트래픽 증가 시 서비스 장애 발생 가능

5-2. 최적화 적용 후

✔️ 인덱싱검색 속도 10배 이상 향상
✔️ 샤딩대용량 트래픽도 안정적으로 처리 가능
✔️ 캐싱서버 부하 감소 및 응답 속도 개선

데이터베이스 최적화를 적용하면 서비스 성능이 크게 향상될 수 있음!


6. 마무리 및 다음 글 예고

이번 글에서는 **데이터베이스 성능 최적화 방법 (인덱싱, 샤딩, 캐싱)**을 다뤘습니다.
다음 글에서는 마이크로서비스 아키텍처(MSA)와 API Gateway 활용법을 소개하겠습니다.

다음 글 예고: "마이크로서비스 아키텍처(MSA) – API Gateway와 서비스 분리 전략" 🚀

 

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함
반응형