#Java
§ 관련 태그

Java Stream API 활용 가이드
Java Stream API의 핵심 기능과 실전 활용 패턴을 정리합니다. 중간 연산, 최종 연산, Collector를 다룹니다.
프로젝트 회고: 잘한 설계, 아쉬운 설계
클린 아키텍처로 문서 분석 시스템을 구축하면서 내린 설계 결정들을 돌아봅니다. 잘한 것과 아쉬운 것을 솔직하게, 그리고 다시 만든다면 무엇을 바꿀지 이야기합니다.
QueryDSL로 복잡한 동적 검색 쿼리 설계하기
상태, 카테고리, 날짜 범위, 도메인을 조합하는 복잡한 동적 검색 요구사항을 QueryDSL로 해결하고, 소프트 딜리트와 인덱스 설계까지 고민한 경험을 공유합니다.
Dead Letter Queue로 장애를 설계 레벨에서 대비하기
외부 API 호출 실패를 조용히 삼키지 않고, Dead Letter Queue 패턴과 Google Chat 알림으로 운영 가시성을 확보한 경험을 공유합니다.
느리고 큰 외부 API 응답, 스트리밍으로 처리하기
AI 분석 API의 느린 응답을 Reactor의 Flux 스트리밍으로 처리하고, AbstractApiClient 추상 클래스로 공통 관심사를 분리한 경험을 공유합니다.
Redis Streams로 비동기 분석 파이프라인 설계하기
Kafka, RabbitMQ, Redis Streams 중 Redis Streams를 선택한 이유와 트레이드오프, TransactionalEventListener로 데이터 정합성을 지키는 방법, Consumer Group으로 at-least-once를 보장하는 구조를 정리합니다.
Port & Adapter 패턴으로 외부 스토리지 연동하기
파일 업로드/다운로드 설계에서 Presigned URL 방식을 선택한 이유와, FileStorage 인터페이스(Port)와 CephFileStorage(Adapter)로 기술 독립성을 확보한 과정을 정리합니다.
상태 머신을 도메인 객체로 표현하는 방법
AnalysisStatus와 AnalysisStep Enum으로 분석 파이프라인의 상태 전이 규칙을 캡슐화한 설계를 소개합니다. 정보전문가 패턴과 상태 머신을 결합해 잘못된 상태 전이를 도메인 수준에서 차단하는 방법을 다룹니다.
멀티 모듈 프로젝트, 왜 클린 아키텍처로 시작했나
Spring Boot 3.5 + Java 21 기반 문서 분석 시스템을 설계하면서 클린 아키텍처와 Gradle 멀티 모듈 구조를 선택한 이유와 그 과정을 정리했습니다.
PaymentEvent 이벤트 소싱과 PaymentDetail 다형성
결제 상태만 저장했다가 고객 문의를 못 풀게 된 뒤, 모든 상태 변화를 이벤트로 기록하게 된 이야기
Strategy + Factory 패턴으로 정렬 전략 깔끔하게 관리하기
정렬 방식 3개째가 추가되면서 Service가 50줄을 넘긴 순간, Strategy + Factory로 분리한 이야기
Value Object 3가지 구현법: Record vs Embeddable vs 커스텀 검증
모든 VO를 Record로 통일하려다 JPA와 충돌하고, 검증 규칙 변경이 기존 데이터를 깨뜨린 뒤 3가지 방식을 공존시킨 이야기
순환 의존을 이벤트로 끊은 이야기 — Aggregate 간 통신 패턴
Posting과 Step 사이의 순환 의존, 결제 완료 후 장바구니 상태 변경 등 서로 다른 Aggregate 간 이벤트 기반 통신의 실전 경험
지원 한 번에 리스너 10개가 반응한다 — 부수효과 실전 해부
지원자 온라인 지원 시 발생하는 중복 체크, 이메일, 알림톡, Meta 동기화, 통계 업데이트까지 이벤트 리스너의 실전 코드를 해부한다
검색에서 지원자가 사라졌다 — BEFORE_COMMIT vs AFTER_COMMIT 삽질기
ApplicantMeta가 간헐적으로 생성되지 않는 버그를 추적하면서 배운 @TransactionalEventListener의 트랜잭션 페이즈 전략
80줄짜리 UseCase를 15줄로 줄인 이야기 — 도메인 이벤트 도출기
지원자 등록 UseCase가 비대해지면서 겪은 문제와, 도메인 이벤트로 부수효과를 분리하기까지의 과정