1. EntityManagerFactory์ EntityManager๋ฅผ ๋จผ์ ์์๋ณด์
EntityManager๋ ์ฌ์ฉ์์ ์์ฒญ์ ๋ํ์ฌ ์ปค๋ฅ์ ํ์์ ์ปค๋ฅ์ ์ ์ป๊ณ DB์ ์ ๊ทผํ๋ ์ญํ ์ ํ๋ค. EntityManagerFactory๋ ๋ง ๊ทธ๋๋ก ์ฌ์ฉ์์ ์์ฒญ๋ง๋ค EntityManger๋ฅผ ๋ง๋ค์ด๋ด๋ ๊ณต์ฅ์ด๋ค.
2. ์์์ฑ ์ปจํ ์คํธ๊ฐ ๋ญ๊น ๊ทธ๋์
๊ฐ๋จํ๊ฒ ์ํฐํฐ์ Life Cycle์ ๊ด๋ฆฌํ๋ ์ ์ฅ์์ด๋ค.
EntityManager๊ฐ ์์ฑ๋ ๋ PersistenceContext๊ฐ ๊ฐ์ด ์๋์ผ๋ก ์์ฑ๋๋ค.
3. Entity Life Cycle
- ๋น์์(new/transient): ์์์ฑ ์ปจํ ์คํธ์ ๊ด๊ณ์๋ ์๋ก์ด ์ํ
- ์์(managed): ์์์ฑ ์ปจํ ์คํธ์ ์ํด ๊ด๋ฆฌ๋๊ณ ์๋ ์ํ
- ์ค์์(detached): ์๋ ์์์ฑ ์ํ์๋ค๊ฐ ํ์ฌ๋ ๋ถ๋ฆฌ๋์ด ์๋ ์ํ
- ์ญ์ (removed): ์ญ์ ๋ ์ํ
๋น์์ ์ํ๋ ๊ทธ์ new Book()์ฒ๋ผ ๊ฐ์ฒด๋ฅผ ์์ฑ๋ง ํด๋์ ์ํ์ด๊ณ
์์ ์ํ๋ ์์ฑ๋ Book ์ธ์คํด์ค๋ฅผ EntityManager๋ฅผ ํตํด ํธ๋์ญ์ ์ด ์์๋๊ณ persist๊ฐ ๋์ด ์์์ฑ ์ปจํ ์คํธ์์ ๊ด๋ฆฌ๋๊ณ ์๋ ์ํ์ด๋ค.
4. ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์ฌ์ฉํ๋ฉด ์ข์์ 5๊ฐ์ง๋ง ์์๋ณด์
์ฌ๊ธฐ์๋ ๊ฐ๋จํ๊ฒ๋ง ์ ๊ณ ์์ธํ๊ฑด ๋์ค์ ๋ค์ ํฌ์คํ ํ ์์ ...
1. 1์ฐจ ์บ์
์์์ฑ ์ปจํ ์คํธ ๋ด๋ถ์ ์บ์๋ฅผ ๊ฐ์ง๋ฉฐ, Map ์๋ฃํ์ผ๋ก ์ ์ฅํ๋๋ฐ key๋ Entity์์ @Id๋ก ๋งคํํ ์๋ณ์๊ฐ ๋ค์ด๊ฐ๊ณ value๋ Entity์ ์ธ์คํด์ค๊ฐ ์ ์ฅ๋๋ค.
em.persist(new Book(1L, "์ฑ
1");
em.find(Book.class, 1L);
์์ ๊ฐ์ด persist๋ฅผ ํตํด ์์์ฑ ์ปจํ ์คํธ์ ์ํด ๊ด๋ฆฌ๋๋ Book์ ๋ํด์ ์กฐํ๋ฅผ ํ๋ฉด EntityManager๋ ๋จผ์ ์์์ฑ ์ปจํ ์ค์ 1์ฐจ ์บ์์ ์กด์ฌํ๋์ง ์ฐพ์๋ณด๊ณ ์์ผ๋ฉด ์ธ์คํด์ค๋ฅผ ๋ฐํํ๊ณ ์์ผ๋ฉด ๋๋น์์ ์ฐพ์์์ 1์ฐจ ์บ์์ ์ ์ฅํ๊ณ ๋ฐํํด์ฃผ๋ ์บ์ ๊ธฐ๋ฅ์ ์ ๊ณตํด์ค๋ค.
ํ์ง๋ง ์ด๊ฒ ์ฌ์ค์ ๋ง์ ์ํฉ์ ๋์์ด ์๋ ์๋ ์๋ค.
์๋ํ๋ฉด ์์์ฑ ์ปจํ ์คํธ๋ EntityManager๊ฐ ์์ฑ๋ ๋ ๊ฐ์ด ์์ฑ๋๋ฉฐ ํธ๋์ญ์ ์ด ์ข ๋ฃ๋๋ฉด ๊ฐ์ด ์ญ์ ๊ฐ ๋๋ฒ๋ฆฌ๊ธฐ ๋๋ฌธ์ ๊ฐ์ ํธ๋์ญ์ ๋ด์์๋ง ์ด์ ์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ ์ฒด ์ดํ๋ฆฌ์ผ์ด์ ์์ ์บ์๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ ค๋ฉด 2์ฐจ ์บ์๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
2. ๋์ผ์ฑ ๋ณด์ฅ
์์์ฑ ์ปจํ ์คํธ์์ ๋๊ฐ์ ๊ฒ์ findํ์ ๋ ๋ ์ธ์คํด์ค๋ฅผ == ๋น๊ตํ๋ฉด true์ด๋ค.
ํท๊ฐ๋ฆด ์ ์๋๊ฒ ๋๋ฑ์ฑ์ ์ค์ ์ธ์คํด์ค๋ ๋ค๋ฅผ ์ ์์ง๋ง ์ธ์คํด์ค๊ฐ ๊ฐ์ง๊ณ ์๋ ๊ฐ์ด ๊ฐ๋ค๋ ์๋ฏธ์ด๋ค. ๋๋ฑ์ฑ ๋น๊ต๋ฅผ ์ํด์๋ equals() ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผ ํ๋ค.
1์ฐจ ์บ์๋ฅผ ํตํด REPEATABLE READ์ ํธ๋์ญ์ isolation level์ DB๊ฐ ์๋ ์ดํ๋ฆฌ์ผ์ด์ ์ฐจ์์์ ์ ๊ณตํ๋ค.
3. ํธ๋์ญ์ ์ ์ง์ํ๋ ์ฐ๊ธฐ ์ง์ฐ
persist ํ์ ๋ ๋ฐ๋ก insert ์ฟผ๋ฆฌ๊ฐ ๋ ๋ผ๊ฐ๋๊ฒ ์๋๋ผ transactional write-behind(์ฐ๊ธฐ ์ง์ฐ) sql ์ ์ฅ์์ insert sql๋ฌธ์ด ์ ์ฅ๋๋ค. transaction.commit()์ด ์คํ๋ผ์ผ write behind sql ์ ์ฅ์์์ flush(์์์ฑ ์ปจํ ์คํธ์ ๋ณ๊ฒฝ ๋ด์ฉ์ DB์ ๋ฐ์ํ๋ ๊ฒ)๊ฐ ๋ฐ์ํ๊ณ ์ค์ DB์ insert ์ฟผ๋ฆฌ๊ฐ ์คํ๋๋ค ๊ทธ๋ฆฌ๊ณ commit(์ค์ ํธ๋์ญ์ ์ ์ข ๋ฃํ๊ณ ๋ชจ๋ ์์ ์ ์ ์ ์ฒ๋ฆฌ ํ์ ํ๋ ๊ฒ)์ด ๋์ด ์ข ๋ฃ๋๋ค.
์ฐ๊ธฐ ์ง์ฐ SQL ์ ์ฅ์์ ์ ์ฅํ๋ฉด์ 1์ฐจ ์บ์์๋ ์ธ์คํด์ค๋ฅผ ์ ์ฅํ๋ค.
๋ฒํผ๋ง์ผ๋ก ์ฌ๋ฌ ๊ฐ์ insert๋ฅผ commit ์ ์ ๋ชจ์๋จ๋ค๊ฐ commit ํ๋ฉด batch size ์ค์ ํ๋งํผ ํ๋ฐฉ์ insert์ฟผ๋ฆฌ๋ฅผ ๋ณด๋ผ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค.
<property name="hibernate.jdbc.batch_size" value="10"/>
4. ๋ณ๊ฒฝ ๊ฐ์ง(Dirty Checking)
Book book1 = em.find(Book.class, 1L);
book1.setName("์ฑ
์ด๋ฆ์์ ");
์ด๋, ํธ๋์ญ์ ๋ด์์ ์์ ๊ฐ์ ์ฝ๋๊ฐ ์คํ๋๋ค๋ฉด find๋ฅผ ์คํํ๋ฉด book1 ์ธ์คํด์ค๋ ์์์ฑ ์ปจํ ์คํธ์ ์ํด ๊ด๋ฆฌ๊ฐ ๋๊ณ book1์ ์์ ํ๋ฉด commit ์์ ์ ์๋์ผ๋ก ๋ณ๊ฒฝ์ฌํญ์ด ๋ฐ์๋๋ค. ๋ฐ๋ก persist๋ฅผ ํ์ง ์์๋ ๋๋ค.
์กฐ๊ธ ์์ธํ๊ฒ ๋งํ์๋ฉด
1์ฐจ์บ์์๋ @Id๋ก ์ค์ ํด๋ ์๋ณ์, ์ํฐํฐ ์ธ์คํด์ค์ธ์๋ Snapshot์ด๋ผ๋ ํ๋๊ฐ ๋ ์๋ค. ์ค๋ ์ท์ ์ต์ด์ ์ํฐํฐ ์ธ์คํด์ค๊ฐ ์์์ฑ ์ํ๊ฐ ๋ ๋์ ์ํ๋ฅผ ์ ์ฅํด๋๊ฒ์ด๋ค.
(1)transaction.flush()๊ฐ ์คํ๋๋ฉด ์์์ฑ ์ปจํ ์คํธ์์ (2)ํ์ฌ ์ํฐํฐ ์ธ์คํด์ค์ ์ค๋ ์ท๊ฐ์ ์ฐจ์ด๊ฐ ์๋์ง๋ฅผ ํ์ธํ๊ณ ์ฐจ์ด๊ฐ ์๋ค๋ฉด (3)Update Sql๋ฌธ์ ์์ฑํด์ ์ฐ๊ธฐ ์ง์ฐ Sql ์ ์ฅ์์ ์์ฑํ๊ณ ์ค์ DB๋ก (4)flush๋๊ณ (commit ํ ์ข ๋ฃ๋๋ค.
5. ์ง์ฐ ๋ก๋ฉ
์ง์ฐ ๋ก๋ฉ์ด๋ ๋ง์ฝ์ ์กฐ์ธ ์ปฌ๋ผ์ ๊ฐ์ง๊ณ ์๋ ๊ฐ์ฒด์์ ์กฐ์ธ๋ ๊ฐ์ฒด์ ๋ํด์๋ ์ฒ์ ๋๋น์ ์กฐํ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ ธ์ ๋๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค์ง ์๊ณ ๋์ค์ ์กฐ์ธ๋ ๊ฐ์ฒด์ ๋ํด์ get์์ฒญ์ ์งํํ๋ฉด ๊ทธ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐฉ์์ด๋ค. lazy loading ์๋ฏธ๋๋ก ๊ฒ์ผ๋ฅธ ๋ก๋ฉ์ผ๋ก ๊ธฐ์ตํ๋ฉด ๋๋ค!
'๐ Backend > โ๏ธ JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Spring Data JPA - Query Method ๊ฐ๋จ ์ค๋ช (0) | 2022.10.21 |
---|---|
@GeneratedValue์ ์ ๋ต๊ณผ Insert์ฟผ๋ฆฌ ์คํ ์์ ๊ณผ์ ๊ด๊ณ (0) | 2022.09.06 |