배경(Problem)
1. 요구사항
•
시니어 개발자
◦
시니어 개발자로서의 역량 증진
◦
공유 문화 참여 욕구
•
주니어 개발자
◦
전문성 부족을 가장 큰 고민으로 생각하는 주니어 개발자
2. 요구사항 발생의 이유
•
시니어 개발자
◦
공유 문화 참여의 장벽이 높음 (지역, 회사 등MZ 세대와의 소통 어려움
•
주니어 개발자
◦
시장 정보 부족
◦
멘토 섭외의 어려움
아키텍처 및 핵심 기능
Architecture
Micro Service
•
MSA 를 로컬 환경에서도 실행이 가능하면서, Kubernetes 에 배포할 수 있도록 하기 위해서 Profile 을 사용하여서 Properties 파일을 분리하여 구성하였고, 이를 통해 Local과 Kubernetes 환경에 따른 코드 변경을 없도록 구성하였습니다.
•
Kubernetes에서는 Ingress 리소스를 제공하지만, Ingress와 Spring Cloud Gateway 는 Path rewrite 및 L7 라우팅 등 비슷한 기능을 수행하고, 익숙한 언어인 Java를 사용해 Custom Filter 를 통해서 API Gateway에 JWT 인증 기능을 위임하기 위해서 Spring Cloud Gateway를 사용 하였습니다.
•
서비스 레지스트리 및 디스커버리는 로컬 환경에서는 Spring Cloud Eureka 를 사용할 수 있도록 하였으며, Kubernetes 환경에서는 Service 리소스를 사용할 수 있도록 구성하였습니다.
•
프로퍼티 파일 관리의 경우, 로컬 환경에서는 Spring Cloud Config 서버를 사용하도록 구성하였고, Kubernetes 환경에서는 ConfigMap과 Secret 리소스를 사용하도록 구성하였습니다.
•
서비스간 통신 Spring Cloud OpenFeign 라이브러리 사용하여 통신할 수 있도록 구성하였습니다.
Features
•
Auth / Profile / Post Service
◦
인증 서버에서는 사용자의 만료되거나 로그아웃한 토큰을 블랙 리스트로 관리하기 위한 목적으로 Redis를 사용하였습니다.
◦
이미지 저장이 필요한 Profile과 Post 서비스의 경우, 이미지 저장에 따른 서버의 부하를 줄이기 위해서 AWS S3 에 저장할 수 있도록 구성하였습니다.
•
Chat Service
◦
채팅 서비스는 실시간성이 가장 중요한 특징이기 때문에 웹소켓 통신을 통해서 구현 하였으며, 이를 위해서 STOMP 프로토콜을 사용하여 구성하였습니다.
◦
채팅 서비스의 경우 서버의 부하가 많을 것으로 예상되어 Auto Scaling이 필수적으로 적용되기 때문에, 서비스의 각 인스턴스에 생성되는 Message Broker 의 Topic들의 Sync를 맞춰주기 위해서 Kafka를 사용하여 구성하였습니다.
•
Mentoring / Notification Service
◦
이미지 저장이 필요한 Mentoring 서비스의 경우, 이미지 저장에 따른 서버의 부하를 줄이기 위해서 AWS S3 에 저장될 수 있도록 구성 하였습니다.
◦
멘토링 레코드 기록 추가 기능에서는 멘토링 음성 레코드를 사용자가 좀 더 간편하게 조회할 수 있게 하기 위해서, Naver Clova API를 사용하여 음성 파일을 텍스트로 변환하고, 요약본을 제공할 수 있도록 구성 하였습니다.
◦
멘토링 신청 / 수락 / 거절 등의 사용자의 행동은 알림으로 다른 사용자에게 전달되어 하지만, 반드시 실시간성이 보장되어야 하는 것은 아니기 때문에 Kafka를 사용하여 Async로 처리될 수 있도록 하였습니다.
•
Matching Service
◦
Matching 서비스는 외부 API 연동과 서비스간 통신이 주된 작업이고, 데이터베이스에 의존성이 없기 때문에 별도의 서비스로 분리하여 구성하였습니다.
◦
사용자가 Auto Matching 을 시도하면, 사용자의 기술스택, 지역 등의 프로필 정보와 Kakao 지도 API로 얻은 위, 경도 정보로 Kilometers 거리 알고리즘과 Profile Filtering 을 통해 가장 적합한 사용자와 자동 매칭이 되도록 구현 하였습니다.
◦
사용자가 Auto Matching 을 시도하면, 사용자의 기술스택, 지역 등의 프로필 정보와 Kakao 지도 API로 얻은 위, 경도 정보로 Kilometers 거리 알고리즘과 Profile Filtering 을 통해 가장 적합한 사용자와 자동 매칭이 되도록 구현 하였습니다.
트러블 슈팅
1.
ALB, NLB, CLB 종류에 따른 웹소켓 통신 문제
•
기존 CLB 사용으로 웹소켓 통신이 되지 않던 문제를 NLB로 변경하여 해결
2.
Next.js 서버사이드 렌더링 오류