Java 타입 표현의 진화 문자열 상수에서 sealed까지
·
카테고리 없음
최근 sealed 키워드를 사용해서 도메인 모델링을 진행하고 있습니다. 컴파일 시점에 다양한 상태를 표현할 수 있고, 코드 가독성과 상태별 테스트 작성도 편리해지는 느낌을 받았습니다.오랜만에 프로그래밍 자체가 재미있다고 느꼈습니다. 코드로 의도와 상태를 표현할 수 있고, 타입으로 인해 코드가 더 우아해지는 경험을 했습니다. 그 생각을 바탕으로 이 글을 작성합니다.바로 sealed부터 보면 조금 갑작스럽습니다. 초기 Java에서 상태나 타입을 표현하던 간단한 방식부터 시작해서, 문자열 상수, enum, sealed class가 각각 무엇을 해결했는지 순서대로 살펴보겠습니다.문자열 상수는 값을 모을 뿐 타입을 만들지는 않는다가장 흔한 시작점은 상수 클래스입니다.public final class OrderSt..
JVM 웜업해서 API 레이턴시 개선하기
·
카테고리 없음
배포 직후 첫 고객이 3초를 기다리는 문제를 해결한 과정을 정리했습니다.카테고리: tech배포 직후 첫 고객이 3초를 기다리는 문제를 해결한 과정을 정리했습니다.---JVM 기반 서버는 첫 요청이 느립니다JVM은 실행 시점에 일부 비용을 지불하는 구조입니다. 클래스 파일은 처음 참조될 때 로딩되고, Spring Boot 기반 서버에서는 여기에 대표 조회 경로의 첫 실행 비용과 첫 DB 접근 경로에서 드러나는 초기 비용이 더해집니다.이 비용은 "서버가 느리다"와는 다릅니다. 서버 시작 직후 단 한 번만 발생하고, 두 번째 요청부터는 사라집니다. 문제는 그 "단 한 번"이 첫 번째 고객 요청에서 터진다는 점입니다.---저희 서비스에서 확인한 문제배포 직후 첫 요청과 두 번째 요청의 응답시간을 비교했습니다.첫..
블로그 이전 안내!!
·
카테고리 없음
안녕하세요 이번에 블로그를 이전하기로 결정했습니다. 새 블로그 주소: https://kjg-blog.pages.dev/ Junggi Kim개발과 일상을 기록하는 블로그junggikim.github.io새로운 블로그에서 뵙겠습니다!
운영 서버 마이그레이션 이후 발생한 OAuth2 로그인 오류
·
카테고리 없음
1. 문제 상황운영 서버를 ECS 기반으로 마이그레이션한 이후, OAuth2 로그인 과정에서 간헐적으로 다음 오류가 발생했다.authorization_request_not_found스테이징 환경에서는 재현되지 않았고, OAuth2 관련 설정값 및 환경변수도 모두 정상적으로 구성되어 있었다.코드 변경 없이 운영에서만 발생하는 문제였기 때문에, 프레임워크 동작 또는 인프라 환경 차이에서 원인을 찾는 방향으로 분석을 진행했다.2. Spring Security OAuth2 로그인 동작 방식 확인오류 메시지가 Spring Security 내부에서 발생한 것이었기 때문에,정확히 어떤 상황에서 해당 오류가 발생하는지를 파악하기 위해 AI와 대화를 통해 내부 동작 흐름을 단계별로 정리했다.추가로 로컬 IDE에서 디버깅..
Wi-Fi에서는 정상인데 모바일 데이터에서만 API가 실패한 사례
·
카테고리 없음
배경 및 상황운영 서버 마이그레이션 작업 직후Wi-Fi로 접속 시 화면 데이터 정상 노출동일 화면을 모바일 데이터(LTE/5G)로 호출하면 데이터 미노출 또는 오류일부 사용자는 Wi-Fi/모바일 데이터 모두 정상일부 사용자는 Wi-Fi에서만 정상, 모바일 데이터에서는 항상 실패개발/스테이징 환경에서는 같은 문제가 재현되지 않음최근에 대규모 인프라 구조 변경이나 네트워크 정책 변경은 없음즉, 특정 네트워크 환경(모바일 데이터)에서만 발생하는 API 장애였고,증상이 사용자별·환경별로 섞여 있어 초기 파악이 어려운 상태였다. 증상 정리 문제 도메인을 예시로 api.myservice.com이라고 하면, 증상은 다음과 같았다.Wi-Fi모바일 데이터(LTE/5G)API 응답 정상 일부 계정/단말에서 API 실패서버..
ThreadLocal 대신 ScopedValue?
·
JVM
ScopedValue — 등장 배경부터 철학까지ScopedValue란 무엇인가 JDK 공식 문서에서는 ScopedValue를 다음과 같이 정의합니다. “A scoped value is a container object that allows a data value to be safely and efficiently shared by a method with its direct and indirect callees within the same thread, and with child threads, without resorting to method parameters.”— JEP 506, OpenJDK 즉, ScopedValue는 한 메서드가 자신이 호출하는 모든 하위 메서드들과 자식 스레드에게 데이터를 안..