🎯 기획현재 나에게 직접 필요한 서비스를 만들어서 사용해보고 싶다고 생각했다. 컴퓨터 공학등과 같은(현재 기술 면접을 위한 암기중..) 질문을 등록하고, 실시간으로 나에게 문제를 물어봐줄 수 있으면 좋겠다고 생각했다.(누워서도 그냥.. 심심찮게 풀어보면 너무 편할듯?!) 여러명이서 접속해서 먼저 맞추기와 같이 퀴즈 게임식으로 만들어도 재밌겠다고 생각했다.비슷한 서비스를 찾아보면 충분히 있을법 하지만..?! 당연히 개발 성장과 낭만을 위하여(..?) 직접 만들어보고 배포하는 학습을 진행해보려고 한다.(배포 해보자~!!!) 🎯 구상🔗 WebSocket자.. 그럼 이제 기획을 해봐야 하는데..!!실시간 퀴즈 서비스..? 어떻게 해야되지?! 우선 여러사람과 퀴즈 풀이를 하기위해서 기본적인 회원 API는 필..
프로젝트
1. 일단 개선을 하긴 했는데.. 이전에 프로젝트 구조개선을 시도해보았다. 완성된 아키텍처는 아래와 같다. 주문 요청에 대한 요청 처리율도 향상되었고, 재고수량의 동시성 문제도 발생하지 않았다. 하지만 위의 개선된 구조는 내가 알고있는 지식 선에서 가능한 빠르게 구조를 잡아본 형태이고, 더 좋은 선택지가 있을 수 있기 때문에 어떠한 선택지가 있었는지 고민해보고, 새로 알게된 @Scheduling에 대해서도 학습해보면 좋을 것 같다. 2. Redis외에 다른 선택지? 1) 로컬 캐시우선 개선 구조에서 가장 중요하게 생각한 포인트는, 트래픽이 집중될것으로 예상되는 주문 서버의 주문 처리 로직을 MySQL 데이터베이스 I/O를 이용하지 않고 구현하는 것이었다. 그러기 위해서는 캐시 저장소를 활용하면 좋겠..
🌈 문제상황현재 프로젝트 진행 과정은 아래와 같다.1. 이슈/pr 생성2. 개발3. commit & push4. pr리뷰 및 병합 개발을 진행하면서 단위 테스트와 통합 테스트의 개수가 많아져 100개가 넘어가기 시작하였다.그래서 이슈/pr을 생성하고 개발이 완료된 후에 반드시 직접 테스트를 돌려볼 필요가 있었다.(만약 제대로 동작하지 않는 테스트가 있다면 개발 진행 중에 잘못된 코드가 있을 테니까!) 그러나 역시.. 사람이 직접 수동으로 테스트하려니까 까먹고(?) 테스트를 돌리지 않은 상태로 commit & push를 진행하기도 했고,심지어 테스트가 제대로 돌아가지 않는데도 pr후 병합을 해버리는 경우도 발생했다.(최신 pull 받고 테스트 돌렸는데 테스트가 실패해요...ㅠ) 그래서 이러한 수동 테스트..
이전 프로젝트에서는 동시간대에 많은 주문 요청이 들어올 때 동시성 문제를 해결하는데에 집중해서 프로젝트를 진행하였고 마무리 하였다. 이번에는 동시간대에 많은 주문 요청이 들어올 때 어떻게 성능을 개선해볼 수 있을지 고민해 보려고 한다. 기존 로직 성능 측정 & 문제 분석현재까지의 주문 요청 로직을 분석해보고, 어떻게 개선해볼 수 있을지 고민해보자.아래는 현재 주문 요청을 처리하는 컨트롤러, 서비스, 레포지토리 코드이다./** * 주문 생성 컨트롤러 */@PostMappingpublic Response create(@RequestBody final OrderCreate orderCreate) { final Long savedOrderId = orderService.create(orderCreate);..
🎯 빈 후처리기Spring에서 Bean을 생성하고 컨테이너에 저장하기위해서 빈 후처리기를 사용한다.빈 후처리기를 사용하면 @Bean과 컴포넌트 스캔 2가지 방식으로 빈을 등록하는 경우에 대해서 프록시 객체를 생성할 수 있게 해준다. SpringBoot는 @Baen, 컴포넌트스캔을 통해서 객체를 생성한다.그리고 생성된 객체를 빈 후처리기에 작업을 넘기고 반환받는다.반환받은 객체를 스프링 컨테이너에 저장하게 된다. 이 과정에서 빈 후처리기는 해당 객체가 프록시 객체로 바꿔져야 하는지 판단하고, 바꿀필요가 있다면 프록시 객체로 바꿔서 반환해준다. 이렇게 빈 후처리기를 개발자가 직접 정의해서 프록시 객체로 만들어 줄 수 도 있고, 스프링부트에서 제공해주는 기본적인 후 처리기를 사용할 수도 있다.Annota..
앞에서 스프링 AOP 동작원리를 알아보았는데, 핵심은 AOP로 동작할 객체를 그냥 Bean(객체)가 아닌 Proxy객체로 생성해서 스프링 컨테이너에 등록 해주는 것이었다.그렇다면 Proxy객체가 무엇이고, 무엇인데 AOP처럼 특정 동작을 끼워넣을 수 있는지 알아보면 좋을 것 같다. 🎯 프록시 객체프록시라는 단어는 중간에서 무엇인가를 대체한다는 의미를 가지고 있다.프록시 패턴이란 중간에 끼여서 작업을 대리로 처리하거나, 추가적인 작업을 끼워넣을 수 있는 패턴을 의미한다.Spring에서는 인터페이스가 존재하기 때문에 클라이언트는 인터페이스에게 명령하고, 실제 동작하는 구현체 객체는 알지 못한다.즉, 인터페이스를 구현하고 있는 실제 객체가 동작하는지, 프록시 객체가 동작하는지 알 수 없다는 의미이다. 프록시..
프로젝트에서 @Async를 적용 시켜보았다.@Async는 Spring AOP를 기반으로 동작하게 되는데, Spring AOP를 알아보자. 🎯 관점 지향 프로그래밍웹 개발은 보통 계층적인 구조로 나누어져 있다.Web Layer - json변환, 뷰 반환Business Layer - 비즈니스 로직Data Layer - persistence 로직 이런 계층들에 공통적으로 적용되는 부분들이 있다. 바로 보안, 성능측정, 로깅과 같은 부분들이다.각 계층에서 핵심적인 부분들은 아니지만 계층을 걸쳐 공통적으로 존재하여 공통관심사라고 불린다.이러한 공통 관심사를 관리해주기 위해 AOP(관점 지향 프로그래밍)이 등장하였다. AOP가 동작하는 흐름은 크게 아래와 같다.공통 관심사항을 Aspect로 만든다.로깅, 보안,..
🌈 댓글 등록 성능테스트웹툰 도메인의 특징에는 웹툰이 게시되는 특정 시간대에 댓글 등록 요청 트래픽이 높아질 수 있다고 생각하였다.많은 요구사항을 처리하기 위해서는 댓글 등록 요청에 대한 응답시간을 줄이고, 최대한 많은 요청에 대해 커넥션이 연결되어야 한다.요구사항에는 댓글 등록 시 비속어가 검출되면 사용자 경고를 누적하는 기능이 포함 되어 있다. 비속어 검출 작업은 어떤 알고리즘 혹은 외부API를 사용하는지에 따라 시간이 오래 소요되는 작업이라고 생각하였고, 편의상 약 3초가 소요되도록 로직을 구성하였다. 테스트 도구는 빠르고 직관적으로 결과를 확인할 수 있도록 Locust를 활용하였고,아래 처럼 구성하여 간단하게 성능테스트를 진행하였다.테스트 조건100명의 사용자가 댓글 등록을 요청하는 상황진행시..
웹툰플랫폼을 주제 2명이서 프로젝트를 진행했다. 프로젝트를 진행함에 앞서서 목표가 중요할 것이라고 생각하기 때문에 간단히 정리하려고 한다. 먼저 기본적인 REST API 기반으로 백엔드 API개발을 목표로 진행하고, git형상관리를 통해서 이슈, PR, 코드리뷰까지 진행하였다. 추가적으로 나는 비동기 프로그래밍 학습까지 추가목표를 선정하였다. Spring에 비동기 프로그래밍을 적용하면서 부족했던 기초지식들을 쌓을 수 있을것이라고 생각하였다. 🌈 프로젝트 목표프로젝트 목표1. git 형상 관리 및 협업 경험2. 응답시간 향상을 위한 비동기 프로그래밍 학습3. 확장성을 고려한 설계 및 구현4. 단위테스트 및 통합테스트 🌈 프로젝트 목표 기간프로젝트 목표 기간2024.05.01 ~ 2024.05.15 ..
취업코스를 경험하면서 많은 분들을 만났고, 취업을 위한 것만이 아니라 개발 자체에 즐거움을 느끼고 노력하는 모습에서 큰 자극을 받았다. 내가 학습한 부분에 대해 도움을 드리기도 하고, 내가 도움을 받기도 하면서 함께 성장해 나가는 과정을 경험했고, 최종적으로 예약 상품 MSA 프로젝트까지 수행해 나가면서 많은 성장을 할 수 있었던 것 같다. 프로젝트를 마무리하면서 경험들을 되돌아보고 더 좋은 발전을 위해서 회고록을 작성한다. 1. 프로젝트 목표 특정 시간부터 상품구매 버튼이 오픈되고, 짧은 시간에 많은 주문 트래픽이 발생하는 상황을 가정하여 프로젝트를 설계, 구현해보는 프로젝트를 진행하였다. 나는 크게 3가지의 주제에 대해 고민해보는 것을 목표로 잡고 프로젝트를 진행하였다.(특정 시간대에 대량의 주문 트..