์์ํ๋ฉฐ
์ค๋์ Spring์์ ๋ง๋ฒ์ ์ด๋ ธํ ์ด์ ์ด๋ผ๊ณ ๋ถ๋ฅด๋ @Transactional์ readOnly ์ต์ ์ ๋ํ์ฌ ์ด์ผ๊ธฐํด๋ณด๋ ค๊ณ ํ๋ค.
์ฅ? @Transactional์๋ readOnly๋ผ๋ ์ต์ ์ด ์๋๋ฐ?
์ฅ? @Transactional์๋ readOnly ์ต์ ์ด ์๋๋ฐ ์ด๊ฒ ๋ฌด์จ์ผ์ด์ฃ ? ์๋ ๊ฑธ๋ก ์ด์ผ๊ธฐ๋ฅผ ํ๋ ค๊ณ ํ๋ ๊ฑด๊ฐ?
์ฐ๋ฆฌ๋ ์ด๋ฒ readOnly ์ด์ผ๊ธฐ๋ฅผ ํ๊ธฐ ์ ์ @Transactional์ 2๊ฐ์ง ์๋ค๋ ๊ฒ์ ์ด์ผ๊ธฐํ๊ณ ๋์ด๊ฐ๋ ค๊ณ ํ๋ค.
์ด 2๊ฐ์ง๊ฐ ๊ถ๊ทน์ ์ผ๋ก ํ๋ ค๊ณ ํ๋ ์ผ์ ๋์ผํ๋ค. (์ค์ Spring AOP ์์์๋ javax ํจํค์ง์ ํธ๋์ ์ ๊ณผ Spring ํจํค์ง์ ํธ๋์ ์ ๋ ๋ชจ๋ ์ง์ํ๊ณ ์๋ค.) Spring ํจํค์ง๋ฅผ ํตํด ์ ๊ณต๋๋ ์ด๋ ธํ ์ด์ ์ด ๋ ๋ง์ ์ต์ ์ ์ ๊ณตํ๊ฒ ๋๋ค..
์ด ๊ธ์์๋ readOnly๊ฐ ํ๋ ์ญํ ์ ๋ํด ์ด์ผ๊ธฐ๋ฅผ ํ๋ ค๊ณ ํ๋, ์์ธํ ๋ด์ฉ์ ๊ตฌ๊ธ์์ ์ฐพ์๋ณด๋๋ก ํ์ (๋ ์ด์ผ๊ธฐํ๋ฉด ๋๋ฌด ์ผ์ฒํฌ๋ก ๋ง์ด ๋น ์ง ๊ฒ ๊ฐ์์..)
@Transactional์ readOnly๋ ์ด๋ป๊ฒ ๋์ํ ๊น?
์ผ๋จ readOnly ์ต์ ์ ๋ํด ์ง๊ณ ๋์ด ๊ฐ๋ณด๋๋ก ํ์
- ํธ๋์ ์ ์ ์ฝ๊ธฐ ์ ์ฉ์ผ๋ก ์ค์ ๊ฐ๋ฅํจ.
- ๊ฐ๋ฐ์์ ์ค์๋ก ํด๋น ํธ๋์ ์ ์์์ Write๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ๋ฐฉ์ง๋ ์ ๋ ์๊ณ , ์๋ ์๋ ์๋ค. (JDBC Driver์ ๋ฐ๋ผ ๋ค๋ฅด๋ค.)
๋จผ์ , Spring ํธ๋์ ์ ์ readOnly ์ต์ ์ ๋ํ API ๋ฌธ์๋ฅผ ๋จผ์ ํ์ธํด๋ณด๋๋ก ํ์.
This just serves as a hint for the actual transaction subsystem; it will not necessarily cause failure of write access attempts. A transaction manager which cannot interpret the read-only hint will not throw an exception when asked for a read-only transaction but rather silently ignore the hint.
๊ณต์๋ฌธ์์์ ํด๋น ์ต์ ์ ์ด ์ต์ ์ด ์ฝ๊ธฐ ์ ์ฉ ํํธ๋ฅผ ์ ๊ณตํ๋ค.๋ผ๊ณ ์ด์ผ๊ธฐ๋ฅผ ํ๋ค.
์ด๋ ๊ธฐ๋ณธ์ ์ผ๋ก 'Connection.setReadOnly(true)'๋ฅผ ํธ์ถํ๊ฒ ๋๋ค. ์์์ '๋ ์ ๋์๊ณ , ์ ๋ ์๋ ์๋ค'๋ผ๊ณ ์ด์ผ๊ธฐ ํ ์ด์ ๋ ์ด๋ฌํ ์ด์ ๋ค.
Oracle Driver์ ๊ฒฝ์ฐ๋ ์์ ๋ถํฐ readOnly ์ต์ ์ ์ ๊ณตํ์์ง๋ง, MySQL Driver๋ 5.6.5 ์ด์์ด ๋์ด์ผ ๋๋์ด ์ง์๋์๋ค๊ณ ํ๋ค.
๊ทธ ์ธ์ H2์์๋ ์์ง ์ง์์ ํ์ง ์๋๋ค๊ณ ๋ ํ๊ณ , JDBC ์ ์กฐ์ฌ ๋ณ๋ก ๋ค๋ฅด๊ฒ ์ ์ฉ๋๋ค๋ ์ ์ ๊ผญ ์ธ์ง ํด์ผ ํ๋ค.
(๊ด๋ จ๋ ์ฐธ๊ณ ๊ธ : wonwoo.ml/index.php/post/839)
Hibernate๋ก ์ฌ์ฉํ ๋๋ ์ด๋ป๊ฒ ์ ์ฉ๋ ๊น?
Hibernate๋ readOnly ์ต์ ์ด ์ค์ ๋ ๊ฒฝ์ฐ๋ Session์ Flush Mode๋ฅผ 'FlushMode.MANUAL' ๋ชจ๋๋ก ์ค์ ํ๋ค.
์ด๋ ๊ณง, '์ด ํธ๋์ ์ ์ ์ปค๋ฐ ์ flush๋ฅผ ํ์ง ์๋๋ค'๋ ๊ฒ์ ์๋ฏธํ๋ค.
๊ฒฐ๊ตญ์ Hibernate๋ Entity์ flush๋ฅผ ํธ์ถํ์ง ์๊ฒ ๋๊ณ , ๋ณ๊ฒฝ์ ์์ฐ์ค๋ฝ๊ฒ ๋ฌด์๋๊ฒ ๋๋ค.
๋ํ, flush๊ฐ ํธ์ถ๋์ง ์๊ณ , Dirty Checking์ ํ์ง ์๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ ์ผ๋ก๋ ์ด ์ ์ ์ป์ ์ ์๋ค.
(Dirty Checking์ด ์ด๋ฃจ์ด์ง๋ ๊ณผ์ ์ ์ฝ๊ฒ ์ค๋ช ํ๋ค๊ณ ํ๋ฉด, Entity์ Snapshot์ ๋น๊ตํ๊ฒ ๋๋๋ฐ ์ด๋ฌํ ๊ณผ์ ์ด ์๋ต๋๊ฒ ๋๋ฉด์ ์ฑ๋ฅ ์์ ์ด์ ์ ์ป๊ฒ ๋๋ค.)
'๐ป ๋ฐฑ์๋ ๊ฐ๋ฐ > JPA - Hibernate' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
03. Soft Delete ๋ ํธํ๊ฒ ํ๊ธฐ (0) | 2021.07.15 |
---|---|
01. ์์๋๋ฉด ์ธ๋ผ์๋ GeneratedValue ์ด์ผ๊ธฐ Part1 (250) | 2020.06.04 |
๋๊ธ