푸른영혼의 별 | Tech Blog
Java Backend Engineer의 기술 블로그입니다.
Spring Boot, MSA, JPA, Kafka, Kubernetes 등 실무 경험을 공유합니다.
주요 프로젝트: Settlement MSA · ASAT · GitHub
Posts (총 1371편 · 121 / 138 페이지)
-
Velero Kopia *'실패한 Job' 알람이 풀리지 않은* 진짜 이유 — LimitRange.maxLimitRequestRatio 가 만든 *admission 함정*, 그리고 같은 파일이 ArgoCD root-app 까지 *연쇄 정지* 시킨 *한 줄 스키마 버그*
토요일 저녁 7시쯤, 텔레그램으로 익숙한 형태 의 알람 3건이 도착했다.
-
ping 은 가는데 SSH 는 *no route to host* — macOS 26 의 NECP 가 unsigned Go binary 의 사설망 outbound 만 *침묵 차단* 한 사례 진단·우회기
내 macOS 에서 1년 넘게 잘 돌던 집 LAN 서버 모니터링 봇 이 어느 날 갑자기 5 분 단위로 “no route to host” 만 토해내기 시작했다. 그런데 같은 셸에서
ping,nc,ssh로 같은 호스트·같은 포트 를 두드리면 1 ms 안에 응답이 온다. “같은 시스템에서 같은 목적지로 — 어떤 프로세스는 가고, 어떤 프로세스는 못 간다” — 이 비대칭 이 무엇인지 추적해 들어가니, 결국 macOS 26 의 NECP 라는 거의 문서화되지 않은 커널 정책 엔진과 Local Network Privacy, 코드 사인, unsigned Go binary 의 3 자 충돌이었다. -
KubeAPIErrorBudgetBurn 알림 하나로 시작된 디스크 추적기 — etcd 는 *왜* 회전 HDD 를 그렇게 미워하는가
토요일 저녁, 텔레그램 알림 한 줄.
[resolved] KubeAPIErrorBudgetBurn (severity: warning)─ “이미 풀렸으니 무시” 라고 자동 닫혔다. 보통이라면 지나갔을 그 알림 한 줄을, 그날은 끝까지 따라가봤다. 끝에는 7200rpm 노트북 HDD 위에서 fsync 하고 있던 etcd 가 있었다. -
Spring AOP — @Aspect 와 Pointcut 을 시니어가 주니어에게 카페에서 예제로 조곤조곤 설명하는 글
’‘@Aspect 가 뭐예요?”“, ’‘Pointcut 표현식이 왜 *이렇게 *복잡 해요?”“, ’‘Spring AOP 가 @Transactional 의 *기반이라는데, *그래서 *내가 *직접 *AOP 를 *짤 일이 *있나요?”“. 주니어 *2 ~ 3 년 차쯤 *되면 *’‘Aspect 가 @Configuration 처럼 *클래스에 *붙이는 *뭔가”” 같다는 어렴풋한 *느낌까지는 *오는데, *그 *너머는 *’‘뭔가 제어가 *안 *되는 *마법”” 처럼 *느껴진다.
이 글은 ’‘5 년 차 *시니어가 *후배에게 *카페에서 *2 시간 *동안 *예제 *5 개로 *설명해주는”” 톤으로, Spring AOP 의 *3 핵심 *어휘 (Aspect / Pointcut / Advice) 를 *’‘무엇 → 왜 → 어떻게 → 진짜 코드 → 함정”” 의 5 단계로 *풀어본다. *앞 글 Spring *후처리기와 *ThreadLocal 을 *읽었으면 *’‘아 Aspect 도 *결국 *후처리기 *위에 *서 있구나”” 의 *그림이 *명확해질 것이다.
-
주니어를 위한 Java Virtual Threads & Kotlin Coroutines 안내 — *왜* 두 개가 생겼고 *어떻게* 같은 문제를 *다른 길* 로 풀었는가
“동기 코드가 그냥 빨라지면 안 되나요?”
-
*Spring *후처리기* 와 *ThreadLocal* — *시니어가 *주니어에게 *조곤조곤 *설명하는 *진짜 *원리*
’‘‘@Transactional 은 어떻게 *동작 *해요?”“, ’‘ThreadLocal 이 왜 *메모리 *누수 *위험이 *있다고 *하나요?”“. 주니어 *3 년 차쯤 *되면 *’‘어렴풋이 알지만 *설명은 *못 하겠는”” 주제들이 있는데, *그 *대표가 *Spring 의 *후처리기와 ThreadLocal이다. *이 둘은 *얼핏 *상관 *없어 *보이지만, *Spring 의 *’‘마법””* 이 어떻게 *작동하는지의 *밑바닥 *두 *기둥이고, *그 *밑바닥을 *이해하면 *’‘아 그래서 *@Transactional 이 *클래스 *내부 *호출 시 *안 *먹혔구나”” 같은 *온갖 *수수께끼가 *한 번에 *풀린다.
이 글은 ’‘5 년 차 *시니어가 *주니어 *후배에게 *카페에서 *한 시간 *동안 *설명해주는”” 톤으로, 후처리기와 *ThreadLocal 을 *’‘무엇인가 → 왜 필요한가 → 어떻게 *동작 하나 → 실제 *Spring 에서 *어떻게 *쓰이나 → 흔한 *함정”” 의 *5 단계 로 *풀어본다.
-
템플릿·콜백·데코레이터 패턴 — *시니어가 *''*'주니어에게*''* 친절하게 풀어보는 Java/Spring 의 *''*'세 가지 변주*''*
’‘‘주니어가 처음 ’‘‘JdbcTemplate’’ 을 만났을 때 — ’‘’‘’
jdbcTemplate.query(sql, rowMapper)’‘’’ 의 ’‘‘두 인자 중 ’‘‘어느 게 ’‘‘템플릿’’ 이고 어느 게 ’‘‘콜백’’ 인지 ’‘‘한 번에 안 보인다’‘’‘. 그리고 *’‘‘2 년 뒤 ’‘‘Spring Security 필터 체인을 디버깅하다가 ’‘’HttpServletRequestWrapper* 를 만났을 때 — ’‘‘그게 ’‘‘데코레이터’‘’’* 라는 걸 ’‘‘배운 적은 있지만 ’‘‘자기 코드와 어떻게 연결되는지* 까지 가는 데 ’‘‘또 ’‘‘한 학기’‘’‘’‘’‘’‘’’* 가 걸린다. 이 ’‘‘세 패턴은 ’‘‘한 가족’‘’‘’‘’‘’‘’‘’‘’‘’’ — ’‘‘모두 ’‘‘Hollywood Principle (’‘‘Don’t call us, we’ll call you’‘’‘) 의 변주다’‘’‘’‘’‘’‘’‘. 시니어가 주니어에게 ’‘‘한 번에*** 풀어보는 글. -
주니어를 위한 프록시 패턴 안내 — *왜* 정적 프록시가 부족했고 *어떻게* 동적 프록시로 진화했으며 *Spring 이* 그걸 어떻게 활용하는가
“왜
@Transactional이 같은 클래스 안에서 호출하면 *안 먹어요?”* -
Scouter · Pinpoint · New Relic · Datadog — 실시간 *TPS (Transactions Per Second)* 확인 방법과 4 도구 비교 (한국 시장 관점)
“우리 서비스 지금 *몇 TPS?”* 는 백엔드 운영의 가장 기본 질문 이다. TPS (Transactions Per Second) = 초당 처리 요청 수. 이 한 숫자가 시스템의 현재 부하 + 한계 + SLO 기준 을 모두 담는다.
-
*3 형제 *마이크로서비스* — *OMS · WMS · LMS* 를 *헥사고날 + GitOps + Outbox 로 *2 일 만에 *0 → 운영*'까지'
’‘마이크로서비스를 제대로 *해본 적이 *있는가?”“. 모든 *시니어 *백엔드가 *한 번쯤 *받는 *질문이다. 책으로 *읽은 *것과 *블로그에서 *본 *것을 *제외하면, *’‘진짜로 돌리고 *진짜로 *상태 추적하고 *진짜로 *서로 *호출 하는 *3 개 이상의 *서비스를 *처음부터 *끝까지 *내가 *세팅 해 본 *경험”” 이 *흔하지 *않다.
이 글은 2 일 *동안 *0 에서 시작해 *3 개의 *물류 마이크로서비스 — OMS (Order Management System), WMS (Warehouse Management System), LMS (Logistics Management System) — 를 *Spring Boot 3.4 + Java 21 + 헥사고날 *아키텍처로 *각자 *별도 *리포에 *짓고, *각자 *전용 *PostgreSQL 을 *띄우고, *K3s 클러스터에 *GitOps 로 *자동 *배포하고, *3 서비스가 *내부 *DNS 로 *서로 *호출 하는 *e2e 시나리오 까지 *검증한 *전 과정의 *기술 회고다.