전체 글

프로그래밍 정보를 공유합니다
이제 거의 실전 프로젝트가 마무리되어간다. 저번엔 Redis를 활용하여 수강신청의 성능을 개선해 봤는데, 이번에는 ORM에서 자주 발생하는 N+1 문제를 개선하였다. 문제가 발생하는 부분을 확인하고, 개선하는 작업을 진행하였다.  ✔️ N+1 문제 발생우리 프로젝트에서 N+1이 발생한 부분은 장바구니 페이지를 조회할 때 발생했다. 페이지 조회 시, 과목 정보에 대한 쿼리가 여러 번 요청되는 것을 확인하였다.  💬 원인 분석장바구니 페이지에서 N+1 문제가 발생하는 원인을 찾아보자. RegisteredSubjectRepository에서, findAllByStudentId() 메서드로 학생이 장바구니에 담은 과목들의 정보를 Spring Data JPA의 쿼리메서드로 불러오도록 되어있다. [ Register..
실전 프로젝트 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 를 활성화하여 ..
· Spring Data
✔️ 영속성 컨텍스트(Persistence Context)란? 영속성 컨텍스트란 '엔티티를 영구히 저장하는 환경' 이라는 뜻이다. 일종의 작업 영역이라고 생각할 수 있다. JPA에서 제공하는 논리적인 구조로 영속 상태의 엔티티들을 관리하기 위한 목적으로 사용된다. 1차 캐시, 동일성 보장, 변경감지(Dirty Checking)등 의 기능이 제공된다. ✔️ 엔티티의 생명 주기 비영속(New) : 영속성 컨텍스트와 전혀 관계가 없는 새로운 상태 //객체를 생성한 상태(비영속) Member member = new Member(); member.setId("member1"); member.setUsername("회원1"); 영속(Managed) : 영속성 컨텍스트에 의해 관리되는 상태 //객체를 생성한 상태(비..
3월 26일 항해99 실전 프로젝트가 시작됐다. 벌써 시간이 이렇게 지난 게 놀랍다... 나는 서비스팀과, 대용량 트래픽을 경험할 수 있는 챌린팀 사이에서 많은 고민 끝에 챌린지팀을 선택하게 되었다. 쉽진 않을 것 같았지만 새로운 경험을 바탕으로 개발에 대한 시야를 넓히기 위해 선택하게 됐다! 앞으로 어떤 방향으로 프로젝트를 진행하면 좋을지, 생각을 정리하는 느낌으로 글을 작성해 본다. 주제 선정 우리 팀의 주제는 대규모 트래픽이 몰릴 상황을 대비한 '수강 신청' 서비스를 진행하기로 했다. 대규모 트래픽을 가정한 좋은 프로젝트 주제이지 않은가 싶다. 보통 선착순 쿠폰이나 이벤트 등 과 같이 대량의 트래픽이 한 번에 몰리는 상황을 가정하며 이러한 상황일 때 아키텍처는 어떻게 설계할지, 트래픽을 어떻게 분산..
· 인프라
spring boot 프로젝트를 github actions, docker를 활용하여 EC2에 배포하는 과정을 담았다. AWS EC2 인스턴스 생성(Ubuntu 22.04), EC2에 docker설치, Docker hub 계정이 있다는 가정하에 진행한다. 기존 배포 방법의 문제점 기존에 CI/CD 를 구축하지 않고 배포를 진행할 때, 우리는 spring boot 프로젝트를 직접 build 해서 jar 파일을 EC2에 Filezila 등으로 옮기고, java -jar 명령어를 실행하여 프로젝트를 실행했다. 프로젝트를 진행하면서 코드의 수정이 빈번하게 일어날 텐데, 매번 이런 과정을 거치는 것은 매우 비효율 적이다. CI/CD를 구축해 두면 이 과정을 자동화할 수 있어 개발 생산성을 높일 수 있다. Githu..
· Spring Data
JPA를 공부하며, 알지 못하면 치명적인 성능저하 및 장애를 불러일으킬 수 있는 N + 1 문제에 관한 내용과 해결법을 정리해보려고 한다. N + 1 문제는 아주 다양한 상황에서 발생한다. 이 글에서는 @OneToMay 에서 발생하는 N + 1 문제를 다룬다. 코드는 Spring Data JPA를 기준으로 작성하였다. ✔️ N + 1 문제란 무엇일까? N + 1 문제란 엔티티 간의 연관관계가 설정된 상황에서 발생한다. 나는 분명 1개 의 쿼리를 기대했는데, 연관관계 또한 조회하게 되며 N개만큼 쿼리가 추가적으로 발생하는 상황을 말한다. 사실 이렇게 글로 보면 이해가 잘 안 간다. 바로 코드를 보며 이해해 보자. ✔️ 엔티티 & 코드 Team과 User는 일대다(1:N) 관계이다. 1개의 Team에 여러..
항해 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을 왜 ..
꼼상
개발서랍장