본문 바로가기

Jpa38

엔티티 매니저 왜 thread-safe 하도록 해야하는지? 엔티티 매니저 왜 thread-safe 하도록 해야하는지? EntityManagerFactory 는 thread-safe 한 처리가 돼있음. EntityManager 는 thread-safe 한 처리가 안돼있음. 그렇기에 EntityManager 는 여러 스레드에서 접근하면 안된다. EntityManager 를 통해 DB 에 접근해서 데이터를 CRUD 할텐데. 그 안에서 여러 스레드가 들어와서 데이터를 마구잡이로 바꾼다면 데이터 동시성 보장이 안된다. 2020. 11. 18.
MyBatis, Jpa 2개를 동시에 처리하는 트랜잭션 매니저 MyBatis, Jpa 2개를 동시에 처리하는 트랜잭션 매니저 JpaTransactionManager Spring 은 PlatformTransactionManager 인터페이스를 사용 Jpa 는 JpaTrasactionManager 을 사용하고 있는데 DataSource 에 직접 접근해서 사용하기에 Jpa, MyBatis 를 묶을 수 있다. 이 때, MyBatis-Spring 은 SqlSession 이 아닌 SpringTransaction 에 트랜잭션을 위임 (그렇기에 묶을 수 있음) ChaniedTransactionManager 트랜잭션 묶는 원리가 그냥 순차적으로 트랜잭션을 실행 reference https://lemontia.tistory.com/907 2020. 10. 21.
spring-boot Jpa 복합키 설정 Embedded spring-boot Jpa 복합키 설정 Embedded spring-boot 에서 Jpa 복합키를 설정. Embedded 방식으로. @Entity @Getter @Setter @NoArgsConstructor public class CompositeDomain { @EmbeddedId private EmbeddedDomain embeddedDomain; private String content; } import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; import java.io.Serializable; @Getter @Setter @NoArgsConstructor public c.. 2020. 9. 6.
spring boot, jpa save 동작 원리 (merge, persist) spring-data-jpa 에서 save 동작 원리 source 부터 살펴보기. 아래 소스를 살펴보면 entity 가 이미 영속성에 등록돼있으면 merge 를 없으면 persist 를 실행하게 돼있다. merge 는 해당 ID 가 영속성에 존재하면 update 를 수행. 없으면 INSERT 를 수행한다. 여기서 주의할 점은 ID 가 없을 경우 SELECT 를 시도하는 경우가 있을 수 있다는 것. 기본키 생성 전략이 없을 경우 (애플리케이션에서 생성) SELECT 를 수행한 후, INSERT 를 실행하기에 쿼리가 2배로 실행됨. persist 의 경우 INSERT 쿼리만 실행 됨. 즉, 정리하면 merge 는 기존의 객체가 존재할 경우 사용하면 좋고, persist 는 새로운 객체를 생성할 때 좋음. @.. 2020. 7. 25.