์ค๋ ํ ๊ณต๋ถ ๐ง
ํ์ ๊ณผ์ ์์
- Level 1
- @Transactional์ ์ดํด
- ํ์ฌ ๊ธฐ๋ณธ์ ์ผ๋ก TodoService์ ๋ชจ๋ ๋ก์ง์ด @Transactional(readOnly = true)๋ก ์ค์ ๋์ด ์๋ค.
- ๊ทธ๋์ saveTodo( ) ๋ฉ์๋๊ฐ ์คํ๋ ๋๋ ๊ฐ์ ์ค์ ์ด ๋ค์ด๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํ๊ณ ์๋ค.
- DB๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ ๊ฒฝ์ฐ์๋ ๋ฐ๋ก @Transactional ์ด๋ ธํ ์ด์ ์ ๋ถ์ฌ์ค์ผ ์ ์์ ์ผ๋ก ์๋ํ๋ค.
- JWT์ ์ดํด
- @Transactional์ ์ดํด
๊ถ๊ธํ๋ ๋ด์ฉ
๊ฐ๊ฐ์ ๋ฉ์๋ ์์ ๋ฐ๋ก @Transactional์ ๋ถ์ฌ์ฃผ๋ฉด ๋์ง ์์๊น? ์ ์ ์ฒด ์ ์ฉ์ ํ๋ ๊ฑฐ์ง??
@Transactional(readOnly = true)๋ฅผ ์ฌ์ฉํ๋ฉด ์กฐํ์ฉ ๋ฉ์๋์ ๋ํด์ ์ฑ๋ฅ์ ์ด์ ์ ์ป์ ์ ์๋ค.
๋ฐ์ดํฐ ์ผ๊ด์ฑ
์ผ๋ฐ์ ์ผ๋ก ํธ๋์ญ์ ์ ์ฌ์ฉํด์ DB์ ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ๊ณผ ๋ฌด๊ฒฐ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋ฐ ํธ๋์ญ์ ์ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ์ค์ ํ๋ฉด ์ค์๋ก ๋ฐ์ดํฐ๋ฅผ ์์ ํด์ ์ผ๊ด์ฑ์ ์๋ฐํ ๊ฐ๋ฅ์ฑ์ด ๋ฎ์์ง๋ค. ์กฐํํ๋ ๋ฉ์๋์์๋ ์ผ๊ด์ฑ์ ์๋ฐํ๊ฒ ๋ ์ฐ๋ ค๊ฐ ์๊ธฐ์ ํญ์ ์ฃผ์๋ฅผ ํด์ผ ํ๋ค.
๊ฐ๋ ์ฑ ํฅ์
์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฐ๋ฐ์๋ @Transactional(readOnly = true)๊ฐ ์ค์ ๋ ๋ฉ์๋๊ฐ DB์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ธฐ๋ง ํ๋ค๋ ๊ฒ์ ๋ช ํํ๊ฒ ํ์ธํ ์ ์๋ค. ์ด๋ก ์ธํด ์ฝ๋์ ๊ฐ๋ ์ฑ์ด ํฅ์๋๋ค.
// 1
@Transactional
public Member getMember(Long memberId) {
return memberRepository.findById(memberId)
.orElseThrow(() -> new CustomException(ErrorCode.MEMBER_NOT_FOUND));
}
// 2
@Transactional(readOnly = true)
public Member getMember(Long memberId) {
return memberRepository.findById(memberId)
.orElseThrow(() -> new CustomException(ErrorCode.MEMBER_NOT_FOUND));
}
์ฑ๋ฅ ์ต์ ํ
JPA์ ์์์ฑ ์ปจํ
์คํธ๊ฐ ์ํํ๋ ๋ณ๊ฒฝ ๊ฐ์ง์ ๊ด๋ จ์ด ์๋ค.
์์์ฑ ์ปจํ
์คํธ๋ Entity ์กฐํ ์ ์ด๊ธฐ ์ํ์ ๋ํ Snapshot์ ์ ์ฅํ๋ค. ํธ๋์ญ์
์ด Commit ๋ ๋, ์ด๊ธฐ ์ํ์ ์ ๋ณด๋ฅผ ๊ฐ์ง๋ Snapshot๊ณผ Entity์ ์ํ๋ฅผ ๋น๊ตํ์ฌ ๋ณ๊ฒฝ๋ ๋ด์ฉ์ ๋ํด update query๋ฅผ ์์ฑํด ์ฐ๊ธฐ ์ง์ฐ ์ ์ฅ์์ ์ ์ฅํ๋ค.
๊ทธ ํ, ์ผ๊ด์ ์ผ๋ก ์ฐ๊ธฐ ์ง์ฐ ์ ์ฅ์์ ์ ์ฅ๋์ด ์๋ SQL Query๋ฅผ flush ํ๊ณ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํธ๋์ญ์
์ Commit ํจ์ผ๋ก์จ ์ฐ๋ฆฌ๊ฐ update์ ๊ฐ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ Entity์ ์์ ์ด ์ด๋ฃจ์ด์ง๋ค.
์ด๋ฅผ ๋ณ๊ฒฝ ๊ฐ์ง(Dirty Checking)์ด๋ผ๊ณ ํ๋ค.
readOnly = true๋ฅผ ์ค์ ํ๊ฒ ๋๋ฉด ์คํ๋ง ํ๋ ์์ํฌ๋ JPA์ ์ธ์
ํ๋ฌ์ฌ ๋ชจ๋๋ฅผ MANUAL๋ก ์ค์ ํ๋ค.
MANAUL ๋ชจ๋๋ ํธ๋์ญ์ ๋ด์์ ์ฌ์ฉ์๊ฐ ์๋์ผ๋ก flush๋ฅผ ํธ์ถํ์ง ์์ผ๋ฉด flush๊ฐ ์๋์ผ๋ก ์ํ๋์ง ์๋ ๋ชจ๋์ด๋ค.
ํธ๋์ญ์
๋ด์์ ๊ฐ์ ๋ก flush()๋ฅผ ํธ์ถํ์ง ์๋ ํ, ์์ ๋ด์ญ์ ๋ํด DB์ ์ ์ฉ๋์ง ์๋๋ค.
์ด๋ก ์ธํด ํธ๋์ญ์
Commit ์ ์์์ฑ ์ปจํ
์คํธ๊ฐ ์๋์ผ๋ก flush ๋์ง ์์ผ๋ฏ๋ก ์กฐํ์ฉ์ผ๋ก ๊ฐ์ ธ์จ Entity์ ์์์น ๋ชปํ ์์ ์ ๋ฐฉ์งํ ์ ์๋ค.
๋ํ, ReadOnly = true๋ฅผ ์ค์ ํ๊ฒ ๋๋ฉด JPA๋ ํด๋น ํธ๋์ญ์
๋ด์์ ์กฐํํ๋ Entity๋ ์กฐํ์ฉ์์ ์ธ์ํ๊ณ ๋ณ๊ฒฝ ๊ฐ์ง๋ฅผ ์ํ Snapshot์ ๋ฐ๋ก ๋ณด๊ดํ์ง ์์ผ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ ์ฝ๋๋ ์ฑ๋ฅ์ ์ด์ ์ญ์ ์กด์ฌํ๋ค.
์ค๋ ํ๋ฃจ ์ ๋ฆฌ โ๏ธ
๋ ์ผ์ฃผ์ผ์ด ์ง๋๊ฐ๋ค..
์ด๋ฒ ์ฃผ์๋ ์ง์ค๋ ฅ์ด ์ต์ ๋ก ๋จ์ด์ก๋ ํ์ฃผ์๋ค.. ๊ณ์ ๋ด์ง์ ํ๊ฒ ๋๊ณ ๊ฐ์ ๋ค์ ๋ ์ง์ค๋ ์๋๊ณ ..
์ฃผ๋ง ๋์ ๋ฆฌํ๋ ์ฌ ์ข ํด์ ๋ค์ ์ ์ ์ฐจ๋ฆฌ๊ณ ์ด์ฌํ ํด๋ด์ผ์ง.
์ ์ฌ๊ณ ์ด์ฌํ ๊ณต๋ถํ๊ณ .. ์ปจ๋์
๊ด๋ฆฌ ์ํ์!!
์ฃผ๋ง ๊ณํ โฐ
- ํ์๊ณผ์ ์งํ
- ์ถ๊ฐ ๊ณต๋ถ
- ๋ธ๋ก๊ทธ ์ ๋ฆฌ
'โ๏ธ Today I Learned(TIL) > ์คํ๋ฅดํ ๋ด์ผ๋ฐฐ์์บ ํ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ TIL ] JPA ์ฌํ_Day 7 (0) | 2025.01.20 |
---|---|
[ TIL ] JPA ์ฌํ_Day 6 (0) | 2025.01.19 |
[ TIL ] JPA ์ฌํ_Day 3 (0) | 2025.01.16 |
[ TIL ] JPA ์ฌํ_Day 1 (0) | 2025.01.14 |
[ TIL ] ์ฃผํน๊ธฐ ์ฌํ_Day 12 (0) | 2025.01.10 |