📚 "[REST API 서버] 개발자 스터디 모임 플랫폼" 📚
📖 개요
제안배경
- 익명 온라인 환경에서 신뢰할 수 있는 스터디원 찾기에 어려움을 느낌
- 이에 문제인식을 느끼고 스터디원의 과거 성실도 확인이 가능한 스터디 모임 플랫폼 제작
- 스터디 모임 종료후 → 모든 스터디원 참여 점수 공개(별점 및 리뷰글 기반)
- 플랫폼 이름 = Coding Friends
- 해당 프로젝트는 기존 개발한 스터디 모임 플랫폼에서 서버를 분리 → [기능추가 및 리팩토링한 REST API 서버]
- 기존 스터디 모집 프로젝트
[REST API 서버] 프로젝트 목표
- 스터디 모집 및 진행 → 진행 종료 후: 스터디원 참여 점수 공개(별점 및 리뷰글) API를 제공합니다.
- 기능과 더불어 해당 프로젝트는 3가지 핵심 가치를 반영합니다.
- 성능향상
- 대규모 트래픽 대처
- 추후 기능추가 및 확장 가능성
- 배포 URL(현재 운영종료): http://54.180.41.105:8082/swagger-ui/index.html#/
- 서버 운영비용으로 인해 현재 종료한 상태입니다.
- 서버 운영비용으로 인해 현재 종료한 상태입니다.
📖 서버 구조도
📖 기술스택
- Back-end : Java11, Spring Boot 2.7.8, Spring Data JPA, Querydsl, JUnit5, Gradle
- Database: MySQL 8.0, MyBatis, Redis
- DevOps: AWS - EC2, S3, RDS, IAM, CodeDeploy
- CI/CD: Git Action
- Tools: IntelliJ, Git ( + Git Flow), Pinpoint, Ngrinder, VisualVM, Ubuntu, Vim, Notion
🔥 프로젝트 중점사항 🔥
-
이메일 발송 기능을 추후 기능추가 및 확장을 고려하여 개발
-
응답이 필요없는 이메일 발송 처리 성능 개선을 위해 비동기 방식 활용
- 예외처리를 고려하여 @Scheduled/ @Async/ Java CompleteFuture 조합으로 개발
- common pool을 사용하지 않도록 thread pool 설정
-
반복적으로 보여지는 게시글 캐싱 기능 추가 재검색 속도 400% 개선 (859 ms → 22 ms)
- Redis 캐시 적용하여 Disk-Based DB 접근횟수 감소시킴
-
- 분산 환경에서 원자성(atomic)을 보장하기 위해 Redis 분산 락 적용
- 부하 분산을 위한 서버 다중화 상황을 가정 (실제 동작 서버는 1개)
- 분산 환경에서 원자성(atomic)을 보장하기 위해 Redis 분산 락 적용
-
데이터베이스 부하 분산을 위해 DB replication
- Slave DB에 실시간 데이터 복제
- Master DB에서는 (insert , update , delete) Slave DB에는 (select) 역할 분담
-
- 컬럼선택: 자주 조회되며 cardinality 수치가 높은 이메일 주소 선택
- mysql profiling을 통해 DB 조회업무 검색 속도 400% 개선 검증
(약 0.1182초 → 약 0.0003초/ 컬럼 300개 기준)
-
- Pinpoint, NGrinder
- 사례
- redis 캐시
- 이메일 비동기 처리 / thread pool
-
유지보수 하기 좋도록 기능단위 메서드 추출을 하여 개발
- 협업시 필요한 부분만 빠르게 확인하여 수정이 용이
- 사례
-
예외처리 유지보수를 편리하게 하기 위해 @ControllerAdvice - @ExceptionHandler 사용
-
API Response 가독성을 높이고자 Response를 success,failure/ result data 등으로 분리
-
진행중: JUnit5 단위 테스트
📖 비즈니스 목표
스터디원이 모임 종료후 → 후기가 남는 것을 의식하여 모임을 끝까지 마칠 수 있는 스터디 모임 플랫폼 제작
비즈니스 목표 달성을 위한 기능 요구사항