Technology 46

JPA 사용 시 스프링 트랜잭션 애노테이션 누락을 유의해야되는 경우들

JPA 에서의 영속성 컨텍스트와 스프링 트랜잭션JPA 에서 영속성 컨텍스트는 엔티티를 영구 저장하는 환경으로서 엔티티 매니저로 엔티티를 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리한다. 이때 영속성 컨텍스트가 엔티티를 관리하면 여러가지 이점이 있다. 대표적으로 1차 캐시, 트랜잭션을 지원하는 쓰기 지연, 변경 감지, 지연 로딩 등이 있다. 스프링이나 J2EE 컨테이너 환경에서 JPA 를 사용하면 영속성 컨텍스트의 생존 범위가 스프링  트랜잭션의 범위와 같다. 즉 스프링에서 지원하는 트랜잭션을 시작할 때 영속성 컨텍스트가 생성되고 해당 트랜잭션이 끝날 때 영속성 컨텍스트를 종료하는 것이다. 참고로 같은 트랜잭션 안에서는 항상 같은 영속성 컨텍스트에 접근한다.  스프링 트랜잭..

Technology/JPA 2024.04.25

트랜잭션 격리수준 Repeatable Read 가 필요한 이유

Non-Repeatable Read 는 언제 문제가 되는가? MySQL 의 InnoDB 스토리지 엔진에서 기본으로 사용되는 트랜잭션 격리수준은 Repeatable Read 이다. 이때 Repeatable Read 에서는 다른 트랜잭션 격리수준인 Read Uncommitted 나 Read Committed 에서와 달리 Non-Repeatable Read 현상이 발생하지 않는다. 여기서 Non-Repeatable Read 란 하나의 트랜잭션에서 같은 값을 두 번 select 했을 때 각각 다른 값이 읽히는 현상이다. 참고로 ANSI SQL 1992 에서는 Non-Repeatable Read 현상을 아래와 같이 서술하고있다. 하나의 예시로서 아래와 같은 시나리오들이 존재할 수 있다. 참고로 트랜잭션 A 의 경..

Technology/MySQL 2024.03.23

데이터 마이그레이션을 위한 Update 쿼리 성능 개선

실행 시간이 1시간 이상 소요되는 악성 SQL... 오늘은 실무 초기에 SQL 을 작성하면서 실수했었던 부분에 대해 다루고자 한다. 🐥 실무에서 데이터 마이그레이션을 위해 Update 쿼리를 작성해본 경험이 있었는데, 테스트 환경에서 실행해본 결과 실행 시간이 무려 1시간을 훌쩍 넘긴 일이 있었다...👀 뭔가 잘못됐음을 직감하고 일단 SQL 실행계획부터 확인해보기로 했다. SQL 의 형태는 대략 아래와 같은 구조였다. (참고로, 이름은 임의로 명명했다.) UPDATE a_table a JOIN b_table b ON CAST(a.index_id AS CHAR) = CAST(b.id AS CHAR) JOIN c_table c ds ON b.c_id = c.id SET a.text = ... WHERE a...

Technology/MySQL 2024.02.25

SOP(Same Origin Policy)의 한계와 쿠키(Cookie)의 SameSite 속성의 활용

목차 1. SOP 와 SameSite 와 관련한 추억..💫 2. SOP 의 필요성 2-1. SOP 란? 2-2. Same Origin vs Cross Origin 2-3. SOP 매커니즘 이해하기 2-4. Preflight Request 란? 3. Spring boot 의 Preflight Request 처리 과정, 간단하게 살펴보기! 4. SOP 의 한계 5. 쿠키의 SameSite 속성에 대해 알아보자! 5-1. SameSite 란? 5-2. Same Site vs Cross Site 6. SameSite 속성별 필요성 6-1. SameSite = None 6-2. SameSite = Strict 6-3. SameSite = Lax 7. 오늘날 SameSite 사용에 대한 고찰 1. SOP 와 Sam..

Technology/Web 2024.02.20

트랜잭션 격리수준 Serializable 에 대한 고찰

트랜잭션 격리수준 Serializable, 왜 사용할까? 온보딩 당시 비지니스 로직을 살펴 보는 중 서비스 레이어 계층에서 스프링이 제공하는 트랜잭션 AOP 기능을 적용 시 트랜잭션 격리수준이 Serializable 로 설정 되어있는 것을 확인할 수 있었다. 참고로, 스프링이 제공하는 트랜잭션 AOP 기능은 개발자가 별도로 트랜잭션 격리수준을 설정하지 않을 경우 데이터소스의 기본 트랜잭션 격리수준을 따르게 된다. @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public @interface Transactional { // ... /** * The transac..

Technology/MySQL 2024.02.13