[SpringBoot] 선착순 쿠폰 발급 시스템 구현
·
Backend/SpringBoot
최근 프로젝트를 진행하면서 프로모션으로 선착순 쿠폰 기능을 도입하면 좋겠다고 생각하였다.하지만 해당 서비스를 구현하기 위해서는 여러가지 요소들을 고려할게 많았다 선착순 쿠폰 발급시스템의 요건은 다음과 같다.들어오는 순서대로 쿠폰을 발급해야 한다(First Come, First Served)정해진 수량만큼 쿠폰을 발급해야 한다(5000개의 쿠폰이 발급됬을 경우 5000개 초과의 쿠폰이 발급되면 정합성이 유효하지 않다)단기간에 증가하는 트래픽을 견뎌야 한다. 주어진 요건에 따라 기술적 해결책을 생각해 보았다.들어온 순서대로 쿠폰을 발급해야 한다.Http Request에 대한 개별 Thread(Tomcat)의 요청이 순서대로 수행될 수 있도록 제어해야함정해진 수량만큼 쿠폰을 발급해야 한다.동시성을 제어해야함여..
[Kafka] 파티션(Partition)이란? 컨슈머 병렬 처리와 Consumer Lag
·
Backend/Kafka
지난 글에서 Kafka의 기본 개념을 정리하며 실습을 하다가 한 가지 의문이 남았었다. API 요청을 세 번 연속으로 보내면 컨슈머가 메시지를 하나씩만 처리해서, 3초짜리 이메일 발송 3개에 9초가 걸리는 현상이었다. https://mari-laveau.tistory.com/306 원자적 UPDATE -> Redis Lua Script 순으로 처리량을 개선해보았었다. 그러다 이메일 발송처럼 오래 걸리는 " data-og-host="mari-laveau.tistory.com" data-og-source-url="https://mari-laveau.tistory.com/306" data-og-url="https://mari-laveau.tistory.com/306" data-og-image="https://..
[Kafka] Kafka 기본 개념 정리
·
Backend/Kafka
들어가기에 앞서최근 선착순 쿠폰 발급 프로젝트에서 동시성 제어를 실습하며 비관적 락 -> 원자적 UPDATE -> Redis Lua Script 순으로 처리량을 개선해보았었다. 그러다 이메일 발송처럼 오래 걸리는 작업을 API 요청 안에서 동기적으로 처리하는 게 맞는지 의문이 들었고, 메시지 큐를 공부하기 위해 Kafka 입문 강의를 수강하며 실습을 진행하였다.실습은 Producer 쪽은 기존에 진행하던 쿠폰 프로젝트에 파일 몇 개만 추가해서 진행했고, Consumer는 별도의 Spring Boot 프로젝트로 구성하였다. Kafka 브로커는 EC2에 설치해두고 사용했다. Kafka의 기본 구성 (Topic, Producer, Consumer)프로듀서(Producer) : 카프카에 메시지(데이터)를 전달하..
[SpringBoot] Argument Resolver란?
·
Backend/SpringBoot
Spring Boot 프로젝트를 진행하면서 작성한 API 에 대해서 문득 궁금한 생각이 들었다 클라이언트의 요청을 받아 비즈니스 로직을 처리한 후, 응답(화면 또는 데이터)을 반환하는 스프링 MVC의 핵심요소인 컨트롤러에서 클라이언트의 요청에 대한 데이터를 받을때 메소드 인자로 @RequestParam, @PathVariable, @RequsetBody를 사용한다. 근데 해당 어노테이션이 어떻게 동작하고 DTO에 대한 클래스에 대한 필드 값을 어떻게 자동으로 매핑을 해줄까?이러한 궁금증으로 좀 더 깊게 파보며 공부를 해보았다. 먼저 RequestParam과 PathVariable, RequestBody 인터페이스를 직접 관찰해보았다. @Target(ElementType.PARAMETER)@Retentio..
[SpringBoot] @EnableRedisHttpSession 이란?
·
Backend/SpringBoot
세션으로 인증방식을 사용하는 것을 구현하며 @EnableRedisHttpSession이라는 어노테이션을 만났고 해당 부분을 공부하다가 먼저 HttpSession이 뭔지 알아야 했기에 글을 정리해본다. 인증 방식이 궁금하다면 해당 글을 참조https://mari-laveau.tistory.com/296 [SpringBoot] 인증 방식을 JWT가 아닌 Session을 활용이전에 계속 해왔던 프로젝트에서 사용자를 식별하기 위해서 로그인이라는 기능을 활용하였고 이후 인증 후 상태를 유지하기 JWT 토큰 방식을 사용하여 클라이언트쪽에 데이터를 저장하였다.mari-laveau.tistory.com HttpSession이란?Http는 무상태(stateless) 프로토콜이며 요청 하나하나가 독립적이라 서버는 방금 ..
[SpringBoot] @PostConstruct란?
·
Backend/SpringBoot
최근에 프로젝트를 수행하면서 회원 닉네임을 생성할때 욕설이 들어가면 안된다는 PD측의 요구사항을 수행하기 위해 욕설 리스트들이 있는 txt 파일을 리스트로 만들어서 kmp 알고리즘을 사용해서 비속어 리스트의 각 단어가 입력한 닉네임 문자열에 포함되는지 확인하고 사용할 수 있는지 없는지 판별하는 API를 만들었었다. 이때 욕설에 대한 데이터를 불러오기 위해 리스트를 생성하고 @PostConstruct 어노테이션을 활용하고 해당 리스트에 담았었다 이때까지만 해도 해당 어노테이션은 실행할때 한번 실행되는걸로 알고 있었고 정확히 어느 시점에 실행되는지, 왜 생성자가 아니라 별도의 초기화 메서드가 필요한지는 깊게 생각해보지 않았다.그러다 문득 의문이 들었다. 생성자 주입을 쓰고 있다면 생성자 안에서 이미 주입받..