⚙️ 프로젝트 설계 및 성능 고려사항 정리
🖼️ 1️⃣ JS loading="lazy" 속성
| 항목 | 설명 |
|---|
| 정의 | HTML <img> 태그에서 이미지가 뷰포트에 진입할 때 로드되도록 설정하는 속성 |
| 기능 | 초기 로딩 시 모든 이미지를 불러오지 않고, 사용자가 스크롤할 때 필요한 이미지만 불러옴 |
| 장점 | 페이지 로딩 속도 향상, 초기 트래픽 감소, 사용자 경험(UX) 개선 |
| 적용 예시 | <img src="thumbnail.jpg" loading="lazy" alt="이미지 설명"> |
| 주의사항 | 이미지가 바로 보여야 하는 영역(대표 이미지 등)에는 사용하지 않는 것이 좋음 |
💡 “Lazy Loading”은 네트워크 자원을 절약하고 UX를 개선하지만, 캐싱 및 스크롤 처리와 함께 고려해야 한다.
🧠 2️⃣ 서버 이미지 캐싱 과부하 문제
| 문제 상황 | 설명 |
|---|
| 장시간 페이지 체류 시 문제 | 이미지 캐싱을 서버 메모리 또는 Redis에 유지하면, 시간이 지날수록 캐시 데이터가 누적되어 과부하 발생 가능 |
| 원인 | 캐시 데이터의 TTL(Time To Live) 설정 부재 또는 삭제 로직 미흡 |
✅ 해결 방안
| 방법 | 설명 |
|---|
| TTL 설정 | redisTemplate.opsForValue().set(key, value, Duration.ofMinutes(30)); 처럼 TTL(유효기간) 설정 |
| LRU 캐시 정책 | 오래된 캐시부터 자동 삭제되도록 설정 |
| 정적 리소스 분리 | CDN 또는 별도 이미지 서버를 두어 API 서버의 부하를 분산 |
| 모니터링 | Redis 메모리 사용량 및 캐시 히트율 모니터링 |
🧩 3️⃣ 멀티테넌시 DB 생성 시 스레드 과부하 문제
| 문제 상황 | 설명 |
|---|
| DB 생성 로직 병목현상 | 멀티테넌시 환경에서 신규 테넌트(DB)를 생성할 때, 각 요청이 새로운 스레드를 사용하면 스레드 풀이 포화될 수 있음 |
| 결과 | 다른 요청(로그인, 데이터 조회 등)이 대기 상태로 밀림 → 서버 응답 지연 발생 |
✅ 해결 방안
| 해결 전략 | 설명 |
|---|
| 비동기 큐(Async Queue) | DB 생성 요청을 큐에 저장하고, 백그라운드에서 순차적으로 처리 |
| Thread Pool 제한 설정 | Spring의 @Async 또는 ExecutorService에서 스레드 수 제한 |
| 비동기 이벤트 기반 설계 | ApplicationEventPublisher 등을 통해 논리적 비동기 처리 |
| 백엔드 분리 아키텍처 | “DB 생성 전용 서버”를 분리하여 메인 서버의 부하를 방지 |
🧱 4️⃣ 서버 분리 전략
| 구분 | 설명 | 장점 | 단점 |
|---|
| 단일 서버 구조 | 모든 기능이 하나의 서버에서 동작 | 관리 용이, 배포 간단 | 부하 집중, 장애 확산 위험 |
| 서버 분리 구조 (Microservice) | DB 생성, 인증, API 서버를 각각 분리 | 안정성 향상, 병목 최소화 | 배포 및 유지보수 복잡, 네트워크 오버헤드 발생 |
⚖️ 선택 기준: “트래픽 규모 + 유지보수 인력 + 서비스 안정성”