전체 글(140)
-
Jpa Update 안됨, Dirty Check 오류, 다중 DataSource
오늘은 같은 트랜잭션 내에서 Dirty Check 오류가 발생해 엔티티 값이 갱신 되지 않는 문제에 봉착했다. Update가 실행되지 않는 원인은 크게 3가지다.값이 변경되지 않음엔티티 설정이 updateable = false트랜잭션 경계 오류난 이중 크게 보면 3번의 원인에 해당된다 볼 수 있다. 지금 프로젝트 환경은 dataSource 설정을 통해 두개의 db를 연결해 사용하고 있고 우선 순위가 현재 엔티티를 관리하는 dataSource에 있는 것이 아니라 다른 dataSource 환경에 우선 순위가 주어지고 있어 Dirty Check가 다른 트랜잭션 매니저에게 먹혀 update가 누락된 것이다. 원인 순서 @Primary가 meta TM에 걸려 도메인 JPA 로직도 meta TM로 처리됨.그래서..
2025.08.12 -
Spring Cloud Api GateWay Global Filter(전역 필터)를 삭제한 이유
Spring Cloud를 이용한 프로젝트를 진행하며 Global Filter를 제외한 이유 4가지 전역 필터는 작은 변경에도 전체 트래픽에 영향을 줘 혼란을 준다.예외 경로가 생길 수 록 if/else와 같이 분기 코드가 추가되어야 한다.내부/외부 통신간의 보안 권한 분류가 깨진다.모든 요청에 대한 같은 작업을 반복하는 문제1) 전역 예외 리스트 특히 모듈 서버가 추가될 때 api 엔드포인트 별 예외 사항이 추가될 때 마다 라우트 별 필터에 해당 엔드 포인트 예외 사항을 일일히 추가해야 되었고 이 때문에 누락된 혹은 생각지 못한 오류가 계속 발생하였습니다. 회원가입/로그인/토큰 재발급 같은 공개 엔드포인트가 늘수록 전역 필터엔 path.startsWith(...) 예외가 누적되고 경로 하나만 틀려도 인증..
2025.08.10 -
멀티테넌시 스키마 분리 전략
MSA 구조 설계 중 사용자 DB 관리에 사용된 방식으로 하나의 소프트웨어 인스턴스가 여러 사용자 그룹 또는 테넌트를 지원하도록 설계된 아키텍처입니다. 쉽게 말해 여러 사용자가 동일한 소프트웨어와 인프라를 공유하면서도 서로의 데이터나 설정을 간섭받지 않고 독립적으로 서비스를 이용할 수 있는 구조입니다. 다수의 이용자들을 하나의 애플리케이션 서비스를 제공하고 사용자별 데이터를 노출되지 않도록 완전 분리함. 아키텍처 전체 흐름클라이언트 요청 수신필터/인터셉터에서 헤더에서 테넌트 식별자 추출(GateWay 서버에서 request에 추가되어 전달됨)Spring JPA 호출 시DynamicDataSourceRouter가 TenantContext로부터 lookup key(테넌트 ID) 결정기존에 생성된 Dat..
2025.06.28 -
SSR 기반 Spring Server 모니터링 생성기 (Prometheus, Grafana, Spring Security)
모니터링 서버 자체를 구축하는 방법은 크게 어렵지 않았지만 그 과정에서 서버에 적용된 Security에 대해 다시 공부해보는 계기가 되었습니다. 총 두가지 방법으로 모니터링 페이지를 구축하였습니다.Spring Security의 별도 SecurityFilterChain 생성 + 모니터링 전용 Id와 role을 생성Spring Security의 별도 SecurityFilterChain 생성 + 도커 내부망 통신Spring Security의 별도 SecurityFilterChain 생성 + 모니터링 전용 Id와 role을 생성 필터 체인의 적용 순서기존 SecurityFilterChain이 먼저 선언되어 있으면, 기존 로그인 방식(LoginForm)을 사용하지 않는 문제가 발생합니다.이를 해결하기 위해 별도..
2025.03.27 -
Jpa Save vs SaveAll 성능 차이 체감해보기
프로젝트를 진행하면서 JPA의 save와 saveAll 메서드를 사용해 데이터를 저장하게 됩니다. 일반적으로 100개 미만의 데이터를 저장할 때는 두 메서드 간의 성능 차이를 크게 느끼지 못할 수 있습니다. 그러나 대량의 데이터를 저장할 때는 두 메서드의 성능 차이가 매우 크다는 점을 확인할 수 있었습니다. 이번 글에서는 이 차이에 대해 살펴보고 각각의 사용 시 주의해야 할 점을 정리해 보겠습니다. Save vs SaveAll 차이점 save와 saveAll의 가장 큰 차이는 트랜잭션의 생성 방식과 처리 방식에 있습니다.동작 방식: 데이터를 하나씩 저장하며, 호출될 때마다 별도의 트랜잭션을 생성하여 처리합니다.특징: N개의 데이터를 저장할 경우 N번의 트랜잭션이 생성됩니다.동작 방식: 한 번의 트랜잭션 ..
2025.01.11 -
Redis Cluster 모드 생성 및 배포 (feat: redis Redisson, Synology NAS, Spring boot Cache 연동)
목차Redis Cluster 란?Redis Cluster 로컬환경 배포Redis Cluster 클라우드 환경 배포redis.conf 파일 수정redis 연결 테스트spring boot 캐싱 테스트 Redis Cluster 란? 여러개의 master를 두고 데이터를 분산 저장하며 수평적인 확장을 가능하게 만들어 준다. 즉 서버의 필요 상태에 따라 저장 공간을 늘리거나 줄이는 것이 용의하다. 각각의 마스터들에는 하나 이상의 slave가 매핑될 수 있으며 해당 slave는 master 상태가 비정상적인 경우 master로 승급되며 이전 데이터 상태를 유지하며 다시 redis 서버가 중지 없이 가동 될 수 있게 만들어 준다. Redis Cluster 로컬환경 배포 3M - 3S 먼저 로컬 환경에는 redis ..
2025.01.06