스프링 시큐리티에서 SecurityContext를 비동기 스레드에 전파하는 방법
·
Spring/Spring Security
시작하며안녕하세요. 개발자 Stark입니다.오늘은 스프링 시큐리티를 사용할 때 http 메인 호출 내부에서 비동기 메서드를 호출했을 때(한 호출에서 부모-자식 스레드가 함께 동작하는 경우)에 스프링 시큐리티에서는 SecurityContextHolder(ThreadLocal)의 데이터를 어떻게 처리하는지와 이 데이터를 비동기 스레드에 전달 가능한지에 대해 함께 알아봅시다. 저의 경우 업무를 하다 보니 일반 스레드풀을 사용하는 메서드 내부에서 비동기 메서드를 호출하게 되는 경우가 있었는데 이때 유저의 정보가 그대로 전달되어야만 했습니다. 근데 비동기 스레드의 기본 설정 스레드풀인 SimpleTaskExecutor와 일반 스레드에서 사용하는  ThreadPool은 각각 다른 스레드풀이기에 ThreadLocal..
gRPC 인터셉터를 사용한 JWT 인증과 Spring Security 연동하기
·
유용한 개발지식/gRPC
시작하며안녕하세요. 개발자 Stark입니다. 오늘 포스팅은 제가 야심 차게 준비 중인 2개의 시리즈(트랜잭션, gRPC) 중 gRPC시리즈입니다. 내용을 간단히 설명드리자면 스프링에서 gRPC를 사용하면서 JWT 토큰 인증 기능을 구현하기 위해 토큰 인증을 담당하는 grpc 인터셉터를 구현하고 spring security의 SecurityContextHolder와 통합시켰습니다. 서버에 gRPC 요청이 들어오면 요청을 처리하기 전에 gRPC 인터셉터가 호출되면서 (GrpcAuthenticationReader)를 호출하게 됩니다. 저는 이 Reader 클래스를 Jwt 전용으로 커스텀해서 빈으로 등록하여 매번 요청을 받을 때마다 제가 만든 빈 클래스가 호출되도록 해서 JWT 인증을 진행하고 있습니다. 근데 ..
스프링부트에서 프로퍼티 파일들은 어떻게 로드되는가?
·
Spring/Spring 설정
안녕하세요. stark입니다!스프링부트는 애플리케이션의 설정을 관리하기 위해 프로퍼티 파일(properties 파일) 또는 YAML 파일을 주로 사용합니다. 이러한 설정 파일들은 애플리케이션이 실행될 때 특정 규칙과 우선순위에 따라 로드되며, 다양한 환경에서 유연하게 동작할 수 있도록 설계되어 있습니다. 이번 글에서는 프로퍼티 파일이 어떤 규칙으로 로드되는지, 이를 어떻게 활용할 수 있는지를 상세히 알아봅시다.  1. 기본적인 프로퍼티 파일 로드 규칙스프링부트 애플리케이션은 실행 시, 특정 경로에서 설정 파일을 자동으로 탐지합니다. 가장 기본적으로 사용되는 파일은 application.properties 또는 application.yml이며, 다음과 같은 경로에서 찾습니다.1. classpath 경로일반..
스프링의 심장, 컨테이너 초기화를 통한 빈의 탄생과 프록시의 완성과정
·
Spring/프레임워크 분석
안녕하세요. 개발자 Stark입니다. 2025년 첫 글입니다. 모두 새해 복 많이 받으세요~이번 포스팅은 정말 길게 준비하고 있던 Spring 트랜잭션 시리즈의 시작을 알리는 글입니다. 한 달간 천천히 시간이 날 때마다 디버깅을 하면서 내부 동작을 분석하고 정리만 진행하고 있었는데 신년이 되었으니 새로운 시작을 알리기 위해 제가 선택한 첫 시리즈는 바로 프레임워크 분석이며 "스프링은 어떻게 @Transactional을 사용한 클래스나 메서드를 빈으로 등록하면서 Proxy 객체로 만들까?"입니다.  이를 위해 가장 기초가 되는 스프링 컨텍스트의 빈 등록 과정부터 시작해서 실제 트랜잭션 인터셉터의 동작까지 이번 시리즈를 통해 모든 것을 상세히 분석하고 정리할 예정입니다. 이번 포스팅에서는 스프링의 복잡한 "..
[Thread] 스프링 톰캣 스레드 덤프 파헤치기: 상태값과 구조 분석
·
유용한 개발지식/스레드(Thread)
안녕하세요. 개발자 stark입니다.오늘 구독 중인 개발 블로그의 글을 살펴보던 중 망나니개발자님께서 적어주신 스프링 tomcat의 스레드 덤프 분석글을 읽은 후 저도 스레드 덤프를 분석해보고 싶다는 생각이 들어서 내용을 보며 분석을 시도해 봤습니다. 망규님께서 좋은 설명들을 적어주신 덕분에 직접 따라 해 보면서도 그 내용도 쉽게 분석하며 이해할 수 있었습니다.  이렇게 열심히 덤프 분석을 따라 하던 중 궁금한 점이 생겼습니다. 덤프 안에는 생전 처음 보는 Poller, Acceptor, RMI 스레드가 있어서 무엇인지 알고 싶었으며 각 스레드는 상태를 가지고 있었는데 그중 WAITING과 TIMED_WAITING라는 상태의 차이점을 자세히 알고 싶었습니다. 또한 어떻게 WAITING 상태였던 스레드가 ..
[DDD] 유비쿼터스 언어(Ubiquitous Language)의 중요성
·
DDD
안녕하세요. 2025년을 준비 중인 개발자 stark입니다! 이번 포스팅에서는 '유비쿼터스 언어'에 대해 설명드리고자 합니다. 이 포스팅은 유비쿼터스 언어를 사용하는 DDD(Domain-Driven Design)에 대해 이해를 하고 오셨다고 가정하고 글이 작성되었습니다. 그래도 혹시 모르니 정말 간단히 설명드리자면 DDD는 '복잡한 도메인 문제'를 해결하기 위한 '설계 철학'으로, 개발팀과 비즈니스 팀 간의 긴밀한 협업을 강조합니다. 그 핵심 요소 중 하나가 바로 유비쿼터스 언어(Ubiquitous Language)입니다.  1. DDD에서 유비쿼터스 언어가 필요한 이유유비쿼터스 언어는 팀원들의 '협업'과 '의사소통'의 중심이 됩니다.소프트웨어 개발 과정에서 가장 흔한 문제 중 하나는 도메인 전문가와 개..
[Java] BiConsumer: 두 개의 매개변수를 처리하는 함수형 인터페이스
·
JAVA
안녕하세요 개발자 stark입니다! 오늘은 BiConsumer에 대해서 소개드리고자 합니다. 어느 날 제 사수님께서 2개의 List를 이중 stream을 돌리며 filter로 특정 조건을 매칭시키면서 값을 세팅하는 방식에서 BiConsumer를 사용하여 값을 세팅하는 방식으로 변경하신 다음 코드의 가독성과 전체적인 성능이 개선된 것을 리뷰해 주셨습니다. 그래서 저도 이 지식을 흡수하고 로직에서 사용해 보고자 BiConsumer에 대한 자료들을 찾아보며 이해하기 위해 많은 노력을 했습니다. 그리고 이제는 어느 정도 이해가 되었다고 느껴져서 조금이지만 정리해 본 것을 공유드리고자 합니다. 항상 새로운 것을 제게 가르쳐주시는 제 사수님께 감사한 마음을 가지며 포스팅을 작성합니다. 시작해 봅시다. Let's g..
[자료구조] 힙 정렬의 시간복잡도 O(n log n) 이해하기
·
유용한 개발지식/알고리즘
안녕하세요. 개발자 stark입니다!이번 포스팅은 알고리즘입니다. 저는 최근 기본기를 다지기 위해 다시 알고리즘을 공부하고 있는데 heap 정렬을 공부하던 중 n개의 숫자를 힙에 삽입하는 시간복잡도가 O(n log n)인 이유가 궁금해서 공부를 했고 이것을 단계별로 설명해 보고자 합니다.  힙 구조 살펴보기먼저 힙의 구조를 생각해 보겠습니다. 힙은 아래와 같은 완전 이진트리(complete binary tree) 형태를 가지며, 각 노드는 자식 노드들보다 큰 값(최대 힙의 경우)을 가져야 합니다.  100 레벨 0 (루트) / \ 85 95 레벨 1..