JPA15 동시성 문제 해결방법(Update Query편) "동시에 2명이 좋아요를 눌렀는데 왜 하나만 저장될까?""동시에 눌러도 DB에 2개가 저장 되야 하는거 아니야?" 좋아요 기능을 구현하고 테스트 하던 중 2명의 유저가 동시에 좋아요를 누르는 상황일때, 좋아요 갯수가 한개만 저장되는 문제가 발생했습니다. "왜 이런 문제가 발생할까요?"해결방법을 이야기하기 전에 동시성 문제에 대해 알아보도록 하겠습니다. (이번 편은 여러 해결 방법 중 update 쿼리문으로 해결하는 방법만 이야기 해보겠습니다.) 동시성 문제동시성 문제는 여러 개의 프로그램이 동시에 같은 데이터를 변경하려 할 때 발생하는 문제를 의미합니다.동시에 같은 데이터를 변경하는게 어떤 문제점을 가져올 수 있을까요? 우리 실생활에 적용될 만한 상황 중 은행으로 예시를 들어보겠습니다. 상황 예시XX은.. 2025. 1. 29. save()와 SELECT의 관계 "분명히 save()메서드를 호출했는데, 왜 select 쿼리문이 나가지?""save()랑 select 쿼리문은 어떤 관계가 있는걸까?"예시 코드유저의 팔로우 기능을 구현하는 간단한 예제 코드로 알아보겠습니다.@Overridepublic void save(User user, User targetUser) { UserRelationshipEntity entity = new UserRelationshipEntity(user.getId(), targetUser.getId()); jpaUserRelationRepository.save(entity); //jpaUserRepository.saveAll(List.of(new UserEntity(user), new UserEntity(target.. 2025. 1. 26. JPA와 DB의 동기화 "JPA와 DB는 도대체 어떻게 동기화되는 걸까?"이 질문에 대한 답을 찾기 위해, 이번 글에서는 @Transactional 어노테이션을 통해 JPA의 트랜잭션이 종료되는 시점에 어떤 일이 벌어지는지 하나씩 파헤쳐 보려고 합니다. 트랜잭션 흐름 트랜잭션의 종료 직전에 벌어지는 일을 다루기 전에, 트랜잭션의 전체 흐름을 간단하게 살펴보겠습니다.다음은 @Transactional을 사용하는 간단한 코드 예제입니다. @Service@RequriedArgsConstructorclass PostService { private final PostRepository; @Transactional public void updatePost(Long postId, String content) { .. 2025. 1. 26. 🙆🏻♂️ 너, Fetch Join 만능이야? N+1 문제를 해결하기 위한 방법 Fetch Join사용하는 것이 무조건 정답일까? 결론부터 이야기해보자!Fetch Join도 한계점을 가진다.📍 Fetch Join의 한계점🚫 페치 조인을 사용하면 별칭을 줄 수 없다.🚫 컬렉션이 두개 이상인 경우 사용할 수 없다.🚫 컬렉션 페치 조인시 페이징을 사용할 수 없다. 🔎 왜 페치 조인을 사용하면 별칭을 줄 수 없을까?String query = "select u from User u join fetch u.team t where t.name = 'A'; 이러한 쿼리문과 같이 별칭을 사용해서 조건을 추가하게 되는 경우, 기존 페치 조인으로 가져올 데이터의 일부가 누락될 수 있다. 🙆🏻♂️ 좀 더 디테일한 상황 예시(비교) 개발자 A씨는 유저의.. 2024. 9. 24. 🙆🏻♂️ 너, Fetch Join 좀 알고 싶다? Fetch Join이랑 친해지는 시간을 갖도록 하겠습니다. fetch Join은 실무에서 엄청 중요하다. - 김영한님 - 🔎 Fetch Join이 뭘까?1. JPQL에서 성능 최적화를 위해 제공하는 기능2. 연관된 엔티티 및 컬렉션을 한번의 쿼리로 조회하는 기능 🔎 위에 나온 두 기능이 뭔데?우선, 연관된 엔티티 및 컬렉션을 한번의 쿼리로 조회 하는 기능을 먼저 알아보겠습니다. 현재, 회원 엔티티와 팀 엔티티가 팀을 기준으로 1:N 관계를 맺고 있습니다.1:N 관계는 한개의 팀에 여러명의 회원이 오는 관계입니다. 코드는 다음과 같습니다. 회원 엔티티package com.example.spring_jpa_basic.페치조인;impo.. 2024. 9. 22. @DataJapTest를 사용하는 이유 package com.example.payment.transferHistory;import com.example.payment.transferHistory.entity.TransferHistory;import jakarta.persistence.EntityManager;import jakarta.persistence.PersistenceContext;import java.math.BigDecimal;import org.assertj.core.api.SoftAssertions;import org.junit.jupiter.api.DisplayName;import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Aut.. 2024. 7. 17. 이전 1 2 다음