위치 기반 음악 공유 사이트
출근을 할 때, 친구들과 함께, 매번 어디론가 가고 머무는 ‘나’의 일상, 다들 음악과 함께 하고 계시지 않으신가요? 내가 추억하는 공간과 그 때의 플레이리스트를 모두와 함께 공유해보아요 🗣️🎧
특별한 장소로 여행을 가거나, 일상 속에서 들었던 노래들을 플레이리스트로 만들어 다양한 사람들과 공유할 수 있는 커뮤니티 서비스입니다.
- 2023.07.29 ~ 2023.09.08
![]() |
||
| 김은비 | 김정우 | 정소희 |
![]() |
||
| 유현주 | 최도영 | 이성목 |
|
| 오혜성 |
📌 장소에 따른 게시물 리스트
- GPS 기능을 통해 현재 내 위치 주변이나 특정 장소를 검색하여 그 주변의 작성된 게시물을 확인할 수 있습니다.
![]() |
![]() |
- GPS 기능을 통해 현재 내 위치 주변이나 특정 장소를 검색하여 그 주변의 작성된 게시물을 확인할 수 있습니다.
📌 프로필 페이지
- 내 프로필과 회원 정보를 수정할 수 있고, 내 포스팅, 팔로워, 댓글 등을 한 눈에 보고 관리할 수 있습니다.
- 다른 사람의 프로필의 경우 포스팅, 팔로워를 확인할 수 있습니다.
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
📌 검색 기능
- 추천 포스팅, 인기 플레이스, 카테고리 별 인기 있는 노래, 인기 검색어를 확인할 수 있습니다.
- 검색어를 입력하여 관련된 포스팅, 플레이스, 음악, 피플러를 찾아볼 수 있습니다.
![]() |
![]() |
![]() |
Issue1. RefreshToken으로 AccessToken 재발급시 RT 탈취 위험 이슈
문제:
- RefreshToken을 AccessToken과 함께 보내 만료 시 자동으로 AccessToken을 재발급 하게 하였지만, RefreshToken의 탈취 위험에 대한 문제점 발생
시도:
- AT만료 시 RT로 AT룰 재발급하고 RT 또한 같이 재발급 방법을 시도
- 요청 시에는 AT만 요청 후 AT가 만료 시 만료 응답을 먼저 보내고 RT를 받아 새롭게 AT를 재발급 해주는 방식으로 변경 - RT만료시 로그아웃이 되는 방법을 시도
해결:
- 로그인 시에 AT, RT를 함께 발급하고 요청 시에는 AT만 요청 후 AT가 만료 시 만료 응답을 먼저 보내고 RT를 받아 새롭게 AT를 재발급하게 하고 기존의 RT 만료 시 로그아웃이 되게 구현하는 방식만 채택
Issue2. Spotify API를 이용한 노래 검색 시 검색 제한 오류 발생 이슈
문제:
- 노래 검색 테스트 시 검색 제한으로 인해 많은 요청을 보낼 시 “API rate limit exceeded” 에러 메시지와 함께 API 응답의 대기 시간 발생.
시도:
- 검색어에 대한 결과에 대해 캐싱 읽기 전략 Look Aside 패턴을 적용.
- 429 에러 응답 시 일정 시간이 지난 후 재시도.
해결:
- 캐싱 읽기 전략 Look Aside 패턴을 적용하면서 한번에 더 많은 값을 받아올 수 있도록 10개에서 30개로 변경.
Issue3. 게시글 조회, 좋아요 동시성 제어
문제:
- 기존 게시글 조회 로직으로 JMeter 테스트 결과 1000개의 스레드 요청에 평균적으로 102개의 요청만 정상적으로 들어오고 898개의 요청은 유실
시도:
- JPA 트랜잭션 내에서 읽기 → 쓰기 → 변경 감지의 순서로 흘러가는데 여러 트랜잭션이 동시에 읽기를 하고 쓰기 때문에 유실
해결:
- 비관적락 베타락 설정으로 1000개의 요청 정상적으로 들어왔으나 성능은 저하
- 기존 로직은 1000개의 요청 8초, 변경 후 14초로 증가
Issue4. 게시글 조회수 어뷰징
문제:
- 기본 로직은 회원, 비회원 상관없이 브라우저를 새로고침하면 무한으로 조회수가 증가하는 문제 발생
시도:
- 1차적으로 cookie를 사용하는 로직으로 변경하였으나, 도메인당 생성 할 수 있는 개수가 제한이 있고, cookie값이 커질 경우 네트워크 트래픽에 부담을 주고, 고의적으로 cookie를 삭제 할 수 있는 문제점이 존재
해결:
- 2차적으로 비회원은 접속한 Client IP, 게시글 ID를 회원은 유저 ID, 게시글 ID를 Redis에 저장하고 만료 시간은 밤12시 기준으로 설정하는 로직으로 변경
- IP 또한 고의적으로 변경 할 수 있다는 문제점이 존재하나 어뷰징 유저가 조작하기에 cookie 방식보다 어렵다고 판단해 적용
Issue1. AWS EC2 인스턴스 멈춤 현상
문제:
- 서버가 배포 되고 특정시간이 지나거나, spring boot 서버가 2개 이상 돌아가면 인스턴스가 멈추고 접속 안되는 현상 발생
시도:
- 인스턴스 모니터링 결과 CPU 사용률이 급격하게 올라가고, 시스템 로그에서 Out of memory: kill process 발생해 메모리 부족으로 확인
해결:
- 하드 디스크 공간 일부를 메모리로 대체하여 사용 할 수 있게 인스턴스에 Swap Memory 2GB 를 설정 하여 해결
Issue2. 이미지 업로드 에러
문제:
- 이미지 업로드시 5MB 크기 제한을 설정했지만 1MB 초과 해도 오류 발생
- application.properties 내에서는 정상적으로 설정, 실제 배포 서버에서만 오류 발생
시도:
- 배포 서버에서는 Nginx로 reverse proxy 구성하면서 Nginx에서 기본으로 1MB 제한
해결:
- nginx.conf 내에서 client_max_body_size 설정 후 해결
Issue3. Redis 쓰기 에러
문제:
- Redis는 persistent를 유지하기 위해서 주기적으로 BGSAVE로 RDB 파일을 저장, 이 과정에서 메모리가 부족하여 RDB 파일을 작성하다 실패하면 모든 쓰기 요청이 막혀 데이터 쓰기가 불가능
시도:
- 프로젝트에서 Redis를 단순 캐시용도로 사용하고 있기 때문에 bgsave 에러가 났을 때 멈추는 설정 off
해결:
- redis.conf 파일 내 SNAPSHOTTING 부분에 stop-writes-on-bgsave-error 부분이 기본 설정 yes에서 no로 변경
Issue4. 데이터 반환값 시간 문제
문제:
- EC2 인스턴스 서버 시간이 UTC 타임존으로 설정 돼있어 데이터 반환값들 시간이 9시간 차이 나는 문제 발생
시도:
- RDS MySQL 타임존을 변경하였으나 여전히 문제 발생
해결:
- sudo dpkg-reconfigure tzdata 명령어를 통해 서버 타임존을 KST로 변경
Issue5. Cloud Front 실시간 반영 안되는 문제
문제:
- S3에 업로드 된 수정 사항들이 배포에 실시간으로 반영 안되는 문제 발생
- 기본적으로 Cloud Front 캐시 정책은 각 파일을 24시간 후에 자동으로 만료
시도:
- 공식 배포 전까지 캐시 정책 CachingDisabled 설정
해결:
- 캐시 정책 시간 이전에 강제로 CloudFront의 배포 내용을 업데이트 하고 싶다면 무효화 생성해 적용 or 캐시 정책을 만들어 원하는 TTL 설정
























