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

JPA Query에 Pagination을 쓸 때 조심할 점(with 500 에러)

🔥 로컬과 배포 등 싸움에 500 에러가 터진다 🔥문제 개요오류 상황과 영향 범위 (예: 특정 코드 실행 시 발생, 특정 라이브러리 버전 호환 문제 등) 발생 배경 (예: 코드 테스트 중, 배포 중 문제 발견 등)평화로웠던 5월 3일 오후. 나는 여느때와 다름없이 꿀잠을 즐기고 있었다. 청천벽력같은 FE 개발자님의 오류 수정 요청 댓글 전까지는./news/top/videos/top하필 이 두 엔드포인트에서 500 INTERNAL_SERVER_ERROR가 난다…! 로컬 환경에서는 404에러가 뜨는데, 배포 환경에서는 500에러가 뜨는 기이한 현상이 발생한 것이다.오류 메시지 및 원인 분석오류 코드, 오류 메시지 포함 HTTP 상태 코드, 애플리케이션 로그, 서버 로그 등 구체적인 오류 정보 정리 및 로..

테스트코드에서 서킷 브레이커 때문에 머리가 브레이크되다

문제 개요오류 상황과 영향 범위 (예: 특정 코드 실행 시 발생, 특정 라이브러리 버전 호환 문제 등) 발생 배경 (예: 코드 테스트 중, 배포 중 문제 발견 등)나는 계획대로 내 할일인 Youtube API 연동을 5월 2일까지 완벽히 테스트 코드까지 마치고, 간만의 꿀잠을 때리려고 했다. 유튜브 API 연동 성공, Mock Data를 임의로 넣고 테스트 코드 성공, 이후 INSERT IGNORE로 중복되는 소스 처리 등등.. 계속해서 성공했는데단 한 테스트 코드가 성공하지 못했다!!! 🤬@Test @DisplayName("Youtube Video 검색 API - circuitBreaker 확인") void fetchVideos_circuitBreaker() { /// give..

SecurityConfig 엔드포인트 권한 설정

문제 개요오류 상황과 영향 범위 (예: 특정 코드 실행 시 발생, 특정 라이브러리 버전 호환 문제 등) 발생 배경 (예: 코드 테스트 중, 배포 중 문제 발견 등)문제 배경인증이 필요 없는 경로를 모두 공개함으로 보안 취약점 이슈 발생엔드포인트 권한 설정에 대한 지식 부족발생 배경초기에는 “로그인, 회원가입”과 Swagger, H2 콘솔 같은 경로만 공개하고자 함.Role → USER, ADMIN, BlACK에 따라 권한 부여 필요오류 메시지 및 원인 분석오류 코드, 오류 메시지 포함 HTTP 상태 코드, 애플리케이션 로그, 서버 로그 등 구체적인 오류 정보 정리 및 로그 메시지를 통한 분석 제공 문제 발생 원인에 대한 심층 분석오류 메세지모든 API 요청이 인증 없이 통과보통 로그에 별도 예외는 남지 ..

JwtAuthenticationFilter에서 엔드포인트 허용 문제

이전 포스트: SecurityConfig 엔드포인트 권한 설정문제 개요오류 상황과 영향 범위 (예: 특정 코드 실행 시 발생, 특정 라이브러리 버전 호환 문제 등) 발생 배경 (예: 코드 테스트 중, 배포 중 문제 발견 등)오류 상황과 영향 범위JwtAuthenticationFilter 적용 후 인증/인가 설정 과정에서 로그인 후 댓글 작성, 수정, 삭제, 좋아요 등의 특정 엔드포인트만 허용하려 했으나, 다른 API 경로까지 접근이 차단되는 문제가 발생발생 배경JwtAuthenticationFilter 및 SecurityConfig 설정 중 JWT 기반 인증 및 인가 기능을 테스트하는 과정에서 특정 엔드포인트가 예상치 않게 차단된 문제 발견오류 메시지 및 원인 분석오류 코드, 오류 메시지 포함 HTTP ..

@Transactional(readonly=true)가 꼭 필요한가?

Spring 기반 프로젝트에서 트랜잭션 처리는 선택이 아닌 필수이다. 그중 @Transactional(readOnly = true)는 종종 ‘옵션’처럼 여겨지지만, 성능과 안전성을 동시에 확보하기 위한 중요한 습관이다.📌 요약@Transactional(readOnly = true)는 단순 조회성 트랜잭션에서 불필요한 비용을 줄이고, 읽기 전용임을 명확히 하며, DB 이중화 전략에서도 이점을 제공한다.클래스 또는 메서드 단위에서 기본값처럼 사용하는 것이 좋다.1. @Transactional의 기본 동작Spring에서 @Transactional은 메서드 실행 전후로 트랜잭션을 열고, 성공 시 커밋, 예외 시 롤백을 수행한다. 내부적으로는 프록시 객체를 통해 트랜잭션 경계를 제어한다.비즈니스 로직이 몰려 있..

DataGrip에서 RDS(MySQL)에 SSH 터널로 안전하게 접속하기

AWS에서 RDS는 기본적으로 외부에 노출되지 않는다. 특히 Publicly Accessible = false인 RDS에 로컬 개발 환경에서 접속하려면 EC2 인스턴스를 중계로 사용하는 SSH 터널링 방식이 가장 안전하고 일반적인 접근법이다.문제 개요로컬에서 DataGrip을 사용하여 Amazon RDS(MySQL)에 접속하려 했지만 다음과 같은 문제에 부딪혔다.보안 그룹에 내 IP를 허용했음에도 타임아웃 발생RDS 엔드포인트가 내부 VPC 전용으로 설정되어 있음이 문제를 해결하기 위해 여러 방법을 검토했지만, 결국 EC2를 통한 SSH 터널링으로 해결했다.왜 직접 접속이 안 되는가?Amazon RDS는 다음과 같은 보안 정책을 기본으로 한다:Publicly Accessible이 false인 경우 외부에..

사용자 인증/인가 흐름v1.0을 이해하고 RBAC 적용하기

💡User Auth Flow v1.0Controller 계층MemberControllerV1: 회원가입, 정보조회AuthControllerV1: 로그인, 토큰 재발급, 로그아웃, 이메일 인증Service 계층1. MemberService:회원가입(createMember)회원가입 중복 검사 → 비밀번호 암호화 → 회원 생성미인증 회원 Redis 임시 저장(siginUpUnverified)Redis Key TTLSIGNUP_UNVERIFIED:{email}5min회원 정보 조회(getMemberInfo)쿠키에서 accessToken 추출 후 JWT 검증2. MailService:이메일 인증번호 발송(sendAuthCode)메일 전송 → Redis에 인증번호 임시 저장Redis Key TTLEMAIL_AUT..

Prometheus & Loki 기반 모니터링 시스템 구축기

TL;DRAWS EC2 기반의 Spring Boot 애플리케이션에서 메트릭(Prometheus)과 로그(Loki)를 통합하여 모니터링하는 파이프라인을 구축했다. Terraform으로 인프라를 선언형으로 관리하고, Alertmanager + Slack 알림까지 연결해 운영 효율성을 높이는 방법까지 소개한다.1. 우리의 목표와 현재 상황 이해하기1.1 현재 로컬 환경Docker Compose:MySQL과 Redis: 애플리케이션에서 사용하는 데이터베이스와 캐시Prometheus: 서버와 애플리케이션의 메트릭(예: CPU 사용량, 메모리 사용량) 수집Grafana: Prometheus에서 가져온 메트릭과 나중에 추가할 로그 등 시각화MySQL Exporter: MySQL 데이터베이스의 메트릭 노출Node Ex..

Test Code Redis Connection Error

문제 개요오류 상황과 영향 범위 (예: 특정 코드 실행 시 발생, 특정 라이브러리 버전 호환 문제 등) 발생 배경 (예: 코드 테스트 중, 배포 중 문제 발견 등)오류 상황RedisMessageListener 생성 후 workflows를 탈 때 테스트가 모두 Redis 연결 오류로 인해 실패하는 현상발생 배경workflows에 따라 CI 테스트 중 Errror 발생오류 메시지 및 원인 분석오류 코드, 오류 메시지 포함 HTTP 상태 코드, 애플리케이션 로그, 서버 로그 등 구체적인 오류 정보 정리 및 로그 메시지를 통한 분석 제공 문제 발생 원인에 대한 심층 분석오류 코드원인 분석RedisMessageListenerContainer가 기동되는 과정에서 Lettuce 드라이버가 기본 localhost:63..

GoogleTrendsRssService에 헥사고날 아키텍처를 적용해보기

이전에 GoogleTrendsRssService의 경우, 외부 기능을 가져오는 기능임에도 Service를 통해 코어에서 직접 다루는 방식을 채택했었다.이 경우 이후에 실시간 인기 키워드를 가져오는 외부 기능이 변경될 경우, 코어의 코드 전체가 수정이 될 가능성이 생기고, 외부 도구를 변경하고 싶을 때도 변경이 어려워 확장성과 유연성 측면에서 굉장히 비효율적인 설계라는 생각이 들었다.기존 코드@Slf4j@Service@RequiredArgsConstructorpublic class GoogleTrendsRssService { private final KeywordService keywordService; private final KeywordMetricHourlyService keywordMetricHou..