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 실행 전에 다른 … 더 읽기

JPA 동시성 이슈 해결: 낙관적 락 vs 비관적 락 완벽 비교 및 실무 가이드

Spring

백엔드 개발자가 로컬 환경에서 혼자 개발하고 테스트할 때는 절대 마주칠 수 없는, 하지만 운영 환경에 배포되자마자 서비스의 신뢰도를 바닥으로 떨어뜨리는 무서운 문제가 있습니다. 바로 ‘동시성 이슈(Concurrency Issue)‘입니다. 가장 대표적인 예가 ‘재고 관리 시스템‘입니다. 재고가 딱 1개 남은 인기 상품이 있다고 가정해 봅시다. 이 상품을 구매하기 위해 사용자 A와 사용자 B가 0.001초의 차이로 동시에 ‘구매’ 버튼을 … 더 읽기

JPA 벌크 연산(Bulk Operation) 완벽 가이드: @Modifying과 영속성 컨텍스트 동기화 전략

Spring

지난 포스팅에서 우리는 JPA의 꽃이라 불리는 변경 감지(Dirty Checking)에 대해 알아보았습니다. 트랜잭션 안에서 엔티티의 값을 수정하기만 하면, JPA가 알아서 UPDATE 쿼리를 날려주는 편리한 기능이었습니다. 하지만 이 변경 감지에는 치명적인 성능적 한계가 존재합니다. 바로 “대량의 데이터를 수정해야 할 때“입니다. 예를 들어, 쇼핑몰 서비스에서 “모든 상품의 가격을 10% 인상한다”라는 요구사항이 있다고 가정해 봅시다. 상품이 100만 개라면 어떻게 될까요? 변경 … 더 읽기

JPA 영속성 컨텍스트 완벽 해부: 1차 캐시와 변경 감지(Dirty Checking) 원리

Spring

Spring Data JPA를 사용하다 보면 신기한 경험을 하게 됩니다. 데이터베이스에서 객체를 조회한 후, setter 메서드로 값을 변경하기만 했는데 별도로 save()나 update() 메서드를 호출하지 않아도 DB에 변경 사항이 반영되는 현상입니다. 마치 자바 컬렉션에서 객체를 꺼내 필드를 수정한 것처럼 자연스럽게 동작합니다. 또한, 같은 ID를 가진 엔티티를 두 번 조회했는데 쿼리 로그에는 SELECT 문이 한 번만 찍히는 경우도 목격하게 됩니다. 이러한 JPA의 ‘마법’ 같은 기능 … 더 읽기

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

Spring

소프트웨어 개발, 특히 데이터베이스를 다루는 백엔드 개발이나 사용자 경험을 중시하는 프론트엔드 개발에서 “성능 최적화”는 영원한 숙제와도 같습니다. 우리는 항상 “어떻게 하면 더 빠르게 데이터를 보여줄 수 있을까?”를 고민합니다. 하지만 아이러니하게도 무조건 빨리, 모든 것을 미리 가져오는 것이 항상 정답은 아닙니다. 때로는 필요한 순간까지 기다렸다가 가져오는 것이 전체 시스템의 리소스를 절약하고 체감 속도를 높이는 지름길이 되기도 … 더 읽기

Java 예외 처리의 핵심: Checked vs Unchecked 차이와 트랜잭션 롤백 전략

Spring

자바(Java) 백엔드 개발자 면접에서 가장 변별력 있는 질문 중 하나이자, 실무에서 데이터 불일치(Data Inconsistency) 문제를 일으키는 주범인 “예외 처리와 트랜잭션 롤백 전략“에 대한 포스팅입니다. 요청하신 Checked Exception과 Unchecked Exception의 차이 및 올바른 트랜잭션 처리 전략을 주제로, 애드센스 승인용 고품질 포스팅을 작성해 드립니다. 자바 개발을 하다 보면 수많은 예외(Exception)를 마주하게 됩니다. 어떤 에러는 빨간 줄이 그어지며 “반드시 try-catch로 … 더 읽기

Spring Boot NoUniqueBeanDefinitionException 해결 방법: 다중 EntityManager 설정

Spring Boot 프로젝트를 진행하다 보면 데이터베이스를 하나가 아닌 여러 개를 연결해야 하는 상황이 종종 발생합니다. 예를 들어, 레거시 DB와 신규 서비스 DB를 동시에 바라봐야 하거나, 읽기 전용과 쓰기 전용 DB를 분리하는 경우입니다. 하지만 이렇게 야심 차게 멀티 데이터 소스를 설정하고 애플리케이션을 실행했을 때, 예상치 못한 Application run failed 메시지와 마주하게 됩니다. 오늘은 Spring Boot 개발자들을 가장 당혹스럽게 … 더 읽기

OEIV : OpenEntityManagerInView

OpenEntityManagerInView (OEIV)는 Spring Framework와 JPA(Java Persistence API)를 함께 사용할 때 발생하는 지연 로딩(Lazy Loading) 문제를 웹 환경에서 해결하기 위해 설계된 패턴이자 Spring에서 제공하는 인터셉터(Interceptor) 1. OEIV의 개념 및 목적 목적 웹 요청 처리 과정 전체에서 JPA의 EntityManager를 열린 상태로 유지하여, View 렌더링 단계에서 발생하는 지연 로딩 예외(Lazy Loading Exception)를 방지 작동 방식 Spring의 DispatcherServlet이 HTTP 요청을 받으면, OpenEntityManagerInViewInterceptor가 트랜잭션과 관계없이 EntityManager를 … 더 읽기