일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 격파르타후기
- sqld자격증합격
- java 자료구조 활용
- java알고리즘
- 프로그래머스제일작은수
- 항해99후기
- java map 저장
- 격파르타비전공자
- 노베이스부트캠프
- java set 출력
- javaJRE
- java map 출력
- java알고리즘문제풀이
- java set 저장
- 항해15기
- 비전공자sqld
- 격파르타장점
- 컴파일
- 프로그래머스
- 격파르타합격후기
- java list 저장
- java기본자료형
- 인터프린터언어
- 작은수제거하기
- java map
- javaJVM
- 코딩부트캠프후기
- java list 출력
- java최솟값구하기
- java참조자료형
- Today
- Total
코딩과 결혼합니다
230727 - @Transactional 을 사용하는 이유 본문
@Transactional
@Transactional 작동 원리와 흐름
1. @Transactional이 클래스 내의 메서드에 붙을 때, Spring은 해당 메서드에 대한 프록시를 만든다.
프록시 패턴은 디자인 패턴 중 하나로, 어떤 코드를 감싸면서 추가적인 연산을 수행하도록 강제하는 방법이다.
2. 트랜잭션의 경우, 트랜잭션의 시작과 연상 종료시의 커밋 과정이 필요하므로, 프록시를 생성해 해당 메서드의 앞뒤에
트랜잭션의 시작과 끝을 추가하는 것이다.
3.스프링 컨테이너는 트랜잭션 범위의 영속성 컨텍스트 전략을 기본으로 사용한다. 서비스 클래스에서 @Transaction을
사용할 경우, 해당 코드 내의 메서드를 호출할 때 영속성 컨텍스트가 생긴다.
4. 영속성 컨텍스트는 트랜잭션 AOP가 트랜잭션을 시작할 때 생겨나고, 메서드가 종료되어 트랜잭션 AOP가 트랜잭션을
커밋할 경우 영속성 컨텍스트가 flush되면서 해당 내용이 반영된다. 이후 영속성 컨텍스트 역시 종료되는 것이다.
JPA 더티체킹
Dirty - 여기서는 '상태의 변화가 생기다.' 정도의 의미로 이해한다.
JPA에서는 트랜잭션이 끝나는 시점에 변화가 생긴 모든 엔티티들을 데이터베이스에 자동으로 반영해 준다.
JPA에서 영속성 컨텍스트가 관리하고 있는 엔티티를 조회하면 해당 엔티티의 조회 상태로 '스냅샷'을 만들어놓고, 트랜잭션이 끝나는 시점에 스냅샷과 비교하여 변화가 생긴다면 update를 해서 데이터베이스로 전달하게 된다.
@Transactional을 사용했을 때 save가 필요 없는 이유
Dirty Checking은 트랜잭션이 commit 될 때 작동한다. 그렇다면 transaction이 실행 되도록 해줘야 하니 @Transactional 어노테이션을 사용한다. 이 어노테이션을 붙여주면 더티체킹을 하게 되고, 데이터베이스에 commit을 해서 수정된 사항을 save 없이도 반영할 수 있다.
'2세 > Spring' 카테고리의 다른 글
[Kotlin] 개념과 기초 문법 (0) | 2024.01.20 |
---|---|
230816 - Controller에서 JPA Entity를 반환하면 안되는 이유 (0) | 2023.08.17 |
230726 - Spring Transaction (0) | 2023.07.26 |
230725 - .gitignore가 적용되지 않을 때 Git 캐시 삭제 (민감 정보 감추기 ) (0) | 2023.07.25 |
230722 - Post 생성 + 수정 기능 에러 해결 (0) | 2023.07.22 |