장애와 삽질이 가르쳐 준 것들
실무에서 만난 문제들을 기록합니다.
Spring 장애
JPA N+1, 배치 지연, 스케줄러 데드락 — 실전 트러블슈팅 모음
아키텍처
SAGA, 분산락, 데이터 정합성 — 설계 원칙부터 분산 시스템까지
AI/DX
Claude Code, MCP, AI 에이전트 — 백엔드 개발자의 AI 전환 가이드

AI 시대에 TDD가 더 중요해진 이유 - Mock과 레이어드 아키텍처 관점에서
TL;DR 증상: AI가 생성한 코드가 컴파일은 되는데 로직이 틀린 경우가 많다 원인: AI는 비즈니스 로직의 맥락을 모르고, 사람이 일일이 검증하기 힘들다 해결: TDD로 테스트를 먼저 작성하면 AI 코드를 빠르게 검증할 수 있다 효과: 코드 품질 향상, 리팩토링 안정성 확보, AI와의 협업 효율 상승 한계: 초기 학습 곡선, 테스트 작성 시간 투자 필요 왜 갑자기 TDD 글을 쓰게 됐을까요? 솔직히 말하면…

우리 팀은 왜 JDK 21을 선택했나 - 작은 서비스의 관점
TL;DR 문제: JDK 11을 쓰고 있는데 17로 갈지 21로 갈지 결정 필요 (작은 규모 B2B 서비스, TPS 10-20) 원인: 대용량 서비스는 성능 중심 선택하면 되는데, 작은 서비스는 “우리에게 필요한가?” 고민 해결: 스테이징 3개월 테스트 → JDK 21 선택 (Virtual Thread, Pattern Matching, Record 등) 효과: 개발 생산성 ↑ (Record), 코드 가독성 ↑…

실무에서 자주 쓰는 자바 디자인 패턴 - 언제 어떻게 쓸까?
TL;DR 문제: 결제/알림 방식마다 if-else 분기, 코드가 계속 길어지고 새 방식 추가할 때마다 수정 원인: “같은 일을 하지만 방법이 다른 것들”을 분기로 처리하면 OCP (개방-폐쇄 원칙) 위반 해결: 실무에서 자주 쓰는 3가지 패턴 (Strategy, Factory, Template Method) 효과: 새 방식 추가 시 기존 코드 수정 불필요, 테스트 쉬움, 가독성 ↑ 한계: 초기 설계 시간, 클래스 수…

실무에서 마주한 함수형 프로그래밍 - 명령형에서 선언적으로
서론 코드 리뷰 시간, 팀장님이 제 코드를 보시더니 물으셨습니다. “이 메서드, 뭐 하는 거예요?” 저는 자신 있게 설명했습니다. “고객 목록에서 활성 상태인 VIP 고객들의 이번 달 총 구매액을 계산하는 로직입니다.” “아… 그렇군요. 근데 코드를 읽어도 그게 잘 안 보이네요.” 순간 당황했습니다. 제가 작성한 코드였는데도, 다시 보니 정말 한눈에 이해가 안 됐습니다. 3단계 중첩 루프에 if문이 여러 개… 로직은…

자바 메소드 병렬 호출
서론 다소 황당한 블로그 주제지만 실제로 궁금증이 생긴 뒤 이를 해결해나간 과정을 적어보고자 합니다. 회사에서 Spring Batch 코드를 수정할 일이 있어 보던 중, 문득 이런 생각이 들었습니다. 위의 상황에서 updateSome 메소드가 종료되려면 총 30초가 소요되는데, 이를 병렬로 해결하면 가장 오래걸리는 task의 시간인 15초로 줄일 수 있지 않을까??? 각각의 메소드들은 서로에게 영향을 미치지 않는…

자바 프로세스 힙메모리 설정 이슈
서론 OOM Killer에 의해 자바 프로세스가 예기치 않게 다운되는 현상이 발생하였습니다. 메모리 바운더리 설정을 하지 않은 자바 프로세스가 리눅스 OOM Killer에 의해 다운되었다고 생각했으나, 분명 해당 자바 프로세스는 메모리 설정이 되어있는 상태였습니다. 자바 프로세스에 -Xms, -Xmx 옵션을 통해 힙메모리를 부여하였으나, 여전히 프로세스 다운현상이 발생하였고, 프로세스의 메모리를 확인해 보았을때, 부여한…

인터페이스와 추상클래스 차이
서론 다른 사람들도 그런지 모르겠지만, 저는 항상 인터페이스와 추상클래스가 뭔지는 아는데 차이점을 명확하게 설명하기 난해한 적이 많았습니다. 워낙 인터넷에 추상클래스와 인터페이스의 차이점에 대해서 간략하게 설명해주신 분들이 많아서 그런지, 헷갈리면 인터넷 찾아보면 되지~ 라고 생각하며 넘어간 적도 많았습니다. 하지만 이제는 완벽하게 짚고 넘어가야겠습니다. 이번 기회에 이 글을 읽으시는 분들도 그동안 헷갈렸던 자바개념을…