Spring Data JPA unexpected row count 삭제 오류 해결 방법

Spring Data JPA에서 엔티티를 삭제할 때 Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1 오류가 발생하는 경우가 있다. DELETE SQL 자체는 단순하지만, Hibernate가 예상한 삭제 건수와 데이터베이스가 반환한 삭제 건수가 다르면 예외로 처리될 수 있다. 특히 동일한 데이터를 여러 요청이 삭제하거나, 조회한 엔티티가 실제 DELETE 실행 전에 다른 … 더 읽기

Spring Security OAuth2 Client 완벽 가이드: 카카오/구글 소셜 로그인부터 JWT 발급 아키텍처까지

Springsecurity

Spring Security OAuth2 Client 완벽 가이드: 카카오/구글 소셜 로그인부터 JWT 발급 아키텍처까지 1. 서론 현대 웹 애플리케이션에서 소셜 로그인(Social Login)은 선택이 아닌 필수 기능이 되었습니다. 사용자 입장에서는 귀찮은 회원가입 절차를 건너뛸 수 있어 편리하고, 서비스 제공자 입장에서는 비밀번호 관리의 부담을 덜고 검증된 사용자 정보를 얻을 수 있다는 확실한 이점이 있기 때문입니다. 하지만 개발자 입장에서 소셜 … 더 읽기

Spring Security 권한 부여(Authorization) 완벽 가이드: RoleHierarchy 계층 권한과 @PreAuthorize 실무 적용

Springsecurity

Spring Security 권한 부여(Authorization) 완벽 가이드: RoleHierarchy 계층 권한과 @PreAuthorize 실무 적용 1. 서론 지난 포스팅들을 통해 우리는 사용자의 신원을 증명하는 인증(Authentication) 과정을 마스터했습니다. 세션과 JWT 중 아키텍처를 선택하고, 필터 체인을 커스텀하여 토큰을 검증하는 단계까지 구축했습니다. 이제 우리는 “이 사용자가 누구인가?”라는 질문을 넘어, “이 사용자가 무엇을 할 수 있는가?“라는 인가(Authorization, 권한 부여)의 영역으로 진입해야 합니다. 많은 초급 … 더 읽기

Spring Security 필터 체인(Filter Chain) 완벽 해부 및 커스텀 필터 적용 실무 가이드

Springsecurity

Spring Security의 진입 장벽이 높은 가장 큰 이유는 바로 ‘필터 체인(Filter Chain)‘이라는 독특한 아키텍처 때문입니다. 이 구조를 이해하지 못하면 단순히 코드를 복사해서 붙여넣는 수준을 벗어날 수 없습니다. 오늘은 이 블랙박스를 열어 내부 구조를 파악하고, 원하는 위치에 나만의 로직을 심는 방법을 마스터해 보겠습니다. Spring Security 필터 체인(Filter Chain) 완벽 해부 및 커스텀 필터 적용 실무 가이드 … 더 읽기

Spring RestDocs vs Swagger 비교: 테스트 기반 API 문서 자동화의 정석 (Spring Boot 3.x)

Spring

Spring RestDocs vs Swagger 비교: 테스트 기반 API 문서 자동화의 정석 1. 서론 백엔드 개발자와 프론트엔드 개발자(혹은 모바일 앱 개발자) 사이에서 가장 빈번하게 발생하는 갈등의 원인은 무엇일까요? 바로 “API 문서와 실제 동작의 불일치“입니다. “문서에는 필드명이 userId라고 되어 있는데 왜 실제로는 id가 오나요?”, “이 API는 404 에러가 없다고 되어 있는데 왜 404가 뜨나요?”와 같은 질문을 받는 … 더 읽기

Spring Security 보안 강화: Redis 기반 Refresh Token Rotation(RTR) 및 블랙리스트 전략 완벽 가이드

Springsecurity

Spring Security 보안 강화: Redis 기반 Refresh Token Rotation(RTR) 및 블랙리스트 전략 완벽 가이드 1. 서론 지난 포스팅에서 우리는 MSA 및 모바일 환경에서의 확장성을 위해 JWT(Json Web Token) 기반의 인증 아키텍처를 선택하는 것이 유리함을 확인했습니다. 하지만 동시에 JWT가 가진 치명적인 약점인 ‘한번 발급되면 서버가 제어할 수 없다(Stateless)’는 딜레마에 대해서도 논의했습니다. 만약 유효기간이 긴 Refresh Token이 … 더 읽기

Spring Security 통합 계정 설계: 세션(Session) vs JWT 토큰 아키텍처 비교 및 선택

Springsecurity

Spring Security 통합 계정 설계: 세션(Session) vs JWT 토큰 아키텍처 비교 및 선택 1. 서론 웹 서비스의 규모가 커지고 아키텍처가 모놀리식(Monolithic)에서 마이크로서비스(MSA)로 진화함에 따라, 개발자들이 가장 먼저 마주하는 난관 중 하나는 바로 ‘인증(Authentication) 시스템의 설계‘입니다. 과거 단일 서버 시절에는 별다른 고민 없이 사용하던 세션(Session) 방식이, 서버가 여러 대로 늘어나고 도메인이 분리되는 통합 계정 환경에서는 확장성의 발목을 잡는 … 더 읽기

Spring Boot 테스트 완벽 가이드: JUnit5 단위 테스트부터 TestContainers 통합 테스트까지

Spring

Spring Boot 테스트 완벽 가이드: JUnit5 단위 테스트부터 TestContainers 통합 테스트까지 1. 서론 소프트웨어 개발 수명 주기(SDLC)에서 ‘테스트’가 차지하는 비중은 날이 갈수록 커지고 있습니다. 과거에는 일정에 쫓겨 “기능 구현만 되면 배포”하는 문화가 만연했지만, 이제는 서비스의 복잡도가 증가하고 배포 주기가 짧아지면서 테스트 코드 없는 배포는 곧 재앙을 의미하게 되었습니다. 버그를 발견하는 시점이 늦어질수록, 즉 개발 단계에서 … 더 읽기

JPA 성능 최적화의 핵심: Lazy Loading(지연 로딩) vs Eager Loading(즉시 로딩) 완벽 비교와 실무 가이드

Spring

JPA 성능 최적화의 핵심: Lazy Loading(지연 로딩) vs Eager Loading(즉시 로딩) 완벽 비교와 실무 가이드 1. 서론 소프트웨어 개발, 특히 데이터베이스를 다루는 백엔드 개발이나 사용자 경험을 중시하는 프론트엔드 개발에서 “성능 최적화”는 영원한 숙제와도 같습니다. 우리는 항상 “어떻게 하면 더 빠르게 데이터를 보여줄 수 있을까?”를 고민합니다. 하지만 아이러니하게도 무조건 빨리, 모든 것을 미리 가져오는 것이 항상 … 더 읽기

Spring Boot 빈(Bean) 생명주기와 스코프(Scope) 총정리: 싱글톤부터 프로토타입까지

java

앞선 포스팅에서 스프링의 핵심 엔진인 DI(의존성 주입)와 IoC(제어의 역전)를 통해 객체 관리를 프레임워크에 위임한다는 사실을 배웠습니다. 그렇다면 스프링 컨테이너에 맡겨진 이 객체(Bean)들은 도대체 언제 태어나서, 언제 죽는 것일까요? 또, 요청할 때마다 매번 새로운 객체가 만들어지는 걸까요, 아니면 하나를 계속 돌려 쓰는 걸까요? 이 질문에 대한 답이 바로 오늘 다룰 빈 생명주기(Bean Lifecycle)와 빈 스코프(Bean Scope)입니다. 이 두 … 더 읽기