Spring Framework/Spring Data JPA

여러 스레드가 동시에 하나의 데이터에 접근해서 값을 수정하는 경우 race condition(경쟁 조건)이 발생할 수 있다. 이를 해결하기 위한 방법에는 여러가지가 있는데 이번 포스팅에는 Optimistic Lock을 활용하여 해결해 보도록 한다. 데이터베이스 동시성 이슈 해결하기 시리즈 1. Optimistic Lock 2. Pessimistic Lock 3. Named Lock 4. Redis Lettuce 5. Redis Redisson Optimistic Lock(낙관적 락) 낙관적 락은 여러 사용자가 동시에 같은 데이터를 수정하는 경우가 드물다고 가정할 때 주로 사용한다. 따라서 Lock을 걸지 않고 충돌이 발생하면 그때마다 엔티티의 버전을 비교하여 동시성 이슈를 해결하는 방식이다. 즉, DB ..
벌크 연산은 데이터를 한번에 수정하는 것을 의미한다. 벌크 연산은 1차 캐시를 거치지 않고 DB로 바로 접근하여 SQL을 실행하여 값을 수정한다. 따라서, 1차 캐시를 반드시 초기화 해야 한다. 1차 캐시를 초기화하지 않으면 벌크 연산으로 인해 수정된 DB 데이터와 1차 캐시에 있는 데이터의 정합성이 깨지게 된다. 순수 JPA를 사용하여 벌크 연산하기 @Repository public class MemberJpaRepository { public int bulkAgePlus(int age) { return entityManager.createQuery( "update Member m set m.age = m.age + 1 where m.age >= :age" ) .setParameter("age", ag..
이번 포스팅에서는 JPA N+1 문제 해결 방법에 세 가지를 알아본다. N+1 문제란? N+1 문제는 한 번의 select 쿼리를 실행했을 때 N+1번의 select 쿼리가 실행되는 것을 의미한다. N+1 문제를 강제로 발생시켜보자. Member 클래스와, Team 클래스는 아래와 같다. // Member.java @Entity @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) @ToString(of = {"id", "username", "age"}) public class Member { @Id @GeneratedValue @Column(name = "member_id") private Long id; private String na..
@JoinColumn은 다대일 또는 일대다 연관관계를 매핑할 때 사용한다. 아래의 Member 클래스와 Order 클래스를 살펴보자. @Entity @Getter @Setter public class Member { @Id @GeneratedValue @Column(name="member_id") private Long id; @OneToMany(mappedBy = "member") private List orders = new ArrayList(); } @Entity @Table(name="orders") @Getter @Setter public class Order { @Id @GeneratedValue @Column(name="order_id") private Long id; @ManyToOne(f..
ctp102
'Spring Framework/Spring Data JPA' 카테고리의 글 목록