WooLam

Filter vs Interceptor vs AOP — 어디서 무엇을 처리해야 할까

배경 Spring을 사용하다 보면 공통 로직을 어디에 넣어야 할지 고민하게 된다. 인증 처리 로깅 예외 처리 권한 검사 처음에는 단순하게 “한 곳에서 처리하면 되지 않을까?”라고 생각했지만 실제로는 Filter / Interceptor / AOP 각각의 역할이 명확히 다르다는 걸 알게 됐다. 특히 JWT 인증을 적용하면서 이 ...

코드 컨벤션과 GitHub 규칙을 정리하면서 느낀 것

배경 혼자 개발할 때는 크게 체감하지 못했는데, 프로젝트를 진행하면서 코드 컨벤션과 GitHub 규칙의 중요성을 확실히 느꼈다. 처음에는 단순히 “코드를 보기 좋게 만드는 규칙” 정도로 생각했는데, 실제로는 그보다 훨씬 중요한 역할을 하고 있었다. 코드 컨벤션은 단순한 스타일이 아니다 코드 컨벤션은 단순히 들여쓰기나 네이밍 규칙이 아니다. ...

세션 기반 인증에서 JWT 기반 인증으로 전환하면서 정리한 것들

배경 기존 프로젝트는 전형적인 세션 기반 인증 구조였다. 로그인 시 세션 생성 서버가 인증 상태를 기억 이후 요청은 세션으로 인증 처리 기능적으로는 문제 없었지만 구조적인 한계가 명확했다. 서버가 상태를 들고 있어야 함 확장 시 세션 공유 필요 API 서버로 확장하기 어려움 그래서 Spring Security + ...

데이터의 안전한 작별: Soft Delete와 유예 기간(Grace Period) 전략

“삭제는 끝이 아니라 또 다른 상태로의 전이다. 사용자에게는 실수를 만회할 기회를, 시스템에는 정합성을 유지할 여유를 주어야 한다.” 프로젝트를 리팩토링하면서 데이터를 즉시 물리적으로 삭제(Hard Delete)하는 방식 대신, 논리적으로 삭제(Soft Delete)하고 일정 기간 이후 자동으로 영구 삭제하는 전략을 적용했다. 단순히 데이터를 숨기...

PUT vs PATCH — 단순한 수정 범위를 넘어 멱등성으로 이해하기

배경 PUT과 PATCH를 구분할 때 보통 이렇게 이해한다. PUT → 전체 수정 PATCH → 일부 수정 이 기준만으로 회원 정보 수정 API를 설계하다 보니 이런 고민이 생겼다. PUT이면 모든 필드를 다 보내야 하는가? 수정 불가능한 값까지 요청에 포함하는 것은 비효율적인가? 하지만 이 문제는 단순히 “데이터를 얼마...

Spring Security 요청 처리 흐름과 DispatcherServlet

요청이 필터를 거쳐 인증과 인가를 수행하고 DispatcherServlet을 통해 컨트롤러로 전달되는 흐름 정리 오늘은 Spring Security를 단순히 “권한 설정을 적는 도구”로 보는 것이 아니라, 실제 요청이 들어왔을 때 내부에서 어떤 순서로 동작하는지 흐름 중심으로 정리했다. 1. 인증과 인가의 역할 구분 먼저 가장 중요한 전제는 인...

Facade vs Application Service

호출 개수가 아니라 책임의 방향으로 구분하기 설계에서 중요한 것은 겉으로 드러나는 복잡함이 아니라 해당 클래스가 어떤 책임을 가지며 어디를 향해 의존하는가이다. 이번 리팩토링의 출발점은 Facade와 Application Service의 개념을 구분하는 것이 아니라 서비스 간 순환참조를 해결하는 것이었다. 당시에는 순환참조를 끊기 위해 Facad...

JPA 심화 학습: 영속성 컨텍스트의 비밀과 조회 최적화 전략

“JPA를 사용한다는 것은 단순히 라이브러리를 쓰는 것이 아니라 객체와 데이터베이스 사이의 영속성 컨텍스트라는 거대한 흐름을 제어하는 일이다.” 오늘 학습한 JPA의 핵심 동작 원리와 성능 최적화 전략을 정리해 본다. 이론을 넘어 실무에서 마주하는 디테일한 설정들이 왜 중요한지 되짚어본 하루였다. 1. 영속성 컨텍스트와 쓰기 지연의 ‘예외’ ...

퍼사드(Facade) 패턴: 서비스 순환 참조와 JPA 데이터 정합성 해결

“개발자의 진짜 실력은 ‘가장 완벽한 구조’를 만드는 것이 아니라 현재 상황에서 ‘가장 타당한 최선의 선택’을 내리는 데 있습니다.” 프로젝트 규모가 커지면서 생긴 서비스 간 순환 참조(Circular Dependency) 문제를 퍼사드 패턴으로 어떻게 해결했는지, 그리고 왜 이 방식이 가장 효과적인 전략인지 정리해 봤습니다. 1. 퍼사드(F...