본문 바로가기

Back-End

(11)
[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 글쓰기] 정적 로그 파일 분석에 유용한 도구: 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 단축키까지 한 번에 💡 메서드 추출이란?기존 코드 블록을 잘라 새로운 함수(메서드)로 만들고, 원래 위치에서는 그 함수를 호출하도록 바꾸는 리팩토링..
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..
[kotlin] groupBy Story 환불 시스템은 금액별로 사용자를 처리하게끔 되어있다. 환불 시스템에 맞춰서 데이터를 가공해야한다. 가공을 완료 되었다면 환불 시스템을 통해 사용자들에게 환불 처리한다. Process 사용자들의 환불 정보 이다. val users = listOf( mapOf("userId" to 1, "cashback" to 5000), mapOf("userId" to 2, "cashback" to 5000), mapOf("userId" to 3, "cashback" to 500), mapOf("userId" to 4, "cashback" to 500), mapOf("userId" to 5, "cashback" to 3000), mapOf("userId" to 6, "cashback" to 2000), ) 가정..
JAVA 9 ~ JAVA16 달라진점 자바 8 https://blog.naver.com/whydda/222227014403 JAVA8(JDK1.8) 의 8가지 특징 1. Lambda Expressions ▶ 람다 표현식은 익명 함수(Anonymous Function) 이라고 할 수 있다. ▶ 람다... blog.naver.com 은 이 글을 참고 ~ 자바9 private 메서드 public interface Payment { void reserve(); void certify(); void pay(); void status(); default void recodeStatusTime(){ startTime() status() endTiem() } private void startTime(){ System.out.println(System.cu..
@Transactional 간단한 정리 @Transaction 은? 스프링에서 제공하는 트랜잭션 중 하나로 내부적으로는 Spring AOP를 사용하며 선언적 트랜잭션 이라고도 한다. 사용된 디자인 패턴은? 프록시 패턴 (Proxy Pattern) 어떤 객체에 대한 기능을 대신 수행하는 대리 객체를 사용하는 개발 패턴이다. AOP 핵심만! Dynamic Proxy Java 리플렉션을 사용하고 proxy 클래스를 통해 프록시 객체를 생성 (트랜잭션 전 처리 -> 비즈니스 로직 실행 -> 트랜잭션 후 처리)를 위임하고 프록시 객체는 런타임 시점에 동적으로 생성된다. CGLib 리플랙션 대신에 바이트코드를 생성 프레임워크를 사용하여 런타임 시점에 프록시 객체를 만든다. Dynamic Proxy 와 다른 방법을 사용하여 인터페이스가 없으면 프록시 객체..
Spring Boot 특정 버전의 의존성은 어떻게 확인 할 수 있을까? Spring Boot Version 2.0.0.RELEASE 이라고 가정하면? 1. 공식 사이트를 이용한다. https://docs.spring.io/spring-boot/docs/current/reference/html/dependency-versions.html#dependency-versions Dependency Versions The following table provides details of all of the dependency versions that are provided by Spring Boot in its CLI (Command Line Interface), Maven dependency management, and Gradle plugin. When you declare a d..