gRPC 인터셉터를 사용한 JWT 인증과 Spring Security 연동하기
·
유용한 개발지식/gRPC
시작하며안녕하세요. 개발자 Stark입니다. 오늘 포스팅은 제가 야심 차게 준비 중인 2개의 시리즈(트랜잭션, gRPC) 중 gRPC시리즈입니다. 내용을 간단히 설명드리자면 스프링에서 gRPC를 사용하면서 JWT 토큰 인증 기능을 구현하기 위해 토큰 인증을 담당하는 grpc 인터셉터를 구현하고 spring security의 SecurityContextHolder와 통합시켰습니다. 서버에 gRPC 요청이 들어오면 요청을 처리하기 전에 gRPC 인터셉터가 호출되면서 (GrpcAuthenticationReader)를 호출하게 됩니다. 저는 이 Reader 클래스를 Jwt 전용으로 커스텀해서 빈으로 등록하여 매번 요청을 받을 때마다 제가 만든 빈 클래스가 호출되도록 해서 JWT 인증을 진행하고 있습니다. 근데 ..
[Thread] 스프링 톰캣 스레드 덤프 파헤치기: 상태값과 구조 분석
·
유용한 개발지식/스레드(Thread)
안녕하세요. 개발자 stark입니다.오늘 구독 중인 개발 블로그의 글을 살펴보던 중 망나니개발자님께서 적어주신 스프링 tomcat의 스레드 덤프 분석글을 읽은 후 저도 스레드 덤프를 분석해보고 싶다는 생각이 들어서 내용을 보며 분석을 시도해 봤습니다. 망규님께서 좋은 설명들을 적어주신 덕분에 직접 따라 해 보면서도 그 내용도 쉽게 분석하며 이해할 수 있었습니다.  이렇게 열심히 덤프 분석을 따라 하던 중 궁금한 점이 생겼습니다. 덤프 안에는 생전 처음 보는 Poller, Acceptor, RMI 스레드가 있어서 무엇인지 알고 싶었으며 각 스레드는 상태를 가지고 있었는데 그중 WAITING과 TIMED_WAITING라는 상태의 차이점을 자세히 알고 싶었습니다. 또한 어떻게 WAITING 상태였던 스레드가 ..
[자료구조] 힙 정렬의 시간복잡도 O(n log n) 이해하기
·
유용한 개발지식/알고리즘
안녕하세요. 개발자 stark입니다!이번 포스팅은 알고리즘입니다. 저는 최근 기본기를 다지기 위해 다시 알고리즘을 공부하고 있는데 heap 정렬을 공부하던 중 n개의 숫자를 힙에 삽입하는 시간복잡도가 O(n log n)인 이유가 궁금해서 공부를 했고 이것을 단계별로 설명해 보고자 합니다.  힙 구조 살펴보기먼저 힙의 구조를 생각해 보겠습니다. 힙은 아래와 같은 완전 이진트리(complete binary tree) 형태를 가지며, 각 노드는 자식 노드들보다 큰 값(최대 힙의 경우)을 가져야 합니다.  100 레벨 0 (루트) / \ 85 95 레벨 1..
[Java] serialVersionUID와 직렬화 호환성 관리
·
유용한 개발지식
안녕하세요. 개발자 stark입니다!오늘은 제가 kafka 소스코드를 살펴보다 발견한 serialVersionUID에 대해서 얘기해보고자 합니다. 실제로 Kafka에서 사용되는 예외 클래스(WakeupException)를 예시로 들어 직렬화/역직렬화 과정에서 serialVersionUID가 어떤 영향을 미치는지 더 자세히 보여드리겠습니다.  1. 초기 버전의 Kafka 관련 예외 클래스먼저 오픈소스 프로젝트인 Kafka 소스코드에 있는 예외 클래스를 확인해 봅시다.필드에 serialVersionUID = 1L이 선언되어 있습니다.package org.apache.kafka.common;public class KafkaException extends RuntimeException { private s..
Kafka에서 Locale.ROOT 사용의 중요성
·
유용한 개발지식/Apache Kafka
오늘은 Kafka 소스코드를 분석하다 발견한 Locale.ROOT의 사용 사례를 다뤄보려고 합니다. 이 코드는 처음 봤을 때는 뭔가 신기했지만, 실제로 왜 사용되었는지를 깊이 이해한 후에는 그 중요성을 충분히 깨달을 수 있었습니다.제가 글로벌 서비스를 운영할 때 각 지역별로 다른 시간을 보여주기 위해 JavaScript에서 Locale을 다룬 경험은 많았지만, 백엔드 개발을 하며 Java에서 이렇게 명시적으로 Locale을 설정한다는 것은 생각해 본 적이 없었습니다. (UTC와 Zoned는 다뤄봤지만 Locale만을 직접적으로 다뤄본 적은 없습니다.) 그래서 이번 포스팅을 통해 그 내용을 간단히 공유해 보겠습니다.  Kafka의 AcknowledgeType Enum 코드 분석아래 코드는 오픈 소스 Kaf..
개발자를 위한 gRPC 기본 개념
·
유용한 개발지식/gRPC
안녕하세요. 오늘도 개발 중인 stark입니다!최근 마이크로서비스 아키텍처(MSA)가 널리 도입되면서, 서비스 간 통신 방식에 대한 고민이 깊어지고 있습니다. 그중에서도 Google이 개발한 gRPC는 기존 REST API의 한계를 뛰어넘는 새로운 대안으로 주목받고 있습니다. 저 또한 MSA 프로젝트를 하면서 FeignClient의 대안을 알아보던 중 gRPC에 대해 알게 되었고 도입까지 해보게 되었습니다. 그러나 gRPC를 사용만 했지 무엇인지에 대해서는 이론적으로 잘 알지 못하고 있다는 것을 깨달았습니다. 그래서 이번 포스팅에서는 gRPC에 대한 경험이 아닌 이론을 정리해 보았습니다. 이번 포스팅을 통해 gRPC가 어떤 특징을 가졌는지 그리고 기존의 REST API와 비교했을 때 어떤 차별점이 있는지..
[Test] HTTP 부하 테스트 도구 'hey'를 사용한 성능 측정
·
유용한 개발지식/스레드(Thread)
http 테스팅 툴 hey 사용하기 1. hey가 뭘까?hey는 Go 언어로 개발된 간단한 HTTP 부하 테스트 도구다. 원래 rakyll/boom으로 알려졌지만, 이후에 hey로 이름이 변경되었다. 이 도구는 웹 서버의 처리 능력을 테스트하고 성능 병목 현상을 식별하는 데 유용하다. 깃허브 주소아래 깃허브에 소스코드가 공개되어 있다. README를 읽어보는 것도 도움이 될 것이다. GitHub - rakyll/hey: HTTP load generator, ApacheBench (ab) replacementHTTP load generator, ApacheBench (ab) replacement. Contribute to rakyll/hey development by creating an account o..
[Thread] 코루틴(Coroutine)의 동시성 제어
·
유용한 개발지식/스레드(Thread)
코루틴의 동시성 제어 방식을 알아보자.📌 서론코루틴은 비동기 프로그래밍을 간편하게 만들어주는 강력한 도구다. 하지만 여러 코루틴이 동시에 실행되면서 공유 자원에 접근할 때는 동시성 문제(concurrency issues)가 발생할 수 있다. 이번 포스팅에서는 코루틴에서 동시성을 안전하게 관리하기 위한 주요 방법들을 실전에 유용한 예제와 함께 쉽게 이해할 수 있도록 설명할 예정이다. 1. 뮤텍스(Mutex)와 동기화뮤텍스의 개념과 필요성멀티스레드 환경에서 여러 스레드가 동시에 공유 자원에 접근하면 데이터 일관성 문제가 발생할 수 있다. 코루틴도 마찬가지로 여러 코루틴이 동시에 동일한 자원에 접근할 때 동기화가 필요하다. 이를 위해 뮤텍스(Mutex)를 사용하여 임계 구역을 보호할 수 있다.Mutex의 기..