- 프로젝트 기간: 2024.07.17 ~ 2024.08.20
- 프로젝트 설명:
- Slack, Notion, Excel 등을 통한 복잡한 자료 제공 경로를 단순화하고, 공지 및 소통을 간편하게 관리하는 웹 애플리케이션 개발
- 실시간 채팅 및 공지 시스템을 통해 사용자 간 원활한 소통을 지원하는 서비스입니다.

| 역할 | 이름 | 담당 기능 |
|---|---|---|
| 리더 | 함승완 | 회원관련 기능, 프론트엔드 세팅 |
| 부리더 | 박다미 | 시큐리티 설정, 팀 프로젝트 관리, 채팅, 배포 |
| 팀원 | 박강현 | 게시글, 공지사항, 배포, 프론트엔드 |
| 팀원 | 김창민 | 트랙, 카카오 로그인 |
| 팀원 | 김현민 | 기수, 회원가입 승인, 이메일 인증 |
- WebSocket 기반 실시간 채팅 기능 구현
- JWT 인증 및 사용자 관리 시스템 개발
- RabbitMQ 비동기 메시징 처리 구현
- Docker 및 AWS EC2를 활용한 배포 경험
- Jira를 활용한 프로젝트 플래닝 및 GitHub 이슈 관리
- 문제점: Spring 서버와 RabbitMQ 간 통신 오류 발생
- 원인 분석:
- 초기 설정에서 각 컨테이너가 개별 네트워크에서 실행됨
localhost를 사용하여 RabbitMQ에 접근하려 했으나 컨테이너 간 네트워크 격리로 인해 실패
- 해결책:
- Docker Compose를 사용하여 Spring 서버와 RabbitMQ를 동일 네트워크에 배치
rabbitmq컨테이너의 고정 네트워크 이름으로 통신
- 문제점 1: 높은 동시 접속 시 성능 저하
- 원인 분석: WebSocket 요청이 단일 스레드에서 처리되어 병목 발생
- 해결책: 멀티스레드 적용하여 동시 요청 처리 최적화
- 문제점 2: 과도한 스레드 생성으로 인한 리소스 낭비
- 원인 분석: 스레드 개수가 무제한으로 증가하여 서버 리소스 소모
- 해결책: 스레드 풀(Thread Pool) 적용 해서 최적화
📚 관련 문서: WebSocket 성능 비교 및 최적화
- 문제점: 메시지 소비 실패 시 DLQ(Dead Letter Queue)로 메시지가 이동, 지속적인 누적 발생
- 원인 분석:
- Consumer가 메시지 처리를 실패하면 메시지가 DLQ로 전송되면서 백로그가 쌓임
- 특정 Consumer가 지속적으로 실패할 경우 시스템의 메시지 처리 속도 저하
- 해결책:
- 서킷 브레이커 적용 으로 일시적인 장애 시 점진적 복구 시도
- Slack 알림 시스템 연동하여 개발자가 실시간으로 장애를 인지하고 조치 가능
📚 관련 문서: RabbitMQ DLQ 및 서킷 브레이커 전략
- 문제점: WebSocket 연결이 배포 환경에서 실패
- 원인 분석:
- 로컬 개발 환경에서는
ws://localhost:8080을 사용하여 정상 작동 - 배포 환경에서는 도메인을 사용하여 접근해야 하지만 설정이 미흡하여 WebSocket 연결 실패
- 로컬 개발 환경에서는
- 해결책:
- Nginx 리버스 프록시 설정을 통해 WebSocket 요청을 올바르게 라우팅
nginx.conf에서 WebSocket 업그레이드 헤더 설정 추가- 클라이언트에서
wss://{도메인}/chat으로 접속하도록 수정
- 문제점: JWT 토큰이 만료되면 사용자 세션이 종료됨
- 원인 분석:
- JWT는 기본적으로 세션을 유지하지 않으므로, 토큰이 만료되면 재로그인이 필요
- 사용자 경험을 고려할 때, 자동 갱신 기능이 필요함
- 해결책:
- Refresh Token 적용하여 액세스 토큰 만료 시 자동 재발급
- Redis를 활용한 세션 캐싱으로 사용자 인증 요청 속도 개선
- Spring Security와 JWT 필터 체인 적용하여 인증 및 인가 로직 개선

