본문 바로가기

Backend13

[예약 구매 프로젝트] 가상 스레드 적용 더 많은 요청을 견딜 수 있게 하기이전 포스팅에서 캐싱 전략을 사용해 동시성과 성능 개선을 거쳤지만, 여전히 남아있는 문제가 있었습니다. 바로 처리 가능한 동시 요청 수에 대한 것이었는데요. 여태까지 진행한 대부분의 테스트는 스레드 1000개 x 루프 5번을 기준으로 진행했습니다. 한 번에 5000개의 스레드를 사용하지 않은 이유는 단순했습니다. 안정성이 보장되는 요청의 개수가 1000개였기 때문이죠. 제 목표는 10000개의 요청을 한 번에 받아내는 것이었고, 2000개 요청만 진행돼도 종종 HttpHostConnectException이 발생하는 기존 성능은 목표에 한참 못 미치는 것이었습니다. 요청 처리 속도가 빨라질수록 더 많은 요청을 받아낼 수 있었기 때문에, 조금이라도 성능을 개선하고자 Java.. 2024. 8. 6.
Virtual Thread 신기술이란...Java 21부터 정식 릴리즈된 가상 스레드에 대해 알아보려고 합니다. 우아한 테크 채널의 발표 영상과 우아한 기술 블로그의 글을 많이 참조했습니다. 기술적으로 정확한 정보를 전달해 준 우아한 테크와 달리 이 글은 제 추측이 많이 가미되었습니다. 부디 정보로 받아들이기보다는 이런 경험과 생각을 한 사람이 있구나 정도로 봐주시면 감사하겠습니다. [참고 링크] 우아한 테크 세미나 - Java의 미래, 가상 스레드 우아한 기술 블로그 - Java의 미래, Virtual Thread JEP 444: Virtual Threads Java의 미래, Virtual Thread | 우아한형제들 기술블로그JDK21에 공식 feature로 추가된 Virtual Thread에 대해 알아보고, Thread, R.. 2024. 8. 5.
[예약 구매 프로젝트] Test Code 테스트 그거 어떻게 하는 건데프로젝트를 진행하면서 어려운 부분이 정말 많았지만, 그중에서도 가장 스트레스받았던 부분이 바로 테스트였습니다. 다른 건 공부해서 하면 되겠다 싶었는데 테스트는 어떻게 짜야하나 도저히 감이 잡히질 않았습니다. 하여 정리해 보는 좌충우돌 테스트코드 작성기... 테스트에 대한 정확한 정보를 정리하는 글은 아니고, 제 이해가 어떤 식으로 변화했는지에 대한 글입니다. 아래 카테고리 역시 서로 구분되는 개념으로 나눈 게 아니라 제가 인지한 순서대로 구성했습니다. Unit먼저 단위 테스트 입니다. 코드를 작은 단위(ex - 기능) 별로 분리해서 테스트하는 것을 말합니다. 쉽게 생각하면 메서드 단위의 테스트부터, 메서드 내부에 적용할 로직에 대한 테스트라고 할 수 있을 것 같습니다. 먼저 .. 2024. 7. 30.
[예약 구매 프로젝트] 상품 조회 캐싱 추가 적용 - 성능 테스트 더 더 빠르게, 최적화는 끝이 없다지난 캐싱 전략 글에서 조회 캐싱까진 진행하지 못해서 아쉽다는 말을 포스팅 말미에 적었었지요. 이전엔 DB write 작업을 효율적으로 하기 위한 캐싱을 적용했다면, 오늘은 Read에 대한 캐싱을 적용하고 성능이 얼마나 개선되었는지 말해보려 합니다. 재고 캐싱에 대한 글은 아래 링크로! [예약 구매 프로젝트] 캐싱 전략 적용예약 구매 프로젝트지난달 말부터 대규모 동시 요청 상황을 가정한 예약 구매 프로젝트를 진행 중입니다. 예약 구매라는 말이 와닿지 않는다면 온라인 티켓팅, 한정판 도서/앨범 구매 등을 떠올dooduz.tistory.com  public ProductDto getProduct(Long productId) { String key = String.val.. 2024. 7. 27.
[Spring Security] Session vs Token Session - StatefulSpring Security는 기본적으로 formLogin을 통한 Session 방식 인증/인가를 지원합니다. 다른 처리 없이 UserDetails와 UserDetailsService를 구현하고 로그인하면 JSESSIONID라는 쿠키가 발급되는 걸 볼 수 있습니다. 로그인된 사용자의 정보는 서블릿 컨테이너의 Session Storage에 저장되어 사용되는데 이처럼 사용자 정보를 서버가 기억해두는 것을 stateful이라고 표현합니다. 요청이 인증 관련 쿠키를 포함하고 있으면 쿠키에 담긴 키를 통해 session에 접근하고 로그인된 사용자인지 검증합니다. 프로젝트 규모가 작고 트래픽이 크지 않을 경우, 간편하게 구현할 수 있는 세션 방식 로그인은 좋은 선택지 중 하나일 수 .. 2024. 7. 25.
[예약 구매 프로젝트] 동시 주문 요청 처리 수요는 많고 공급은 적다지금 진행 중인 예약구매 프로젝트의 메인 주제는 짧은 시간에 몰리는 대규모 트래픽을 처리하는 것입니다. 특정 브랜드들의 콜라보 한정 상품이나 온라인 티켓팅 등을 생각해 보면, 사려는 사람은 많고 제공되는 자원은 한정적인 것이죠. 그래서 대규모 트래픽이라고 하면 서버 부하나 성능에 대한 생각이 먼저 떠오르는 게 사실입니다. 그러나 막상 기능을 구현하다 보면 먼저 마주치게 되는 문제가 있습니다. 많은 요청이 하나의 자원을 바라보고 조작하려 하게 되는, 이른바 동시성 이슈입니다. 동시 주문 시나리오편의상 하나의 아이템이 남아있고 아이템을 구매하기 위한 무수히 많은 요청이 들어오는 상황을 가정해 보겠습니다. 지난 포스팅에 올렸던 기본 주문 플로우를 사용한다고 가정해 보죠. 아이템에 대한 .. 2024. 7. 24.