미리보기
기본 정보
우아한 테크 코스 5기에서 백엔드 과정을 수료하였습니다. 해당 과정에서 행록 프로젝트를 진행하며 패키지간 의존성 분리, 여행 조회 및 경비 조회의 쿼리 성능 개선 등을 담당하였습니다. 또한 서버 분리 및 로드 밸런싱을 통해 불필요한 서버 자원을 정리하고 효율적으로 scale out한 경험이 있습니다. 마피아 투게더 프로젝트를 진행하면서 애그리거트 정의 및 패키지 의존성 분리, Redis를 통한 Repository 구현, CI/CD 구축을 담당하였습니다.
기술 스택
Java, Spring, Spring Boot, aws-ec2, grafana, Prometheus, MySQL, Jenkins, Redis
프로젝트
마피아 투게더
개인
2024.04. ~ 진행 중
About
웹을 통해 실시간으로 온라인 마피아 게임을 즐길수 있는 서비스입니다.
로그인이나 어플 설치 없이 실시간으로 게임을 즐길 수 있습니다.
개발 인원 : 6 ( BE : 3, FE : 1, DESIGN : 2
2024.4 ~ 2024.5 ( MVP 개발 ), 2024.5 ~
BE : 3, FE : 1, Design : 2
Java, Spring Boot, Nginx, Docker, AWS EC2, Redis, Jenkins, Github Action
SiteLink : https://mafia-together.com
Github : https://github.com/mafia-together/
기능 구현
채팅 조회 및 전송 기능 구현
투표기능 구현
플레이어 직업 구현
투표 조기 종료 기능 구현
상태 변경 로직 설계 및 구현
방 상태 확인 API 구현
어그리거트 분리 및 패키지 분리
[문제 상황]
Room이 모든 객체에 의존성을 가지고 있어 유지 보수성에 문제가 발생
[해결]
분리한 패키지에서 서로 강한 의존성을 가지고 있음
양방향 의존과 직접 객체를 참조하여 강한 의존성을 가지고 있다고 판단
패키지 간 참조를 간접 참조로 바꾸어 의존성을 약화 시킴
논리적으로 의존이 필요한 경우 event를 발행하여 양방향 의존을 해결패키지간 의존성 분리
Redis 도입
[문제 상황]
게임의 데이터가 Spring 서버에 위치하고 있어 SPOF에 취약하고
Scale out, 무중단 배포시 문제가 있을 것으로 예상
유저가 많아질 수록 많은 메모리가 필요하게 될 것인데 스프링과 같이 관리할 경우 메모리 부족
게임 데이터를 JVM으로 관리하고 있는 것이 원인이라 판단
[해결]
Redis를 도입, Game, Room, Chat, Vote, Job의 저장소를 구현
인프라
[CI/CD]
Jenkins, Github Action, Github, Docker Hub를 활용하여 파이프라인 작성
행록 - 위치기반 여행 기록 서비스
우아한테크코스
2023.06. ~ 2023.11.
About
여행에서 느꼇던 설렘과 추억을 장소 기반으로 기록할 수 있도록 도와주는 서비스 입니다
여행의 흐름과 경비, 사진 메모 등을 한눈에 확인할 수 있습니다.
원한다면 나의 여행을 링크, 커뮤니티 등을 통해 타인과 공유할 수 있습니다.
2023.07 ~2023.11
BE : 5, FE : 3
Java, Spring Boot, Spring Data JPA, Rest Assured, Nginx, Docker, AWS EC2, Grafana, K6, Oauth2.0, JWT, MySQL, Jenkins, Github Action
SiteLink : https://hanglog.com
Github : https://github.com/woowacourse-teams/2023-hang-log
기능 구현
소셜 로그인
사용자 단일 여행 경비 조회
공공 환율 api 조회 및 저장
공유 상태 수정
커뮤니티 전체 여행 조회 기능 구현
커뮤니티 단일 여행 조회
커뮤니티 단일 여행 경비 조회
패키지간 의존성 분리
[문제 상황]
엔티티간 의존성이 높아 분리할 필요성을 느낌
[해결]
타 패키지의 엔티티간의 참조가 있을 경우 id를 참조하게 하여 간접 참조로 분리
로직적으로 분리가 불가능할 경우 event 발행
TPS(Transtaion Per Second) 성능 개선
[문제 상황]
API요청 별 중복되거나 불필요한 쿼리 발생
[해결 방안]
JPA N+1 문제
단일 여행 조회 쿼리를 Fetch Join으로 수정하여 요청당 6회에서 3의로 개선
Static한 고정값 조회
경비 조회의 특정 고정값들을 메모리에 Static하게 관리하여 요청당 6회에서 4회로 개선
서버 분리 및 로드 밸런싱
[문제 상황]
각 EC2의 서버 용량이 불필요하게 큼
단일 운영서버로 인해 단일 장애점이 발생시 대체가 불가능하다는 점을 인식
무중단 배포를 위해 운영서버를 확보하기로 함
[해결]
단일 장애점(SPOF)를 피하기 위하여 Nginx를 통해 운영서버를 스케일 아웃
기존 prod, dev의 t2.small 서버 → micro 서버 pord1, prod2, dev, LB 서버로 스케일 아웃
인프라
[서버 모니터링 구축]
Grafana, Prometheus, Loki 등을 통해 서버 모니터링 구축
[부하 테스트]
K6를 통한 부하 테스트 진행
Tomcat과 HikariCP 최적화 진행