깃허브 주소 : https://github.com/junyeong237/booktalk
프로젝트 기간 : 2024년 1월 4일 → 2024년 2월 8일
🏗 아키텍쳐
📑 주요 기능
- 중고 거래 상품 등록
- 외부 상품과의 가격 비교 기능
- 거래를 위한 채팅 기능
- 거래 후 판매자 평점 & 상품 리뷰 기능
- 채팅과 리뷰를 위한 알림 기능
- 회원 신고 기능
- 백오피스 관리자 기능
사용 기술
- BackEnd
- Java 17
- Spring Boot 3.2.1
- Spring Security 6.2.1
- JWT 0.11.5
- Gradle 8.5
- QueryDSL 5.0.0
- Spring Data JPA 3.2.1
- Spring Data Redis 3.2.1
- WebSocket 3.2.1
- STOMP
- KAKAO Open API
- OAuth 2.0
- JUnit 5.10.1
- SSE
- FrontEnd
- HTML
- CSS
- JavaScript (jQuery)
- AJAX
- Bootstrap 5.3.0
- Thymeleaf 3.1.2
- DB
- MySQL 8.2.0
- Redis
- H2 2.2.224
- Infra
- AWS
- EC2
- S3
- RDS
- CodeDeploy
- GitHub Actions
- AWS
- Docs
- JMeter 5.6.3
🍀 주요 기술 설명
- QueryDSL
- 컴파일 시점에 쿼리 문법 오류 확인 가능
- 동적 쿼리 작성 및 최적화 가능
- JPQL과 유사한 형태로 작성하여 쉬운 적응 가능
- WebSocket & STOMP
- 채팅 기능을 위한 WebSocket 사용
- WebSocket 통신을 효율적으로 다루기 위해 STOMP 사용
- 양방향 통신 및 실시간 데이터 전송 가능
- SSE
- 알림 기능 구현을 위한 Server-Sent Events 사용
- 실시간 데이터 일방적 전송 가능
- Redis
- AccessToken 재발급을 위한 RefreshToken 관리
- 메모리 기반 데이터베이스로 빠른 응답 속도 제공
- 캐시로 사용하여 반복적인 쿼리 성능 개선
- GitHub Actions
- CI/CD 자동화 도구
- AWS와 연동하여 배포 자동화
- 다양한 환경과 언어 지원
- AWS
- 안정적이고 확장 가능한 클라우드 인프라 제공
- 다양한 서비스로 애플리케이션 호스팅 및 데이터 보관 가능
- Kakao Open API
- 중고 책 검색을 위한 API 사용
- 국내 및 해외 도서 정보 제공
🗣️ 기술적 의사결정
- Repository 의존 + default Method 사용
- 코드 중복 최소화를 위해 Repository에 의존하되, default Method로 중복 제거
- WebSocket & STOMP 사용
- 채팅 기능 구현을 위해 양방향 통신을 제공하는 WebSocket 사용
- WebSocket 통신을 효율적으로 다루기 위해 STOMP 사용
- Redis Cache 사용
- 반복되는 쿼리 성능 개선을 위해 캐싱 사용
- Look-Aside 및 Write-Around 전략으로 캐시 구현
- 프런트 배포 방식 - 타임리프 & Ajax
- 서버 사이드 렌더링과 비동기 데이터 처리를 위해 타임리프와 Ajax 사용
- 백엔드와 프런트엔드를 함께 배포하여 모노리틱 아키텍처 유지
- 인증과 인가
- JWT를 사용한 토큰 기반 인증
- Refresh Token을 활용한 AccessToken 갱신
- 직접 구현한 인증 매커니즘으로 유연한 제어 가능
- QueryDSL 사용
- 동적인 쿼리 작성과 최적화를 위해 QueryDSL 사용
- 쿼리 최적화를 위해 스케줄러를 활용하여 채팅 기록 자동 삭제
🛠 트러블슈팅
- EC2 메모리 부족현상
- 스왑 메모리 설정으로 메모리 부족 문제 해결
- S3 이미지 리사이징
- 서버리스(Lambda) 대신 백엔드에서 이미지 처리를 선택
- 관리 용이성과 성능 향상을 위한 결정
- fetchJoin 사용시 페이징 처리 문제
- fetchJoin 후 페이징 처리 시 HHH000104 로그 발생
- 일반적인 SQL IN 절로 데이터 가져와 페이징 처리
- WebSocket 연결 시 Cross-Origin 문제
- 설정을 통해 Cross-Origin 문제 해결
- 보안 상의 이슈 고려하여 원천 차단
🚀 배포
- AWS CodeDeploy
- GitHub Actions과 AWS CodeDeploy 연동하여 배포 자동화
- 특정 브랜치에 푸시 시 테스트 및 배포 자동 진행
- 인프라 as Code (IaC)
- Terraform을 사용하여 인프라 자동화
- 인프라 수정이 필요할 때마다 수동으로 조정하지 않고 코드로 관리
⚙️ 백오피스
- 관리자 페이지
- 회원 관리 및 상품 관리
- 회원 신고 및 차단 관리
- 통계 및 분석 기능 제공
💡 기대효과
- 성능 향상
- Redis를 활용한 캐싱으로 반복적인 쿼리 성능 향상
- WebSocket과 SSE를 통한 실시간 데이터 처리
- 보안 강화
- JWT와 OAuth 2.0을 활용한 인증 및 인가 강화
- WebSocket 보안 강화를 통한 취약점 방지
- 사용자 경험 향상
- WebSocket과 STOMP를 활용한 실시간 채팅 기능 제공
- SSE를 활용한 실시간 알림 기능 제공
- 운영 효율성
- CI/CD 자동화를 통한 배포 시간 단축
- 인프라 자동화로 운영 및 유지보수 비용 절감
- 확장성 및 유연성
- AWS 클라우드 기반으로 확장 가능한 아키텍처 제공
- 코드 수정 없이 인프라 조정 가능한 IaC 활용