$ cd ~/blog
All Posts
// 39개의 게시글 · 3개의 카테고리
#Development@2026-03-19
운영 중인 서비스를 왜 지금 리팩토링하기로 했나
운영 중인 서비스를 왜 지금 리팩토링해야 했는지, 그리고 왜 전면 재작성 대신 점진적 전환을 선택했는지를 정리합니다.
#Legacy#Refactoring#Spring Boot운영 중인 레거시 서비스를 AI와 함께 점진적으로 리팩토링 하기
#Development@2026-03-19
왜 Spring Boot, Gradle, React Router v7로 방향을 정했나
왜 Spring Boot, Gradle, React Router v7 SSR을 선택했고, 왜 /backend와 /frontend 구조를 먼저 만들었는지 정리합니다.
#Legacy#Refactoring#Spring Boot운영 중인 레거시 서비스를 AI와 함께 점진적으로 리팩토링 하기
#Development@2026-03-19
리팩토링 전에 Playwright 테스트부터 만든 이유
현재 화면 동작을 Playwright로 먼저 고정한 이유와, 미사용 코드를 식별하기 위해 어떤 기준으로 화면을 파악했는지 정리합니다.
#Playwright#Refactoring#Legacy운영 중인 레거시 서비스를 AI와 함께 점진적으로 리팩토링 하기
#Development@2026-03-19
AI가 잘 이해할 수 있는 구조를 먼저 만들었다
AI를 실무 파트너처럼 활용하기 위해 왜 코드 구조를 먼저 정리해야 했는지, 그리고 /backend, /frontend, 멀티모듈 구조를 먼저 잡은 이유를 정리합니다.
#Refactoring#Monorepo#Multi Module운영 중인 레거시 서비스를 AI와 함께 점진적으로 리팩토링 하기
#Development@2026-03-19
Gradle 전환과 미사용 코드 정리부터 시작한 이유
왜 코드 개선보다 먼저 Gradle 전환과 미사용 코드 정리부터 시작했는지, 그리고 그 순서가 왜 중요했는지 정리합니다.
#Gradle#Refactoring#Legacy운영 중인 레거시 서비스를 AI와 함께 점진적으로 리팩토링 하기
#Development@2026-03-19
domain과 infra를 나누며 백엔드 리팩토링을 시작했다
거대한 service 중심 구조를 한 번에 전면 분해하지 않고, posting 도메인부터 domain과 infra로 분리하며 Spring Data MongoDB를 도입한 과정을 정리합니다.
#Domain#Infrastructure#Spring Data MongoDB운영 중인 레거시 서비스를 AI와 함께 점진적으로 리팩토링 하기
#Development@2026-03-05
Spring Boot 시작하기
Spring Boot로 웹 애플리케이션을 시작하는 방법을 소개합니다. 프로젝트 생성부터 간단한 API 구현까지 다룹니다.
#Spring Boot#Java#BackendSpring Boot 완전 정복
#Development@2026-03-04
Spring Boot 예외 처리 전략 - @ExceptionHandler와 @ControllerAdvice
Spring Boot에서 전역 예외 처리를 구현하는 방법을 정리합니다. 커스텀 예외와 에러 응답 표준화를 다룹니다.
#Spring Boot#Exception Handling#REST APISpring Boot 완전 정복
#Development@2026-03-03
Java 기초 정리
Java 프로그래밍 언어의 기본 개념과 문법을 정리한 글입니다. 변수, 자료형, 제어문 등을 다룹니다.
#Java#Programming
#Development@2026-03-02
Spring Security + JWT 인증 구현하기
Spring Security와 JWT를 활용하여 토큰 기반 인증을 구현합니다. Access Token과 Refresh Token 전략을 다룹니다.
#Spring Security#JWT#Spring BootSpring Boot 완전 정복
#Development@2026-03-01
Hello World - 첫 번째 포스트
Hugo 블로그의 첫 번째 테스트 포스트입니다. GitHub Pages와 Hugo Book 테마를 활용하여 블로그를 구축했습니다.
#Hugo#Blog#GitHub Pages
#Development@2026-02-28
Java Stream API 활용 가이드
Java Stream API의 핵심 기능과 실전 활용 패턴을 정리합니다. 중간 연산, 최종 연산, Collector를 다룹니다.
#Java#Stream API#Functional Programming
#Development@2026-02-27
JPA N+1 문제 해결과 쿼리 최적화
JPA에서 자주 발생하는 N+1 문제의 원인과 해결 방법을 정리합니다. Fetch Join, EntityGraph, BatchSize를 활용한 최적화 전략을 알아봅니다.
#JPA#Spring Boot#Hibernate
#Development@2026-02-25
JPA 엔티티 매핑 - 연관관계 설정과 영속성 컨텍스트
JPA의 엔티티 매핑과 연관관계 설정 방법을 정리합니다. 영속성 컨텍스트의 동작 원리를 이해합니다.
#JPA#Spring Boot#Hibernate
#Development@2026-02-10
MySQL 인덱스 원리와 쿼리 최적화
MySQL 인덱스의 동작 원리를 이해하고 실행 계획을 분석하여 쿼리를 최적화하는 방법을 알아봅니다.
#MySQL#Database#Index
#Development@2025-11-05
프로젝트 회고: 잘한 설계, 아쉬운 설계
클린 아키텍처로 문서 분석 시스템을 구축하면서 내린 설계 결정들을 돌아봅니다. 잘한 것과 아쉬운 것을 솔직하게, 그리고 다시 만든다면 무엇을 바꿀지 이야기합니다.
#Clean Architecture#Spring Boot#Java클린 아키텍처로 실제 서비스 만들기
#Development@2025-10-30
QueryDSL로 복잡한 동적 검색 쿼리 설계하기
상태, 카테고리, 날짜 범위, 도메인을 조합하는 복잡한 동적 검색 요구사항을 QueryDSL로 해결하고, 소프트 딜리트와 인덱스 설계까지 고민한 경험을 공유합니다.
#Clean Architecture#Spring Boot#Java클린 아키텍처로 실제 서비스 만들기
#Development@2025-10-21
Dead Letter Queue로 장애를 설계 레벨에서 대비하기
외부 API 호출 실패를 조용히 삼키지 않고, Dead Letter Queue 패턴과 Google Chat 알림으로 운영 가시성을 확보한 경험을 공유합니다.
#Clean Architecture#Spring Boot#Java클린 아키텍처로 실제 서비스 만들기
#Development@2025-10-13
느리고 큰 외부 API 응답, 스트리밍으로 처리하기
AI 분석 API의 느린 응답을 Reactor의 Flux 스트리밍으로 처리하고, AbstractApiClient 추상 클래스로 공통 관심사를 분리한 경험을 공유합니다.
#Clean Architecture#Spring Boot#Java클린 아키텍처로 실제 서비스 만들기
#Development@2025-10-02
Redis Streams로 비동기 분석 파이프라인 설계하기
Kafka, RabbitMQ, Redis Streams 중 Redis Streams를 선택한 이유와 트레이드오프, TransactionalEventListener로 데이터 정합성을 지키는 방법, Consumer Group으로 at-least-once를 보장하는 구조를 정리합니다.
#Clean Architecture#Redis Streams#Async클린 아키텍처로 실제 서비스 만들기
#Development@2025-09-22
Port & Adapter 패턴으로 외부 스토리지 연동하기
파일 업로드/다운로드 설계에서 Presigned URL 방식을 선택한 이유와, FileStorage 인터페이스(Port)와 CephFileStorage(Adapter)로 기술 독립성을 확보한 과정을 정리합니다.
#Clean Architecture#Port and Adapter#Java클린 아키텍처로 실제 서비스 만들기
#Development@2025-09-12
상태 머신을 도메인 객체로 표현하는 방법
AnalysisStatus와 AnalysisStep Enum으로 분석 파이프라인의 상태 전이 규칙을 캡슐화한 설계를 소개합니다. 정보전문가 패턴과 상태 머신을 결합해 잘못된 상태 전이를 도메인 수준에서 차단하는 방법을 다룹니다.
#Clean Architecture#Domain Driven Design#State Machine클린 아키텍처로 실제 서비스 만들기
#Development@2025-09-03
멀티 모듈 프로젝트, 왜 클린 아키텍처로 시작했나
Spring Boot 3.5 + Java 21 기반 문서 분석 시스템을 설계하면서 클린 아키텍처와 Gradle 멀티 모듈 구조를 선택한 이유와 그 과정을 정리했습니다.
#Clean Architecture#Spring Boot#Java클린 아키텍처로 실제 서비스 만들기
#Development@2025-08-11
멀티 모듈 Gradle로 공통 모듈 분리와 의존성 설계하기
SofacApiResponse를 복붙했다가 한 달 만에 응답 포맷이 달라져 API 클라이언트가 깨진 경험, 그리고 commons/support 멀티 모듈로 정리한 과정
#Gradle#Multi Module#MicroserviceSpring Cloud로 마이크로서비스 인프라 구축하기
#Development@2025-07-14
API Gateway 필터와 Config Server로 마이크로서비스 관문 만들기
DB 비밀번호 하나 바꾸려고 3개 서비스를 재배포하다 장애를 낸 경험에서 시작된 Config Server 도입기, 그리고 Gateway 필터에서 만난 IP 추출 버그까지
#Spring Cloud#API Gateway#Config ServerSpring Cloud로 마이크로서비스 인프라 구축하기
#Development@2025-06-09
BaseAuditing 계층 설계: Soft Delete부터 MemberContext까지
BaseEntity를 복사해 쓰다가 동기화 실패, MemberContext clear() 누락으로 메모리 누수까지 겪은 뒤 공통 모듈로 추출한 이야기
#JPA#Soft Delete#BaseEntity
#Development@2025-05-12
Reader/Writer 패턴으로 가볍게 시작하는 CQRS
공고 목록 3초 로딩과 151개 쿼리를 겪고, Repository를 Reader/Writer로 분리해 200ms까지 줄인 이야기
#CQRS#Clean Architecture#JPA
#Development@2025-05-05
주문/결제 이중 상태 머신과 트랜잭션 분리 전략
OrderStatus 5개로 시작했다가 환불 요구사항에 8개로 늘리고, PG 승인-주문 상태 불일치 사고를 겪은 뒤 트랜잭션을 분리한 이야기
#Payment#State Machine#Transaction실전 결제 시스템 구현기
#Development@2025-04-28
PaymentEvent 이벤트 소싱과 PaymentDetail 다형성
결제 상태만 저장했다가 고객 문의를 못 풀게 된 뒤, 모든 상태 변화를 이벤트로 기록하게 된 이야기
#Payment#Event Sourcing#Java실전 결제 시스템 구현기
#Development@2025-04-21
Toss Payments 연동: 3계층 구조와 에러 처리 전략
PG 연동 코드를 UseCase에 직접 넣었다가 테스트 불가능해진 뒤, 3계층으로 분리하고 에러 처리를 체계화한 이야기
#Payment#Toss Payments#Clean Architecture실전 결제 시스템 구현기
#Development@2025-04-14
Domain Model과 JPA Entity를 분리한 이유
OrderEntity에 비즈니스 로직을 넣었다가 테스트가 지옥이 되어, 도메인 모델을 따로 빼게 된 이야기
#Clean Architecture#Domain Driven Design#JPA실전 결제 시스템 구현기
#Development@2025-04-07
임시 주문 → 실주문 2단계 결제 모델 설계하기
주문 테이블 하나로 시작했다가 PENDING 주문 폭탄을 맞고, TemporaryOrder를 분리하게 된 이야기
#Payment#Domain Driven Design#Spring Boot실전 결제 시스템 구현기
#Development@2024-12-02
Kakao AlimTalk 연동기: Port & Adapter로 외부 API 깔끔하게 감싸기
UseCase에 HTTP 호출을 직접 넣었다가 타임아웃이 트랜잭션을 롤백시킨 뒤, Port & Adapter로 분리한 이야기
#Kakao AlimTalk#Port Adapter#Clean Architecture
#Development@2024-11-18
Strategy + Factory 패턴으로 정렬 전략 깔끔하게 관리하기
정렬 방식 3개째가 추가되면서 Service가 50줄을 넘긴 순간, Strategy + Factory로 분리한 이야기
#Design Pattern#Strategy Pattern#Factory Pattern
#Development@2024-11-04
Value Object 3가지 구현법: Record vs Embeddable vs 커스텀 검증
모든 VO를 Record로 통일하려다 JPA와 충돌하고, 검증 규칙 변경이 기존 데이터를 깨뜨린 뒤 3가지 방식을 공존시킨 이야기
#Value Object#Domain Driven Design#Java
#Development@2024-10-21
순환 의존을 이벤트로 끊은 이야기 — Aggregate 간 통신 패턴
Posting과 Step 사이의 순환 의존, 결제 완료 후 장바구니 상태 변경 등 서로 다른 Aggregate 간 이벤트 기반 통신의 실전 경험
#Domain Driven Design#Domain Event#Aggregate도메인 이벤트로 Aggregate 간 느슨한 결합 만들기
#Development@2024-10-07
지원 한 번에 리스너 10개가 반응한다 — 부수효과 실전 해부
지원자 온라인 지원 시 발생하는 중복 체크, 이메일, 알림톡, Meta 동기화, 통계 업데이트까지 이벤트 리스너의 실전 코드를 해부한다
#Domain Driven Design#Domain Event#Event Listener도메인 이벤트로 Aggregate 간 느슨한 결합 만들기
#Development@2024-09-23
검색에서 지원자가 사라졌다 — BEFORE_COMMIT vs AFTER_COMMIT 삽질기
ApplicantMeta가 간헐적으로 생성되지 않는 버그를 추적하면서 배운 @TransactionalEventListener의 트랜잭션 페이즈 전략
#Domain Driven Design#Domain Event#Transaction도메인 이벤트로 Aggregate 간 느슨한 결합 만들기
#Development@2024-09-09
80줄짜리 UseCase를 15줄로 줄인 이야기 — 도메인 이벤트 도출기
지원자 등록 UseCase가 비대해지면서 겪은 문제와, 도메인 이벤트로 부수효과를 분리하기까지의 과정
#Domain Driven Design#Domain Event#Spring Boot도메인 이벤트로 Aggregate 간 느슨한 결합 만들기