본문 바로가기

전체 글846

광고 시스템 퍼포먼스 튜닝 회고록 요기요 기술블로그에 작성한 글입니다.개요2022년 12월부터 CPS(Cost Per Sale)기반 신규 광고 시스템이 도입되었는데, 서비스를 운영하는 과정에서 발생한 퍼포먼스 이슈와 그에 대한 해결 사례를 간단하게 소개해 드리고자 합니다.배경 지식사례를 소개해 드리기 전 배경지식을 먼저 말씀드리겠습니다. 실제로는 아래에 설명드리는 로직 외에도 추가적인 복잡한 로직이 존재하지만, 설명을 위해 본 포스팅의 주제에 부합하는 핵심 로직들만 설명드린 점 감안해 주시길 바랍니다.신규 광고 시스템의 경우 헥사고날 아키텍처를 기반으로 이루어져 있고, 각 애그리거트(Aggregate)에 속해있는 유즈케이스는 저마다의 역할에 충실하도록 구현되어 있는 상태였습니다.예를 들어 광고/레스토랑/캠페인이라는 3개의 애그리거트가 존.. 2023. 7. 19.
스프링 시큐리티 MVC 통합 @EnableWebMvcSecurity 스프링 4.0부터 @EnableWebMvcSecurity는 deprecated됐다. 대안으로 @EnableWebSecurity를 사용하자. 스프링 시큐리티와 스프링 MVC를 통합하려면 @Configuration 어노테이션이 붙은 클래스에 @EnableWebSecurity를 추가해주면 된다. 스프링 시큐리티는 MVC의 WebMvcConfigurer를 사용한 구성 방법도 제공한다. 이는 WebMvcConfigurationSupport와 직접 통합하는것과 같이 좀 더 세밀한 설정이 필요할 때 수동으로 설정하기 위해 사용된다. MvcRequestMatcher 스프링 시큐리티는 MVC가 MvcRequestMatcher를 사용하여 URL을 매칭시키는 방법에 대해 통합하는 방법.. 2023. 6. 19.
스프링 시큐리티 Authentication 아키텍처 Servlet Authentication Architecture 본 섹션에서는 서블릿 인증에 사용되는 스프링 시큐리티의 주요 아키텍처 요소에 대해 설명한다. 이러한 요소들이 어떻게 결합되는지 설명하는 구체적인 흐름은 인증 섹션을 통해 설명한다. 아래의 요소들은 인증 관련한 주요 요소들에 대한 간략한 설명이다. - SecurityContextHolder: 인증 정보를 저장하는 공간이다. - SecutiryContext: SecurityContextHolder를 통해 획득되며 현재 인증된 유저의 Authentication 정보를 담고 있다. - Authentication: 인증을 위해 사용자가 제공한 정보 또는 SecutiryContext의 현재 사용자 정보를 제공하기 위해 AuthenticationMana.. 2023. 6. 19.
스프링 시큐리티 아키텍처 Architecture 이번 섹션에서는 서블릿 기반의 어플리케이션에서 동작하는 스프링 시큐리티의 아키텍처에 대해 다룬다. A Review of Filters 스프링 시큐리티는 서블릿 필터를 기반으로 한다. 따라서 일반적인 필터의 역할에 대해 먼저 알아보자. 아래의 그림은 단일 HTTP 요청을 처리할 때의 구조이다. 클라이언트가 요청을 보내면 컨테이너는 FilterChain을 생성한다. 해당 클래스는 요청 URI기반으로 HttpServletRequest를 다루는 Filter와 Servlet인스턴스를 포함하고 있다. 스프링 MVC에서 Servlet은 DispatcherServlet의 인스턴스이다. 적어도 한개 이상의 서블릿이 단일 HttpServletRequest 및 HttpServletResponse를 처.. 2023. 6. 19.
Datadog Span, Tag 관련 이슈 개요 데이터독에는 일종의 작업 단위를 나타내는 Span이라는 개념이 존재한다. 그리고 Span에 사용자가 원하는 정보를 Tag라는 개념으로 붙여서 표시해줄 수 있다. 본 포스팅에서는 파이썬 httpx 클라이언트를 사용하는 span에 custom tag를 붙여주는 도중 발생한 이슈에 대해 설명하고 해결 방법에 대해 기술한다. Span Tag 외부와 통신을 할 때 로깅하는 내용을 생각해보면 기본적으로 Header, Request Body, Response Body, Response Status code, Query String 등이 있을 것 같다. ddtrace 라이브러리에서는 Header, Response Status Code, Query String은 아래와 같은 방법으로 Span의 Tag를 통해 추가해.. 2022. 12. 26.
Block IO/Non-Block IO 개념 정리 I/O Input/Output의 약자로써 데이터의 입출력을 의미한다. 네트워크(소켓), File, Pipe, Device와 관련된 IO가 존재한다. Socket 네트워크 통신은 소켓을 통해 데이터가 입출력된다. 컴퓨터의 각 프로세스에서 서로 데이터를 주고 받을때는 반드시 소켓을 열고 데이터를 주고 받을 수 있다. 예를 들어 백엔드 서버의 경우 여러 클라이언트들과 각각 소켓을 열고 통신하며 요청을 처리한다고 볼 수 있다. Block I/O IO작업을 요청한 프로세스/스레드는 요청이 완료될 때까지 블락된다. 아래 그림을 통해 대략적으로 설명해보자면, - 스레드가 실행되다가 read라는 시스템 콜을 호출한다. - 만약 호출한 시스템 콜이 Blocking 시스템 콜이라면 호출한 스레드는 블락 상태가 된다. 그리.. 2022. 12. 13.