[DevLink] 개발자 멘토링 매칭 플랫폼ㅤ

5 more properties

배경(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 서버사이드 렌더링 오류