이제 거의 실전 프로젝트가 마무리되어간다. 저번엔 Redis를 활용하여 수강신청의 성능을 개선해 봤는데, 이번에는 ORM에서 자주 발생하는 N+1 문제를 개선하였다. 문제가 발생하는 부분을 확인하고, 개선하는 작업을 진행하였다. ✔️ N+1 문제 발생우리 프로젝트에서 N+1이 발생한 부분은 장바구니 페이지를 조회할 때 발생했다. 페이지 조회 시, 과목 정보에 대한 쿼리가 여러 번 요청되는 것을 확인하였다. 💬 원인 분석장바구니 페이지에서 N+1 문제가 발생하는 원인을 찾아보자. RegisteredSubjectRepository에서, findAllByStudentId() 메서드로 학생이 장바구니에 담은 과목들의 정보를 Spring Data JPA의 쿼리메서드로 불러오도록 되어있다. [ Register..
항해99 개발일지
실전 프로젝트 4주 차에 돌입하며, Redis를 활용해 성능 개선을 진행했다. 이전에 동시성 문제를 비관적 락으로 해결했는데, 응답 속도를 개선할 수 있는 방법이 없을지 찾아보다가 빠른 I/O가 장점인 Redis를 활용한 개선을 해보면 어떨까 하는 생각에 적용하게 되었다. Redis 도입 이유 우리 프로젝트는 '수강신청'이다. 과목마다 수강신청이 가능한 인원은 제한적이다. 100명의 제한 인원이 이미 모두 신청해서 잔여석이 0명 일 때 에는 '수강신청 가능 인원이 마감되었습니다.' 라는 응답을 보내준다. 이 응답을 굳이 비즈니스 로직으로 들어와서 MySQL에서 남은 잔여석을 확인하지 않고, Redis를 활용하여 남은 수강인원이 0명일 경우에 바로 응답을 보내 주도록 하면 응답 속도를 개선할 수 있을 것이..
항해99 실전 프로젝트 3주차를 진행하며 발생한 동시성 문제 및 해결 과정을 작성해보려고 한다. 우리팀의 프로젝트 주제는 '수강신청' 이다. 많은 트래픽이 몰리는 상황에서 수강신청 시 발생할 수 있는 동시성 문제에 관한 글이다. ✔️ 수강신청 동시성 문제 발생 우리 프로젝트에서 동시성 문제는 모두 동시에 요청할 수 있는 '수강신청' 부분에서 발생하였다. Jmeter를 통해 테스트를 진행하여, 동시성 문제가 발생하는 것을 확인했다. 우리 프로젝트는 '수강신청' 전에 해당 강의를 장바구니에 담아두어야 한다. 그래서 테스트를 위한 회원 정보 및 장바구니 정보는 미리 담아둔 상태에서 수강신청에 대한 테스트를 진행했다. 💡 설정 조건 MySQL 데이터 수강 신청 테스트를 위한 로컬 MySQL에 데이터 설정을 했다..
실전 프로젝트 2주 차를 진행 중이다. 실전 프로젝트 최종 발표는 5월 7일이다. 한 달 남짓 남은 시점에서 어떤 것이 진행됐는지, 추후 어떤 걸 진행할 것 인지 정리해보려고 한다. ✔️ 기술 선택 이유 정리 CI/CD - Github Actions vs Jenkins Jenkins와 비교하면 Github Actions는 별도의 CI 서버가 필요 없다. Github의 호스팅 서버를 이용하여 프로젝트 빌드가 이뤄진다. 별도의 CI 서버를 관리하는 부담이 줄어드는 장점이 있다. 또한 사용 중인 Github에서 사용할 수 있는 접근성의 장점이 존재하여 Github Actions로 진행하게 되었다. 모니터링 - Prometheus + Grafana Spring boot 프로젝트의 actuator 를 활성화하여 ..
3월 26일 항해99 실전 프로젝트가 시작됐다. 벌써 시간이 이렇게 지난 게 놀랍다... 나는 서비스팀과, 대용량 트래픽을 경험할 수 있는 챌린팀 사이에서 많은 고민 끝에 챌린지팀을 선택하게 되었다. 쉽진 않을 것 같았지만 새로운 경험을 바탕으로 개발에 대한 시야를 넓히기 위해 선택하게 됐다! 앞으로 어떤 방향으로 프로젝트를 진행하면 좋을지, 생각을 정리하는 느낌으로 글을 작성해 본다. 주제 선정 우리 팀의 주제는 대규모 트래픽이 몰릴 상황을 대비한 '수강 신청' 서비스를 진행하기로 했다. 대규모 트래픽을 가정한 좋은 프로젝트 주제이지 않은가 싶다. 보통 선착순 쿠폰이나 이벤트 등 과 같이 대량의 트래픽이 한 번에 몰리는 상황을 가정하며 이러한 상황일 때 아키텍처는 어떻게 설계할지, 트래픽을 어떻게 분산..
항해 99 주특기 주차를 진행하게 됐다. 2주 동안 Spring boot를 활용한 Lv1 ~ Lv5 과제를 수행했다. 약 2~3일 간격으로 과제를 제출했기에, 시간이 굉장히 부족했던 주차였다. 블로그 작성에 신경을 많이 못 썼던 것 같다. 시간이 많이 부족해서, 이론적으로 깊이 공부하지 못한 것 같아서 간단하게 정리해 보는 시간을 가져보려고 한다. ✔️ REST API 란? Representational State Transfer(표현 상태 전이)의 약자로, 웹 서비스를 설계하고 구현하기 위한 아키텍처 스타일 중 하나. URI엔 자원을 나타내고, 자원의 대한 행위는 HTTP method를 통해 표현한다. GET /members/show/1 (x) GET /members/1 (o) ✔️ Spring을 왜 ..
항해99 심화트랙 자료구조 & 알고리즘 3주 차가 거의 마무리되어간다. 이번 주에 공부했던 최소 신장 트리(MST, Minimum Spanning Tree), 이분 탐색(Binary Search)에 대해 정리 해보려고 한다. ✔️ 신장 트리(Spanning Tree), 최소 신장 트리 (Minimum Spanning Tree) 💡 신장 트리 (Spanning Tree) 신장 트리(Spanning Tree)란 주어진 그래프의 모든 정점을 포함하면서 사이클을 형성하지 않는 부분 그래프이다. 여기서 사이클 이란, 한 노드에서 출발하여 간선(Edge)을 따라 다시 출발한 노드로 올 수 있는 상황을 일컫는다. 신장 트리는 모든 정점을 한 번씩 방문하면서, 정확히 하나의 경로를 통해 모든 정점을 연결한다. '신장'..
✔️ 들어가며 이번 주는 심화 자료구조 학습 주차였다. 그래프, DFS, BFS, 트리, 이진 트리에 대한 개념 공부와 알고리즘 공부를 진행하게 되었다. 기본 자료구조 주차에 비해서 난이도가 많이 올라갔다고 느꼈던 한 주였다. 문제를 해결한 방법과, 배운 점 및 알아야 할 점에 관련하여 글을 작성해보려고 한다. ✔️ 그래프 & DFS 활용 [Baekjoon] 2667. 단지 번호 붙이기 - https://www.acmicpc.net/problem/2667 2667번: 단지번호붙이기 과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여 www.acmicpc.net from..
심화트랙 선택 항해99 본 과정이 시작됐다. 본 과정은 정규트랙과 심화트랙 두 개로 나뉘어 있었고, 둘 중 하나를 선택해서 진행할 수 있었다. 나는 개발 경험도 있었고, 자료구조 및 알고리즘에 시간을 더 투자하고 싶어서 심화트랙을 선택했다. 앞으로 약 3주간 팀을 이뤄 자료구조 및 알고리즘을 공부할 예정이다. 문제는 백준, 리트코드의 문제를 하루에 4~5개 정도 풀게 되었다. 커리큘럼이 Python으로 진행되었는데, 문법이 익숙하지 않아 문제를 풀 때 많이 찾아가면서 풀게 됐다. 문제를 풀면서 느꼈던 점을 중심으로 적어보려고 한다. 시간 복잡도 [Leetcode] 15. 세 수의 합 - https://leetcode.com/problems/3sum/ LeetCode - The World's Leading..