[Spring Security] 필터(Filter) 예외 처리에 대한 고민
1. 톰캣 기본 에러 페이지 발생 (500 Internal Server Error) 프로젝트에 JWT 인증을 구현하면서 인증 과정에서 발생하는 에러도 당연히 @RestControllerAdvice에서 처리될 줄 알았다. 약속된 공통 에러 포맷으로 응답이 내려갈 거라고 생각하고 토큰 만료 에러(Expired access token)를 테스트했다. 하...
1. 톰캣 기본 에러 페이지 발생 (500 Internal Server Error) 프로젝트에 JWT 인증을 구현하면서 인증 과정에서 발생하는 에러도 당연히 @RestControllerAdvice에서 처리될 줄 알았다. 약속된 공통 에러 포맷으로 응답이 내려갈 거라고 생각하고 토큰 만료 에러(Expired access token)를 테스트했다. 하...
요약 Jekyll(Chirpy)로 정적 사이트를 만들고 GitHub Pages로 배포한다 main 브랜치에 push하면 GitHub Actions가 빌드, 검증, 배포를 자동으로 수행한다 이미지는 S3 + CloudFront로 statics.jun0.dev에 분리해서 서빙한다 이렇게 구성한 이유 포트폴리오용 기술 블로그를 운영하다 ...
목적 GRIT 프로젝트를 진행하면서 기능을 붙이다 보니, 어느 순간부터는 운영 관점에서 확인할 지점이 늘어났다. 문제가 생겼을 때 경험에 의존하기보다는, 숫자와 로그로 확인할 수 있는 형태가 필요했다. 서비스 상태를 수치로 확인할 수 있는 상태 장애나 이슈가 났을 때 로그를 빠르게 모아 볼 수 있는 상태 그래서 메트릭은 Promethe...
문제 상황 카카오테크캠퍼스 최종 프로젝트에서 대학생 일정 관리 서비스를 만들었다. 사용자가 시간표를 직접 입력하는 과정을 줄이려고, 시간표 이미지를 업로드하면 자동으로 인식해주는 기능을 구현하고 싶었다. 접근 방법: GPT Vision + Structured Output 전통적인 OCR보다 GPT-4.1의 Vision 기능을 쓰기로 했다. 이...
문제 발견 카카오테크캠퍼스 최종 프로젝트에서 팀 채팅 기능을 WebSocket으로 구현했다. 로컬에서 테스트할 때는 아무 문제가 없었다. 그런데 AWS ECS에 배포하니까 오토스케일링으로 인스턴스가 2개 이상이 되면서 문제가 발생했다. A 사용자가 보낸 메시지가 B 사용자에게 도착하지 않았다 메시지 일부가 누락되는 경우가 있었다 원인 ...
배경 카카오테크캠퍼스 최종 프로젝트에서 에브리타임 API와 연동해야 했다. 안정적이고 유연한 HTTP 클라이언트가 필요했다. Spring 진영에서 HTTP 클라이언트로 쓸 수 있는 선택지는 크게 두 가지다. RestTemplate WebClient RestTemplate의 문제 Spring 공식 문서에 다음과 같은 내용이 있다. ...
문제 상황 카카오테크캠퍼스에서 선물하기 API를 JPA로 마이그레이션하다가 상품 삭제 시 옵션도 함께 삭제해야 하는 요구사항이 있었다. 그런데 엔티티 구조가 단방향 참조였다. @Entity public class Option { @ManyToOne(fetch = FetchType.LAZY) private Product product...
문제 상황 카카오테크캠퍼스에서 선물하기 API를 구현하다가 순환 참조 문제를 겪었다. ProductService → OptionService OptionService → ProductService 옵션을 생성할 때 상품이 있는지 확인해야 해서 OptionService에서 ProductService를 참조했다. 그런데 ProductService에...
문제 발견 카카오테크캠퍼스에서 선물하기 API에 페이지네이션을 구현하다가 입력을 어디까지 믿어도 되는지가 궁금해졌다. GET /api/wishlist?page=0&size=3&sort=product.name,desc 이런 API에서 사용자가 일부러 비정상적인 값을 넣으면 어떻게 될까? sort에 비정상적인 값을 넣으면? ...
코드 리뷰에서 알게 된 사실 카카오테크캠퍼스에서 선물하기 API에 페이지네이션을 붙이면서 Spring Data JPA의 Page를 반환하도록 구현했다. 코드 리뷰 과정에서 다음 내용을 안내받았다. “Page는 내부적으로 전체 데이터 개수를 알아야 해서 추가로 count 쿼리가 실행됩니다.” 이때 처음으로 Page를 쓰면 요청마다 SELEC...