kkokkio - 프로젝트/트러블슈팅 25

JwtAutheticationFilter에서 custom exception을 잡지 못하는 이유

문제 개요사용자의 권한 제어를 위해 작성한 커스텀 어노테이션에서 발생하는 문제를 해결하던 도중 JwtAuthenticationFilter에서 예외 처리가 제대로 되지 않는 것을 발견했다.기존 JwtAuthenticationFilter의 doFilterInternal()// loadUserByUsername이 사용되는 곳@Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { // 헤더에서 토큰 추출 String headerToken = extractTokenFromH..

Spring Batch 도입기

데이터 파이프라인 문서 바로가기: 데이터 파이프라인 설계1. 개요우리 프로젝트는 매시간 트렌드 키워드를 추출하고, 관련 콘텐츠를 생성하여 사용자에게 제공하는 배치 파이프라인을 목표로 합니다. 실시간 처리가 이상적이지만, MVP 단계에서는 시간 기반 배치로 구현하기로 했습니다. 이를 위해 Spring Scheduler를 사용해 매시 정각에 실행되며, Spring Batch를 도입해 안정적이고 확장 가능한 데이터 처리를 보장합니다.주요 기능: 실시간 트렌드 키워드 추출, 관련 뉴스 및 YouTube 콘텐츠 검색, LLM 기반 요약 Post 생성활용 API: Google Trends RSS, Naver Search API, YouTube Data API, Gemini API 등2. Spring Batch란?S..

로그인시 쿠키가 붙지 않는 오류 해결

문제 개요오류 상황과 영향 범위 (예: 특정 코드 실행 시 발생, 특정 라이브러리 버전 호환 문제 등) 발생 배경 (예: 코드 테스트 중, 배포 중 문제 발견 등)로그인시 Response Header에 쿠키가 붙지 않는 문제 발생postman으로 확인 중 Set-Cookie에 중복된 값이 들어가는 문제확인/member/me 회원정보 조회 404 Not Found 문제 발생 오류 메시지 및 원인 분석오류 코드, 오류 메시지 포함 HTTP 상태 코드, 애플리케이션 로그, 서버 로그 등 구체적인 오류 정보 정리 및 로그 메시지를 통한 분석 제공 문제 발생 원인에 대한 심층 분석postman으로 확인했을 때에는 Set-Cookie가 붙는것 확인됨. Spring Security쪽 문제로 보여 해결책 찾아봐야함me..

모니터링 대시보드 설정

모니터링 대시보드 설정일단 Data sources에서 Prometheus와 Loki를 추가한다.Loki conn14430: Spring Boot Statistics,7362: MySQL Overview,1860: Node Exporter Full,13639: Loki 로그 뷰어,Query 예시: {app="backend", stream="stdout"} |= "ERROR" | logfmt | line_format "{{.msg}} [{{.method}} {{.status}}]",2025년 5월 19일 오후 6:162025년 5월 19일 오후 6:162025년 5월 19일 오후 6:16**/actuator/prometheus

Query에서 정렬을 사용하기

부제목: Query가 뭐에요. 먹는건가?문제 개요오류 상황과 영향 범위 (예: 특정 코드 실행 시 발생, 특정 라이브러리 버전 호환 문제 등) 발생 배경 (예: 코드 테스트 중, 배포 중 문제 발견 등)나는 2차 스프린트에서 신고 기능과 관리자 페이지 3개 정도를 구현해야 됐었다. 2차 스프린트 시작 이후 빠르게 신고 기능을 추가하고 약 3일 만에 끝내버린 관리자 페이지 기능(형식이 비슷해서 한번 구현하면 나머지는 비슷비슷하게 구현하면 됐기에 빨랐다.) 그렇게 맘 놓고 QA를 받았는데어마어마한 픽스 요청이 들어왔다! 몇개는 다행이도 내가 미쳐 모르고 구현을 빼먹은 것이어서 추가해줬다. 하지만 그 중에서 제일 시간을 많이 잡아먹은 오류를 어떻게 풀어나갔는지 적어두려고 한다.오류 메시지 및 원인 분석오류 코..

JwtAuthenticationFilter에서 요청할 때마다 Member DB 조회하는 문제

문제 개요우리 서비스는 jwt와 함께 보내는 요청을 모두 JwtAuthenticationFilter로 검증하도록 하고 있는데, 코드 리뷰 중 DB 조회가 너무 잦은 것 같다는 피드백이 나왔다.필터에서는 jwt를 검증 후 사용자 정보를 추출하여 사용자를 조회하고 이를 컨텍스트에 저장하고 있다. 사용자 인증에 UserDetailsService.loadUserByUsername()를 사용하는 Spring Security의 구조를 그대로 활용한 것이다.기존 JwtAuthenticationFilter의 doFilterInternal()// loadUserByUsername이 사용되는 곳@Override protected void doFilterInternal(HttpServletRequest request, Ht..

[Spring 영속성] don't flush the Session after an exception occurs 오류 - 트랜잭션 안에서 JPA 엔티티 재사용 시 문제

문제 개요기존 createKeyword의 로직 키워드 존재 유무 확인 → 키워드 저장의 경우 해당 키워드가 없는 경우에도 무조건적으로 DB 검색이 필요하기 때문에 불필요한 검색을 삭제하고자 로직의 변경이 있었음변경된 로직은 일단 저장 → Unique 키로 인한 오류 발생 → 예외 처리로 검색 후 리턴 과정을 통해 오류가 나지 않을 경우 검색 없이 저장할 수 있도록 작성하지만 변경된 로직에서 null id in site.kkokkio.domain.keyword.entity.Keyword entry (don't flush the Session after an exception occurs) 오류가 발생오류 메시지 및 원인 분석null id in site.kkokkio.domain.keyword.entity...

MySQL에서 중복 데이터를 관리하는 방법

문제 개요스케줄링 작업의 DB에 저장하는 과정에서 동일한 post_id와 keyword_id 조합을 가진 데이터(fingerPrint)가 중복되어 삽입되는 문제가 발생.오류 메시지 및 원인 분석작동시 해당 오류 메세지가 발생함을 확인.2025-05-01T17:14:01.687+09:00 ERROR 16586 --- [kkokkio] [cTaskExecutor-1] o.h.engine.jdbc.spi.SqlExceptionHelper : Duplicate entry '46-55bdedb2a00d7c1ad7567d9647cc24318a470d72d1514e9177a8fc7827357' for key 'keyword_source.uq_ps_keyword_fingerprint'2025-05-01T17:14:..

Prometheus + Grafana 모니터링 도입기

도입 목적프로젝트가 심화됨에 따라 도입된 기술이 다양해지고, 그에 맞춰 얻어야할 정보의 양이 많아졌다.따라서 현재 사용중인 기능의 전체적인 성능을 분석하고 시각화된 모니터링의 필요성이 절실해졌다.Prometheus : 시스템에서 발생하는 다양한 메트릭 데이터를 수집하고 저장하는 도구Grafana : 프로메테우스에서 저장된 메트릭 데이터를 다양한 그래프, 차트, 대시보드 등으로 시각화하여 시스템의 현 상태를 모니터링 할 수 있도록 하는 도구가장 보편화된 이 두 가지 도구를 활용하여 모니터링을 구현하고자 하였다.구현 과정구현 과정은 굉장히 간단했다.당장에 로컬에서 사용하기 위해 구현하였으므로, docker-compose를 활용하여 필요한 도커 컨테이너를 작성하여 사용하였다. prometheus: co..

JWT는 강제로 만료할 수 없는데 우리는 어떻게 블랙리스트를 관리하는가

문제 개요로그인한 사용자의 인증과 인가를 위해 jwt를 사용하기로 했다.Spring Security + JWT사용 방식은 다음과 같다.로그인 시 jwt를 발급함인증이 필요한 경로에는 jwt를 첨부해 요청을 보냄인증이 필요한 경로에서는 요청에 포함된 jwt를 검증해 사용자를 인증함이때 jwt를 어떻게 발급하고, 또 발급한 jwt는 어떻게 관리할 지에 대한 고민이 필요했다.오류 메시지 및 원인 분석사용자 인증을 위해 단순히 jwt 토큰을 발급해주는 것 하나만으로는 부족하다.먼저, 토큰이 탈취 당할 위험을 고려해 토큰의 유효 기간은 짧게 잡는 것이 좋다. 클라이언트에 저장해놓고 request에 첨부하는 토큰의 특성상 탈취 가능성은 언제나 존재하기 때문이다.이런 위험을 줄이고 보안을 높이는 여러 방법이 있지만 ..