본문 바로가기

transaction

Distributed transaction (분산트랙잭션) (with. Saga pattern) 예전부터 MSA는 많이 듣고 이론으로 많이 접해봤지만, MSA가 완벽히 적용되서 운용되는 서비스를 직접 경험해보지 못했다. 실 운용 서비스에서 연관관계가 높은 서비스들을 어떻게 도메인을 분리하고 통신하고 연동하고 있을지 궁금하다. 대부분 내가 경험해봤던건 모놀리틱 서비스에서 MSA로 넘어가는 과정들이였다. 그 과정 속에서 직접적으로 와닿았던 문제는 크게 다음과 같은 2가지 문제였다. 1. 네트워크 통신 비용 - MSA가 되면 기존과 다르게, 수많이 흩어진 서비스로부터 데이터를 가져와야한다. 어떻게 풀어낼 수 있을까? CQRS? 2. 분산트랜잭션 해당 포스트에선 두번째 문제 분산트랜잭션에 대해서만 다루고, 이를 해결하기 위한 방법을 정리해본다. # 분산 트랜잭션 모든 아키텍쳐가 그렇듯 MSA에도 단점은 존.. 더보기
[Spring] REQUIRES_NEW과 Exception (REQUIRES_NEW는 정말 독립적인가?) 흔히들 많이 사용하고 기본적으로 작동하는 것이 Propagation.REQUIRED 전파 레벨을 사용한다. 그 다음은 여러 이유로 REQUIRES_NEW 전파 레벨이 사용되는 편인데, 이 둘의 개념을 먼저 간단히 살펴보자. Propagation.REQUIRED 트랜잭션이 존재하면 기존의 트랜잭션이 전파된다. 만약 존재하지 않는다면 트랜잭션을 새로 시작한다. Propagtion.REQUIRES_NEW 매번 새로운 트랜잭션을 생성한다. 그렇다면 REQUIRES_NEW는 부모 트랜잭션에서 완전 독립적인 트랜잭션을 생성하는가 ? 꽤나 많은 곳에서 REQUIRES_NEW는 부모와는 아예 독립된 공간을 생성하는 것으로 표현되고 있고 나 역시 그렇게 알고 있었다. 독립된 공간은 부모 트랜잭션과 새롭게 생긴 자식 트랜.. 더보기
JPA 변경감지(Dirty Checking)과 OSIV JPA를 사용할 때 변경 감지를 주의해야한다. 아무런 생각없이 중간 데이터 전달 경로로 엔티티의 필드를 건드린다면, 실제로 DB에도 변경이 적용되기 때문이다. 또한 주의해야할 점은 OSIV를 활성화 시켰을 경우이다. 다음 예제를 살펴보자. fun test() { val product1 = productItemRepository.findById(1L).orElse(null) product1.amount = product1.amount + 1 // 엔티티 값 변경 // osiv가 활성화되어있다면 여기서 product1은 영속성컨텍스트에 계속 살아있게된다. (영속 상태) // osiv가 반대로 비활성화 되어있다면 여기서 product1은 영속성컨텍스트에 남아있지 않는다. (준영속 detach 상태) dirty.. 더보기
JPQL과 영속성 컨텍스트 스프링 웹 프로젝트를 작업할 때, 온전히 JPA만으로 작업하기에는 어려움이 따를 수 있다. 예를 들어, 테이블 중 특정 필드만이 필요한데, JPA로 모든 필드를 메모리에 올리기에는 비효율적인 문제등을 들 수 있을 것이다. JPQL과 JPA를 조합해서 쓸 때 몇가지 주의할 점과 동작하는 방식에 대해 알아본다. 먼저 JPQL의 개념을 간단하게 다시 한번 살펴보자. JPQL JPQL은 SQL과 비슷한 문법을 가진 객체 지향 쿼리이다. JPQL의 탄생 배경은 JPA에서 제공하는 메서드 호출만으로 섬세한 쿼리 작성이 어렵다는 문제로부터 비롯되었다. JPQL로 조회한 엔티티와 영속성 컨텍스트 JPQL로 엔티티를 조회하면 해당 엔티티는 영속성 컨텍스트에서 관리된다. 하지만, 엔티티가 아니라면 영속성 컨텍스트에서 관리.. 더보기