Spring WebFlux 에서 WebFilter 로 요청/응답을 로깅하기
·
카테고리 없음
Spring WebFlux 에서는 Handler (Controller 또는 FilterFunction) 앞단에서 필터를 이용해 요청과 응답을 가로채 부가적인 처리를 할 수 있는 기능을 제공한다. 이 필터를 이용해 요청과 응답을 로깅할 수 있는데, 이를 구현하는 방법은 크게 2가지가 있다. WebFilterHandlerFilterFunction 단, HandlerFilterFunction 은 Spring WebFlux 의 Router 를 기반으로 Handler 를 구현할 때 활용할 수 있고, Controller 기반의 Handler 를 구현하면 활용하기 어렵다. 내가 적용한 프로젝트는 기존에 Controller 기반으로만 Handler 가 구현되어 있었기 때문에, 전역적으로 필터를 구현할 수 있는 WebF..
I/O multiplexing 을 알아야할까?
·
카테고리 없음
CS 를 공부하다보면 '내가 여기까지 알아야할까?', '내가 개발하는 서버와 관련이 있을까?' 하는 생각이 들 때가 있다. 대학교에서 들었던 운영체제 전공 수업에서는 거의 모든 내용이 그렇게 느껴졌고, 요즘에도 난이도가 높은 책들을 읽으면 종종 그렇게 느낄 때가 있다 I/O multiplexing 을 처음 공부할 때도 비슷한 느낌을 받았다. 동기/비동기를 비교할 때마다 등장하고, 유닉스 프로그래밍 전공 수업에서도 들었던 기억은 있지만, 내가 개발하는 서버와는 관련이 없는 내용처럼 보였다. 하지만 최근에 netty 를 공부하면서 I/O multiplexing 이 서버 개발에서 굉장히 중요한 역할을 한다는 걸 확인하게 되었다. 그래서 이번에는 왜 I/O multiplexing 을 알아야하고, 왜 서버에서 중..
r2dbc-mysql 컨트리뷰션 후기
·
카테고리 없음
컨트리뷰션을 하게 된 계기작년 12월 말, 서비스의 활성 사용자 수가 연초에 비해 가파르게 오르고 있다는 소식이 들릴 즈음, 서버 중 하나에서 이슈가 하나 발생했다. 액세스 토큰을 발급하고 검증하는 서버의 레이턴시가 조금씩 오르더니 피크타임에는 얼럿 임계치를 살짝 넘기기 시작한 것이다. 해당 서버의 레이턴시가 올라가면, 앱 로그인과 함께 API 게이트웨이를 경유하는 대다수의 서비스들이 영향을 받을 수 있는 상황이었기 때문에 빠르게 원인을 찾기 시작했다. 당시에 서버와 DB 의 메트릭 중에 뚜렷한 이상치를 보인 메트릭은 없었기에 원인을 파악하기 쉽지 않았다. 다만 여러 HTTP API 중에 DB 를 사용하는 API 에 대해서만 레이턴시가 증가했기 때문에, 서버에서 사용중인 DB 클라이언트과 커넥션 풀을..
스프링 카프카의 ConcurrentMessageListenerContainer 의 동작 방식
·
카테고리 없음
spring-kafka 를 사용하면서, concurrency 와 errorHandler 를 설정하기 위해 ConccurrentKafkaListenerContainerFactory 를 사용한다. 이 클래스가 어떻게 동작하는지 알아보자. 1. ConcurrentKafkaListenerContainer 란?spring-kafka docs 에서 Reference > Using Spring for Apache Kafka > Receiving Messages 페이지를 들어가보면, MesssageListener 와 MessageListenerContainer 를 구분하고 있다.https://docs.spring.io/spring-kafka/reference/kafka/receiving-messages.html ..
카프카 컨슈머 graceful shutdown 구현 방식 비교
·
카테고리 없음
카프카 컨슈머 구현 시에 graceful shutdown 의 구현 방식을 살펴본다. 1. kafka-clients카프카 Java Client 를 이용한 컨슈머 폴링 시에 shutdown 을 구현한 코드는 다음과 같다.public void run() { try { consumer.subscribe(topics); while (true) { ConsumerRecords records = consumer.poll(Long.MAX_VALUE); records.forEach(record -> process(record)); consumer.commitSync(); } } catch (WakeupException e) { // ignore, we're closi..
불변 객체를 어디서 어떻게 활용할까?
·
카테고리 없음
최근 도메인 주도 개발과 이펙티브 자바를 공부하면서 공통적으로 불변 객체에 대해 공부하게 되었는데, 어떤 상황에서 불변 객체를 사용해야하고 어떻게 활용해야하는지 정리해보고자 한다. 불변 객체란? 불변 객체란 인스턴스를 생성한 후, 인스턴스의 내부 값을 수정할 수 없는 객체를 말한다. 자바에서 메서드의 인자로 객체의 참조 (reference) 를 전달하거나 메서드 내에서 인스턴스를 생성한 뒤 변수에 할당했을 때, 참조를 통해 값을 수정하면 내부의 상태가 변할 수 있다. 이와 달리 불변 객체의 인스턴스에 간직된 정보는 고정되어 객체가 파괴되는 순간까지 절대 바뀌지 않는다. 이펙티브 자바에서는 불변 객체를 만드는 방법으로 다음의 다섯 가지 규칙을 제시한다. 1. 객체의 상태를 변경하는 메서드 (setter) ..