Github : https://github.com/JJong0416/funMeet
Server : www.funmmet.shop
Docs : https://jjongdev.notion.site/FunMeet-Docs-c4cb032923504a0f8b07de84fbb94c4d
FunMeet은 지역과 취미를 수집해 관심 있는 사람들끼리 모임을 즐길 수 있도록 하는 플랫폼입니다.
서비스를 이용하는 어떤 누구도 모임(Club)을 만들 수 있으며, 모임 안에서 만남(Meeting)을 주선할 수 있습니다. 또한, 설정된 지역 정보와 취미를 가진 모임을 홍보해주는 것뿐만 아니라, 서로 만남을 주선할 수 있도록 해주는 웹 애플리케이션 서비스입니다.
인프라에서부터 백엔드 서버까지 설계를 진행했으며, 전반적인 서버 개발과 인프라 설정을 집중적으로 진행했습니다.
- 프로젝트 설계를 하며 패키지 전략을 레이어 우선으로 할 지, 모듈 우선으로 할 지 고민.
- 모듈 우선 패키지 전략으로 개발했을 때 순환참조 발생 및 중복코드 이슈 발생.
- 이슈를 테스트 코드로 잡아주고, 모듈 단위로 기능을 이식할 수 있도록 설계 후 제작.
- 세션방식의 로그인 방식 & Oauth2.0을 이용한 소셜 로그인
- 인터셉터를 통해 상태변화 후, 모임 홍보 및 알림 서비스 비동기 처리
- 동시성을 고려한 모임 가입 및 선착순 방식
- 프로젝트를 진행하면서, 테스트코드가 증가하고, 빌드&실행 시간이 점점 늘어나게 됨.
- 그 중 하나가 네트워크나 DB 연결 등 외부의 요인의 영향을 많이 받는 것을 확인.
- 먼저, TDD 강의와 코드리뷰를 받으며 올바른 테스트코드 작성방법을 학습
- 대부분의 테스트코드에 Mockito를 적용
- Mockito를 통해 개발자가 객체의 행동을 정해줄 수 있으며, 유연한 테스트코드를 작성
- Mockito를 적용하면서, 최소 25%, 최대 35%까지 성능을 향상.
- 리팩토링과 확장을 진행하면서, 필요한 부분 이외에 많은 다른 부분에서 변경이 발생
- 이를 보완해주기 위해 올바른 설계 방식을 공부할 필요를 느꼈고, 디자인 패턴을 공부
- 이메일 서비스에 클라이언트가 전략을 생성해 전략을 주입해주는 전략패턴을 적용
- 전략패턴의 경우, 의존성을 반대로 가질 수 있기 때문에 카카오 이메일 서비스 등 생기게 되면 코드의 변화가 극적으로 줄어듬.
- 책임(Layer)을 분리함으로써, 컴포넌트들의 서로의 의존 계층 관계를 깔끔하게 유지할 수 있다.
- AOP를 통해 성능을 분석하던 도중, 특정 메소드에 예상보다 많은 질의문이 발생하는 것을 포착
- 문제를 확인해보니, 연관관계에 있어 예상치 못한 엔티티를 추가적으로 불러오는 부분 발견.
- 설계 당시, 발견하지 못했던 부분이며 엔티티 설계방법에 있어서는 문제가 없다는 결론 도출
- Fetch Join을 통해 최적화 쿼리를 작성하였고, EntityGraph를 통해 최대 50%까지 성능 개선
- Spring Data JPA를 사용중,
org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags
에러 발생 OneToMany
,ManyToMany
관계에서 한 엔티티가 두 개 이상의 엔티티를 패치 조인을 했을 경우, 발생하는 에러라는 것을 파악- 결론적으로 BagType을 동시에 패치 조인을 했을 때 발생하는 예외
- Bag(Multiset)은 Set과 같이 순서가 없고, List와 같이 중복을 허용하는 자료구조인 걸 확인.
- 순서와 상관이 없는 필드였기 때문에, List에서 Set으로 변경하면서 문제 해결