성능 최적화 카테고리는 데이터베이스 및 서버 성능을 최적화하는 능력을 평가합니다. 특히 캐싱, 쿼리 최적화, CDN등은 실무에서 서버 부하를 줄이고 사용자 경험을 향상시키기 위해 필수적으로 알아야 하는 기술입니다. 면접관은 지원자가 성능 문제를 식별하고, 이를 해결할 수 있는 방법을 얼마나 잘 알고 있는지를 확인하고 싶어합니다.
- 캐시(Cache) : 자주 사용되는 데이터를 메모리에 저장하여 성능에 향상
- Redis : 자주 사용되는 캐시 저장소
- 쿼리 최적화 : 복잡한 데이터 조회 시 인덱스 사용, JOIN 최적화
- CDN : 콘텐츠 전송 속도를 높이기 위한 네트워크
- 성능 모니터링 : 애플리케이션 성능을 지속적으로 추적하고 문제를 해결
백엔드 성능 최적화 방법
1. 비동기 처리 : 오래 걸리는 작업(예 : 파일처리, API 호출)을 비동기 방식으로 진행
2. 캐싱 : 자주 사용하는 데이터를 Redis 같은 메모리 캐시에 저장해 DB 부하 줄이기
3. 데이터베이스 튜닝 : 적절한 인덱스를 설정하고, 불필요한 쿼리를 최소화
4. 로드 밸런싱 : 여러 서버에 트래픽을 분산시켜 부하를 줄이기
5. 압축 및 최소화 : API 응답을 gzip으로 압축하고, 불필요한 데이터 전송 줄이기
데이터베이스 쿼리 최적화 방법
1. 인덱스 사용 : 자주 조회하는 컬럼에 적절한 인덱스를 추가해 검색 속도 향상.
2. 조인 최적화 : 필요없는 조인은 피하고, 조인 순서를 최적화
3. 쿼리 캐싱 : 자주 실행되는 쿼리는 캐시를 활용하여 반복 실행 방지
4. 배치 처리 : 대량의 데이터를 한번에 처리하여 트랜잭션 오버헤드 줄이기.
5. 정규화 & 비정규화 : 데이터 중복을 최소화하지만, 속도를 위해 적절히 비정규화 고려
Redis의 주요 사용 사례
1. 세션 관리 : 사용자 로그인 세션을 Redis에 저장하여 빠른 접근 가능
2. 캐싱 : DB 조회 결과를 Redis에 저장하여 성능 향상.
3. 메시지 큐 : Pub/Sub 기능을 활용해 실시간 알림, 채팅 구현.
4. 분산 락 : 여러 서버에서 동시에 같은 리소스를 수정하는 것을 방지
캐시 매커니즘과 사용 이유
캐시란? 자주 사용하는 데이터를 빠르게 가져오기 위해 메모리에 저장하는 기술이다.
사용이유
- DB 부하 감소
- 응답 속도 향상
- 네트워크 비용 절감
CDN과 성능 최적화
CDN ? 전 세계 여러 지역에 배포된 서버에 정적 콘텐츠(이미지, CSS, JS)를 저장해 사용자에게 더 가까운 서버에서 제공하는 네트워크
성능 최적화 기여
- 로딩 속도 향상 : 사용자가 가까운 CDN 서버에서 파일을 받아 빠르게 페이지 로딩
- 서버 부하 감소 : 원본 서버 대신 CDN이 트래픽을 처리하여 부하 감소.
- DDos 방어 : 분산된 네트워크로 트래픽을 분산해 공격 방어 효과
캐시 무효화 전략
캐시된 데이터가 오래되었거나 변경될 때, 이를 제거하거나 갱신하는 전략이다.주요방법
- Write-through : 데이터 변경 시 캐시와 DB 모두 업데이트.
- Write-back : 캐시에 먼저 저장하고 나중에 DB 반영. 성능은 좋지만 데이터 유실 위험있음.
- Cache-aside (Lazy Loading) : 필요할 때 캐시에 적재, 변경 시 캐시 삭제. 가장 일반적
- TTL(Time-To-Live) : 일정 시간이 지나면 자동 삭제.
Redis에서 데이터가 영구적으로 저장되지 않는 이유 & 방지 방법
이유 :
- 기본적으로 In-Memory DB이므로 재시작 시 데이터 소실 가능.
- 정책에 따라 오래된 키가 삭제될 수 있음 (eviction).
방지방법
- AOF(Append-Only File) : 모든 변경 사항을 로그로 기록.
- RDB(Snapshotting) : 일정 주기로 데이터를 리스크에 저장.
- Persistent 설정 조합 : AOF + RDB 함께 사용해 복구 가능성 높임.
JVM 튜닝을 통한 성능 최적화
- Heap 크기 조정 : -Xms(초기 크기), -Xmx(최대 크기) 설정.
- GC 최적화 : G1,GC,ZGC 같은 최신 GC 사용.
- 메모리 영역 분리 : Eden, Survivor, Old 영역 크기 조정.
- 스레드 스택 크기 조정 : -Xss 설정으로 과도한 스택 사용 방지.
- JIT 최적화 : -xx:+TieredCompilation 등 활용.
스레드 풀과 비동기 작업을 사용한 성능 최적화
- 스레드 풀 : 필요할 때만 스레드 생성 & 재사용하여 비용 절감.
- 비동기 작업(Async) : 병렬 실행으로 응답 속도 향상 (@Async 사용).
- 적절한 큐 크기 설정 : 대기 요청이 너무 많아지지 않도록 조정.
- ForkJoinPool : 대량의 병렬 작업을 효과적으로 처리하는 데 활용
서버, CPU, 메모리 사용률 모니터링 & 최적화
- 모니터링 도구 활용
- top, htop, vmstat(리눅스)
- jconsole. VisualVM, Prometheus + Grafana (JVM)
- CPU 최적화 :
- 불필요한 스레드 감소, GC 튜닝, 적절한 부하 분산- 메모리 최적화 :
- 객체 재사용, 캐시 전략 개선, 메모리 누수 감지(MAT, jmap)