프로젝트 - FilMeet

·Filmeet
개요24.11.12 ~ 24.12.19 동안 LG U+ 유레카에서 Filmeet이라는 영화 리뷰와 소셜 플랫폼 프로젝트를 진행했습니다.15일까지 프로젝트를 진행했고 16 ~ 18일 동안은 팀원들과 프로젝트 API에 대한 부하 테스트를 진행하고 성능 개선 작업을 진행했습니다. 이번 글에서는 성능 테스트 진행 과정에 대한 내용을 이야기하려 합니다.성능 테스트는 어떤 상황에서 왜 하는가?성능 테스트가 필요한 상황요청이 많아지면 서버 부하가 증가합니다. 서버의 자원은 무한하지 않아 많은 요청을 처리하기 위해서는 많은 서버가 필요합니다. 사용자들이 많아졌을 때 사용자들이 발생시키는 트래픽을 감당하기 위해서는 얼마나 많은 서버가 있어야 할지에 대한 고민이 필요합니다. 무턱대고 서버를 필요 이상으로 많이 투입하는 건..
·Filmeet
현재 진행하고 있는 프로젝트인 Filmeet에서 사용자 개인에 맞는 영화를 추천하는 기능을 맡았습니다.이번 글에서는 이러한 추천 기능을 구현하면서 어떤식으로 로직을 짜고 구현을 했는지에 대해 이야기 하려 합니다.목표추천 기능을 구현하기 위해 자료를 검색하던 중, 넷플릭스의 영화 추천 알고리즘에 대한 자료를 접하게 되었습니다.해당 자료에 따르면, 넷플릭스는 4개의 주요 추천 알고리즘을 활용한다고 합니다:유사 사용자 기반 알고리즘유사 아이템 기반 알고리즘잠재 모델 기반 알고리즘콘텐츠 기반 알고리즘넷플릭스는 이 4개의 알고리즘을 포함한 여러 알고리즘을 조합해 하이브리드 추천 시스템을 구현했다고 합니다.(출처: 브런치 자료) 이 자료를 참고하며 저 역시 2개의 추천 알고리즘을 결합한 하이브리드 추천 시스템을 설..
·Filmeet
개요이번 글에서는 Filmeet 프로젝트에 적용한 redis 분산 락에 대해 글을 작성하려 합니다. 아래는 Movie 엔티티입니다.현재 Filmeet 프로젝트에서는 영화 조회 API가 다양하게 사용되고 있으며, 영화 정보를 조회할 때 좋아요 수, 평균 평점 등의 데이터가 함께 필요한 경우가 많습니다. 하지만, 영화 데이터를 조회할 때마다 매번 해당 영화의 전체 좋아요 수와 평균 평점을 계산하는 쿼리가 발생한다면, DB 부하가 커질 수 있다고 판단했습니다. 이를 해결하기 위해, Movie 엔티티에 좋아요 수, 평점 수, 평균 평점 필드를 추가하는 방식으로 반정규화를 진행했습니다. 이를 통해 조회 성능을 향상하고, 불필요한 쿼리 호출을 최소화하여 시스템의 효율성을 높이고자 했습니다.@Getter@Entity..

프로젝트 - KidsPing

·Kidsping
Overview이번 글에서는 키즈핑 프로젝트에서 선착순 응모 시스템을 개발하는 과정에서 겪었던 다양한 이슈와, 이를 어떻게 해결해 나갔는지에 대해 이야기하려고 합니다.선착순 응모 시스템 요구사항 및 목표주어진 요구사항은 다음과 같습니다.회원은 응모 페이지에 접속 후 이름, 전화번호를 입력 후 선착순 100명 이벤트에 응모한다.사용자는 중복 응모를 못한다.다음날 오후 1시에 응모 페이지에서 이벤트 당첨 여부를 확인한다.응모 페이지는 매일 오후 1시에 가장 많은 트래픽을 받는다. (1분에 10만 요청을 10분간)이러한 요구사항을 분석하여 쿠폰 100개 발급을 보장하고, 높은 트래픽을 견디는 시스템 구축을 목표로 삼았습니다. 초기 응모 시스템의 흐름은 쿠폰 요청을 받으면, DB에서 현재 쿠폰 개수를 조회한 뒤..
·Kidsping
OverviewAWS 프리 티어 계정을 사용해 EC2로 키즈핑 프로젝트를 배포했습니다. 배포 과정에서 Docker를 활용하였으며, docker-compose.yml 파일을 통해 기본 Docker 네트워크에서 Spring Boot, MySQL, Redis를 각각 컨테이너로 구성하여 배포 환경을 구축했습니다.배포 초기에는 Spring Boot와 MySQL만 컨테이너로 구성된 상태에서 Docker를 실행했습니다. 그러나 Docker가 실행된 후 ssh로 EC2에 접속한 터미널이 갑자기 작동하지 않는 문제가 발생했습니다. 다른 터미널을 통해 재접속을 시도했지만, 접속 과정에서 터미널이 중단되어 접속할 수 없었습니다.결국, 기존 EC2 인스턴스를 삭제하고 새 EC2 인스턴스를 생성하여 다시 배포를 진행했습니다.이..
·Kidsping
Overview자녀가 좋아요 한 책을 조회하는 API를 개발하던 중, Postman으로 API를 테스트하면서 콘솔에 출력된 쿼리를 확인했습니다. 그런데, 여러 번의 SELECT 문이 반복적으로 실행되는 N+1 문제가 발생하는 것을 발견했습니다. 이번 글에서는 이 N+1 문제의 원인과 해결 방법에 대해 정리해보겠습니다.N+1 문제란?연관 관계가 설정된 엔티티를 조회할 경우에 조회된 데이터 개수(n) 만큼 연관관계의 조회 쿼리가 추가로 발생하여 데이터를 읽어오는 현상 아래 코드는 N + 1 문제를 겪었던 상황에 대한 코드입니다.테스트 코드를 통해 N+1 문제를 다시 발생시켜 보겠습니다.문제 상황DB우선, DB에 자녀가 좋아요를 누른 책 15개를 저장했습니다. 그리고 이 데이터 기반으로 자녀가 좋아요 한 책을..

프로젝트 - FitTrip

·FitTrip
FitTrip 프로젝트는 MSA 구조에서 EDA를 적용한 프로젝트입니다.즉 서비스가 여러 개로 나눠진 분산 시스템 구조입니다.이러한 분산 시스템 구조에서는 데이터의 일관성을 확보하기가 상대적으로 어렵습니다.발행되지 않아야 하는 메시지가 발행되거나, 발행되어야 하는 메시지가 발행되지 않고 누락되기도 합니다. 이번 글에서는 간단한 예시와 함께, 흔히 볼 수 있는 메시지 발행, 처리 방식들의 문제점들을 짚어보려고 합니다.또한 이 문제점들을 해결하는 방법 중 하나인 Transactional Outbox Pattern을 소개하고 FitTrip 프로젝트에 적용한 과정에 대해 얘기하려 합니다. 분산 시스템에서 데이터를 전달하는 방법은 아래 글을 참고해주시면 감사하겠습니다.https://an-jjin.tistory.c..
·FitTrip
이번 글에서는 분산 시스템 환경에서 데이터 전달에 대한 방법이나 문제 그리고 다음 글에서는 프로젝트에 어떻게 적용 했는지에 대해 적어보려 합니다.분산 시스템이란?목표를 달성하기 위해 여러 개의 컴퓨터 리소스를 사용하는 시스템시스템은 두 개 이상의 컴포넌트로 구성되어 있다.엔터프라이즈 애플리케이션마이크로 서비스 아키텍처 애플리케이션모놀리식 아키텍처 애플리케이션 + 검색엔진네트워크를 사용하여 컴포넌트 간의 기능을 통합분산 시스템은 네트워크를 사용하여 데이터를 전달하는 것이 특징이다.네트워크를 통해 데이터를 전달하는 방법네트워크를 통해 데이터를 전달하는 방법은 크게 아래 2가지 방식이 존재한다.Remote API(rest-api, GRPC 등)MessageQueueRemote API를 사용한 데이터 전달서버-..
·FitTrip
서론저희 팀은 기술적인 도전으로 MSA 아키텍처를 도입하기로 했습니다.MSA의 장점으로는 서비스에 대한 scale out이 용이하다입니다.그렇다면 MSA 도입 시 채팅 서비스도 scale out이 용이할까요?채팅 서비스는 일반적인 HTTP 통신을 사용하는 stateless 서비스와 달리, 웹소켓을 사용해 클라이언트와 연결된 stateful한 특성 때문에 scale out이 쉽지 않았습니다. 이번 글에서는 MSA 아키텍처 내 scale out이 용이하지 않은 채팅 서비스에 대한 문제를 해결하는 과정을 적어보겠습니다.채팅 서비스 scalue out시 문제점왜 stateful 한다면 scalue out이 용이하지 않을까요? 하나의 채팅 서비스에 두 명의 유저가 웹소켓으로 연결되어 있고1번 유저와 2번 유저 둘..

회고

·회고
개요새해 목표를 세우기 전에, 지난해를 돌아보면 더 나은 목표를 설정할 수 있을 것 같아 회고 글을 작성하게 되었다.이 글에서 초록색으로 표시된 부분은 링크가 포함된 곳이다. 궁금하다면 직접 들어가서 읽어보는 것을 추천한다. 회고는 크게 개발과 인생 두 부분으로 나누어 이야기해보려 한다.개발취업내 성격상 진행하는 일에 완벽함을 추구하다 보니, 항상 내가 하는 일이 부족해 보였다.프로젝트, CS 지식, 코딩 테스트(코테는 왕창 부족) 모두 마찬가지였다.이런 생각 때문에 "어차피 떨어질 텐데 굳이 지원할 필요가 있을까?"라는 마음에 지원 자체를 꺼리기도 했다.그러던 중, 지인 한 명이 "이력서 쓰는 것도 스킬이야. 여러 번 해봐야 실력이 늘어."라는 조언을 해주었다.그 말을 듣고 9월부터는 활발하게 이력서를..
·회고
개요7개월간 진행했던 유레카 SW 교육과정에 대한 회고 및 후기를 작성해보려고 한다.유레카란?미래의 IT인재를 발굴하고 육성하기 위해 LG 유플러스가 준비한 교육 과정지원 일정서류 접수 : 2024.5.3(금요일) ~ 2024.5.19(일요일)적성 진단 평가(코딩 테스트) : 2024.5.23(목요일)면접 : 2024.5.30 ~ 2024.5.31(목요일, 금요일)최종 발표 : 2024.6.3(월요일)오리엔테이션 : 2024.6.7(금요일)상세 내용우선 유레카 교육에 지원한 이유는 총 3가지 였다.유레카 교육 커리큘럼을 따라가면서 기존의 내가 배웠던 내용들을 복습하고 정리하기수료혜택(수료만 해도 서류, 코테 면제)이력서에 넣을 프로젝트위 3가지 이유로 유레카를 지원했다.서류 접수지원 당시, 서류 접수에서..
·FitTrip
이 글은 3월 1일부터 시작하여 6월 20일에 마무리한 캡스톤 프로젝트 FitTrip에 대한 회고 글입니다. FitTrip이란? 캡스톤 프로젝트 팀명을 의미합니다.프로젝트 취지현대 사회에서 건강과 체력에 대한 관심이 지속적으로 증가함에 따라 헬스 중심의 커뮤니티 플랫폼을 제작하여 헬스와 운동에 진심인 사람들의 소통과 성장을 돕는 공간을 만들고자 기획하게 되었습니다. 3월 프로젝트 시작3월에는 그라운드 룰, 프로젝트 주제, 아키텍처, 구현 기능 목록 정리, ERD 설계, API 설계 등등 구현보다는 팀 규칙과 설계와 관련해서 팀원들과 많은 얘기를 나눴습니다.위 이야기들을 전부 다 얘기하면 회고가 끝나지 않을 거 같아 회고 글 이후 따로 관련 글을 작성하려 합니다.주제프로젝트 주제를 선정함에 있어 여러 많은..
an_jjin
An Devlog