본문 바로가기

JPA38

Spring Repository 와 Entity 영속성 컨텍스트의 관계 파악 Spring Repository 와 Entity 영속성 컨텍스트의 관계 파악 Spring Repository 와 EntityManager 관계 하나의 서비스에서 (같은 스레드) 여러 개의 repository 를 호출한다고 해보자. 2개의 repository 는 1개의 EntityManager 를 공유하게 됨. 같은 스레드에서 순차적으로 호출할테니 동시성 문제는 없겠지. Spring 에서 Entity 변경 시, 일어나는 과정 Controller —> Service —> Repository select, save 호출 이라고 가정. Controller 에는 Transaction 설정이 안돼있다면 Repository.save 를 호출하는 순간 Transaction 이 만들어지고 자동으로 커밋이 이루어질 것이다.. 2020. 11. 19.
엔티티 매니저 왜 thread-safe 하도록 해야하는지? 엔티티 매니저 왜 thread-safe 하도록 해야하는지? EntityManagerFactory 는 thread-safe 한 처리가 돼있음. EntityManager 는 thread-safe 한 처리가 안돼있음. 그렇기에 EntityManager 는 여러 스레드에서 접근하면 안된다. EntityManager 를 통해 DB 에 접근해서 데이터를 CRUD 할텐데. 그 안에서 여러 스레드가 들어와서 데이터를 마구잡이로 바꾼다면 데이터 동시성 보장이 안된다. 2020. 11. 18.
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.