본문 바로가기

전체 글

(60)
[AI로 글쓰기] SQS FIFO 큐와 좀비 컨슈머: 2시간 30분의 미스터리 장애 추적기 다음은 요청하신 글 「🕵️‍♂️ SQS FIFO 큐와 좀비 컨슈머: 2시간 30분의 미스터리 장애 추적기」를 블로그나 기술 문서에 바로 게시할 수 있도록 구성한 마크다운 버전입니다.🕵️‍♂️ SQS FIFO 큐와 좀비 컨슈머: 2시간 30분의 미스터리 장애 추적기매일 아침 8시 정각, 빠짐없이 실행되던 정기결제 배치가 어느 날 갑자기 10시 30분부터 처리되기 시작했습니다.시스템 알람은 울리지 않았고, 실패 로그도 없었으며, 단지 모든 것이 2시간 30분 늦어졌을 뿐이었습니다.이 글은 SQS FIFO 큐를 사용하는 시스템에서 발생한 이 미스터리 장애를 추적하고, 진범인 좀비 컨슈머(Zombie Consumer) 를 찾아낸 과정을 기록한 리포트입니다.사건의 시작: 사라진 2시간 30분아키텍처는 비교적 ..
[AI로 글쓰기] PostgreSQL Advisory Lock을 이용한 분산 환경에서 안전하게 티켓 예매하기」 🎫 PostgreSQL Advisory Lock으로 분산 환경에서 안전하게 티켓 예매하기PostgreSQL Advisory Lock + Spring WebFlux + 동시성 테스트1. 문제 상황: 경쟁 상태 (Race Condition)대규모 트래픽이 몰리는 티켓 예매 시스템에서 발생 가능한 대표 문제는 같은 좌석이 중복으로 예매되는 상황입니다.시나리오 예시요청 A: DB 확인 → "예매 기록 없음"요청 B: DB 확인 → "예매 기록 없음"요청 A: 예매 기록 생성요청 B: 예매 기록 생성결과적으로 동일한 좌석에 두 개의 예매 기록이 생기는 race condition이 발생합니다[1][2].다이어그램사용자↓서버 A → DB 조회 (좌석 비어있음)↘서버 B → DB 조회 (좌석 비어있음)서버 A → 예..
[AI 글쓰기] 정적 로그 파일 분석에 유용한 도구: lnav & klogg 📂 정적 로그 파일 분석에 유용한 도구: lnav & klogg1. 배경: 왜 정적 로그 분석 도구가 필요한가?서버나 애플리케이션이 생성하는 로그 파일은 문제 원인 분석과 성능 최적화에 핵심적인 자원입니다.하지만 이미 저장된 정적 로그 파일을 효율적으로 분석할 때 단순히 cat, grep, less로는 다음과 같은 한계가 있습니다.수 GB 이상의 대용량 로그를 다루기 어렵다 특정 요청 ID나 패턴을 빠르게 검색하기 힘들다 시간대별 / 레벨별 필터링이 직관적으로 되지 않는다 이 문제를 해결해 줄 두 가지 강력한 도구가 있습니다.2. 터미널 기반 분석: lnav ⌨️(Logfile Navigator)lnav는 터미널 기반에서 정적 로그 파일을 빠르게 분석할 수 있는 오픈소스 도구입니다.개발자와 시스템..
[AI로 글쓰기] 메서드 추출(Extract Method): 깔끔한 코드를 만드는 가장 강력한 리팩토링 🚀 메서드 추출(Extract Method): 깔끔한 코드를 만드는 가장 강력한 리팩토링🎯 왜 메서드 추출인가?길고 복잡한 함수는 가독성을 해치고, 버그를 숨기며, 변경을 어렵게 만듭니다.메서드 추출(Extract Method)은 복잡한 코드를 작고 명확한 역할 단위로 나누어, 이해·재사용·테스트·변경을 모두 쉽게 만들어주는 핵심 리팩토링입니다.이 글의 목표 메서드 추출의 개념과 장점 빠르게 이해 실무에서 바로 적용할 수 있는 단계별 가이드 습득 Kotlin 예시 코드로 Before → After 변환 감 잡기 실패하지 않는 체크리스트와 IDE 단축키까지 한 번에 💡 메서드 추출이란?기존 코드 블록을 잘라 새로운 함수(메서드)로 만들고, 원래 위치에서는 그 함수를 호출하도록 바꾸는 리팩토링..
[설계 방법론] 멀티 클라우드 전략 멀티클라우드 전략은 두 개 이상의 클라우드 제공업체(AWS, Azure, Google Cloud, Oracle Cloud 등)의 서비스를 조합해 기업의 다양한 비즈니스, 기술적 요구를 동시에 충족시키는 접근 방식이다.핵심 개념멀티클라우드는 단일 공급자에 의존하지 않고, 여러 퍼블릭·프라이빗 클라우드 플랫폼을 함께 활용해 유연성, 비용 효율성, 보안, 확장성을 높이는 것을 목표로 한다. 각 워크로드(데이터베이스, AI, 웹 앱 등)를 최적의 환경에서 실행할 수 있도록 배치함으로써 성능과 안정성을 극대화할 수 있다.주요 이점• 공급업체 종속 방지: 하나의 클라우드 서비스를 고집하지 않아 기술적 자유도가 커진다.• 비용 최적화: 서비스별 요금 구조를 비교해 가장 효율적인 조합을 구성할 수 있다.• 성능 향상:..
WebFlux 환경에서 사용자 Role을 변경하는 법 suspend fun updateUserRoles(newRoles: List) { val context = ReactiveSecurityContextHolder.getContext().awaitSingleOrNull() if (context != null) { val authentication = context.authentication if (authentication != null) { val newAuthorities = newRoles.map { SimpleGrantedAuthority(it) } val newAuth = UsernamePasswordAuthenticationTok..
SecurityExpressionRoot를 상속하여 새로운 보안 표현식을 정의하자 사용자 정의 Security Expression Root 클래스 생성lass CustomSecurityExpressionRoot( private val authentication: Authentication, private val roleHierarchy: RoleHierarchy? = null, private val invocation: MethodInvocation? = null,) : SecurityExpressionRoot(authentication), MethodSecurityExpressionOperations { private var filterObject: Any? = null private var returnObject: Any? = null private..
IN 절 안에 있는 id 값 대로 데이터 정렬하기 보통 쿼리를 실행하면 아래와 같이 ASC로 정렬되어 결과가 조회된다. //쿼리 SELECT id, name FROM table WHERE id IN (1, 3, 2, 4, 5, 7, 6); //결과 id | name ---+------- 1 | Byeon 2 | John 3 | Jane 4 | Peter 5 | Mary 6 | David 7 | Susan 그래서 하고 싶은 게 뭔데? WHERE id IN (1, 3, 2, 4, 5, 7 ,6) 아래 IN 절에 기입된 ID 기준으로 정렬을 해서 보고 싶다. //쿼리 SELECT id, name FROM table WHERE id IN (1, 3, 2, 4, 5, 7, 6); ORDER BY array_position(ARRAY[1, 3, 2, 4, 5, 7..