2023. 2. 4. 20:02ใ๐พBackEnd/๐ฑ Spring
EntityManager Factory
EMF๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ฐ์ผ๋ฉด Entity Manager๋ฅผ ์์ฑ์ ํด์ฃผ๋ ์ญํ ์ ํ๋ค.
์ดํ EM์ด ์ปค๋ฅ์ ํ์ ์ด์ฉํ์ฌ DB์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋๋ค.
์์์ฑ ์ปจํ ์คํธ( ์ํฐํฐ๋ฅผ ์๊ตฌ ์ ์ฅํ๋ ํ๊ฒฝ)
- ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ์ด์ ๊ฐ์ฒด๋ฅผ ๋ณด๊ดํ๋ ๊ฐ์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ ์ญํ ์ ํ๋ค.
์ํฐํฐ์ ์๋ช ์ฃผ๊ธฐ
- ๋น์์
- ์์์ฑ ์ปจํ ์คํธ์ ๊ด๊ณ๊ฐ ์๋ ์๋ก์ด ์ํ
Member m = new Member(); member.setId("1");
- ์์
- ์์์ฑ ์ปจํ ์คํธ์ ๊ด๋ฆฌ๋๋ ์ํ
- Entity Manager์ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ํตํด์ Entity๊ฐ ๊ด๋ฆฌ๊ฐ ๋๋ค.
Member member = new Member(); member.setUserName("๊น๋ฌด๊ฑด"); member.setAge(10); em.persist(member);
- ์ค์์
- ์์์ฑ ์ปจํ ์คํธ์ ์ ์ฅ๋์๋ค๊ฐ ๋ถ๋ฆฌ๋ ์ํ
- em.detach(member)
- ์ํฐํฐ๋ฅผ ์์์ฑ ์ปจํ ์คํธ์์ ๋ถ๋ฆฌ → ์ค์์ ์ํ๋ก ๋ง๋ ๋ค.
- ์ญ์
- ์ญ์ ๋ ์ํ
- em.remove(member) → ๊ฐ์ฒด๋ฅผ ์ญ์ ํ ์ํ
์์์ฑ ์ปจํ ์คํธ์ ์ฅ์
[1] - 1์ฐจ ์บ์ ์ฌ์ฉ
- ์กฐํ ์ ์ฒ์ 1์ฐจ ์บ์์ ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด ํ์ → DB์ ์ฒ๋ฆฌ ํ์์์ด ๋ฐ๋ก ๋ฆฌํด
- ์กฐํ ๊ฒฐ๊ณผ๊ฐ 1์ฐจ ์บ์์ ์๋ค๋ฉด ? → DB์ ์ ๊ทผํด ๊ฐ์ ํ์
- DB์ ์ ๋ฌ๋ฐ์ ๊ฐ์ 1์ฐจ ์บ์์ ์ ์ฅํ๋ค.
- 1์ฐจ ์บ์์์ ๋ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ฉ์๊ฐ ์ป๋๋ค.
1์ฐจ ์บ์๋ EntityManager์ ํธ๋์ญ์ ์ ๋จ์์ฌ์ ํธ๋์ญ์ ์ด ๋๋๋ฉด 1์ฐจ ์บ์์ ์ญ์
- ์์ ๋ฐ๋ฅธ ํน์ง์ผ๋ก ์งง์ ์๊ฐ์๋ง ์ฅ์ ์ด ์๋ค.
- 1์ฐจ ์บ์๋ ์์์ฑ ์ปจํ ์คํธ ๋ด๋ถ์ ์ํฐํฐ๋ฅผ ๋ณด๊ดํ๋ ์ ์ฅ์

Member member = new Member();
member.setId("1");
member.setUserName("๊น๋ฌด๊ฑด");
member.setAge(10);
em.persist(member);//์์ -> 1์ฐจ ์บ์์ ์ ์ฅ
//1์ฐจ ์บ์์์ ์กฐํ
Member member1 = em.find(Member.class, "1");
[2] - ๋์ผ์ฑ ๋ณด์ฅ
Member member1 = em.find(Member.class, "1");
Member member2 = em.find(Member.class, "1");
- ์์ ๊ฐ์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ๋์ผ์ฑ์ ๋ํ ์ค๋ช ์ด ์ฝ๋ค.
- member1์์ 1์ฐจ ์บ์์ ๊ฐ์ด ์๊ธฐ ๋๋ฌธ์ DB์ Select ์ฟผ๋ฆฌ๊ฐ ๋ ๋ผ๊ฐ๋ค.
- ์ดํ์ 1์ฐจ ์บ์์ {”member”,”1”}์ด ์ ์ฅ์ด ๋๋ค.
- member2๋ 1์ฐจ ์บ์์ ์๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ค. → DB์ ์กฐํ X → SELECT ์ฟผ๋ฆฌ๊ฐ ์์
[3] - ํธ๋์ญ์ ์ ์ง์ํ๋ ์ฐ๊ธฐ ์ง์ฐ
tx.begin(); -> [ํธ๋์ญ์
]์ ์์
Member member = new Member();
Member member2 = new Member();
em.persist(member);
em.persist(member2);
tx.commit(); -> ์ปค๋ฐํ๋ ์๊ฐ DB์ INSERT SQL์ ๋ณด๋ธ๋ค.
- ์์(Persist)๋ฅผ ํ๋ฉด ๋ฐ๋ก DB์ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆฌ์ง ์๋๋ค.
- ์ดํ Commit์ ํ๊ฒ ๋๋ฉด Insert SQL ์ฟผ๋ฆฌ๊ฐ ๋ ๋ผ๊ฐ๋ค.
- tx.begin(); -> [ํธ๋์ญ์ ]์ ์์ Member member = new Member(); Member member2 = new Member(); em.persist(member); em.persist(member2); tx.commit(); -> ์ปค๋ฐํ๋ ์๊ฐ DB์ INSERT SQL์ ๋ณด๋ธ๋ค.
[๋ด๋ถ์ ์ธ ๋์]
[1] Persist

- ์์ํ๋ฅผ ํ๋ฉด (1) 1์ฐจ ์บ์์ ์ํฐํฐ๋ฅผ ๊ด๋ฆฌํ๋ค.
- (2) JPA๋ Entity๋ฅผ ๋ถ์ํ์ฌ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ค.
- (3) ์์ฑ๋ ์ฟผ๋ฆฌ๋ฅผ ์ฐ๊ธฐ ์ง์ฐ ์ ์ฅ์์ ๊ด๋ฆฌํ๋ค.
[2] Commit

- commit()์ด ์คํ์ด ๋๋ฉด
- ์ฐ๊ธฐ ์ง์ฐ SQL ์ ์ฅ์์ ์๋ ์ฟผ๋ฆฌ๋ Flush()๊ฐ ๋๋ฉด์ ์ฟผ๋ฆฌ๊ฐ ๋ ๋ผ๊ฐ๋ค.
- ์ดํ DB์ Commit()์ด ๋๋ค.[1] Persist
- ์์ํ๋ฅผ ํ๋ฉด (1) 1์ฐจ ์บ์์ ์ํฐํฐ๋ฅผ ๊ด๋ฆฌํ๋ค.
- (2) JPA๋ Entity๋ฅผ ๋ถ์ํ์ฌ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ๋ค.
- (3) ์์ฑ๋ ์ฟผ๋ฆฌ๋ฅผ ์ฐ๊ธฐ ์ง์ฐ ์ ์ฅ์์ ๊ด๋ฆฌํ๋ค.
- commit()์ด ์คํ์ด ๋๋ฉด
- ์ฐ๊ธฐ ์ง์ฐ SQL ์ ์ฅ์์ ์๋ ์ฟผ๋ฆฌ๋ Flush()๊ฐ ๋๋ฉด์ ์ฟผ๋ฆฌ๊ฐ ๋ ๋ผ๊ฐ๋ค.
- ์ดํ DB์ Commit()์ด ๋๋ค.
[4] - ๋ณ๊ฒฝ ํ์ง (Dirty Checking)

DB์ ๊น๋ฌด๊ฑด ์ด๋ผ๋ ๊ฐ์ด ์๋ค๊ณ ์๊ฐ์ ํด๋ณด์
๐ก ๋ง์ฝ์ ์ด ๊น๋ฌด๊ฑด → ํ๊ธธ๋ ์ผ๋ก ๊ฐ์ ๋ณ๊ฒฝ์ ํ๊ณ ์ถ๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผ๋๋??
Member member = em.find(Member.class, 1L);
member.setUserName("ํ๊ธธ๋");
tx.commit();
์ด๋ ๊ฒ ๊ฐ์ ๋ณ๊ฒฝ์ ํ๋ฉด commit์ด ๋๋ ์๊ฐ์ userName์ ๊ฐ์ ํ๊ธธ๋์ผ๋ก ๋ณํ์ด ๋๋ค.
Mybatis์ ๊ฒฝ์ฐ๋ฅผ ์๊ฐ์ ํด๋ณด์
๊ธฐ์กด์ ๊ฐ์ set์ ํตํ์ฌ ๋ณ๊ฒฝ์ ํ๊ณ DB์ ์ ์ฅ์ ํ๊ณ ์ถ์ผ๋ฉด
→ update() ์ฟผ๋ฆฌ๋ฅผ ์คํ์ ํด์ DB์ ์ ๊ทผํ์ฌ ๊ฐ์ ๋ณ๊ฒฝ์ ํ์๋ค.
ํ์ง๋ง JPA๋ ์ด๋ฌํ ๊ณผ์ ์ด ์๋ค. → ์์์ฑ ์ปจํ ์คํธ

- Commit์ ํ๋ฉด ๋ด๋ถ์ ์ผ๋ก Flush๊ฐ ํธ์ถ์ด ๋๋ค.
- Flush()๊ฐ ํธ์ถ์ด ๋๊ณ ์ํฐํฐ๋ ์ค๋ ์ท์ ๋น๊ตํ๋ค.
- ๋ง์ฝ์ ์ํฐํฐ์ ๊ฐ์ด ์ค๋ ์ท์ ๊ฐ๊ณผ ๋ค๋ฅธ ๊ฒฝ์ฐ์ ์ฐ๊ธฐ ์ง์ฐ SQL์ ๋ง๋ ๋ค.(UPDATE)
- ์ดํ ์ง์ฐ ์ ์ฅ์์ ์๋ ์ฟผ๋ฆฌ๋ฅผ DB์ ๋ฐ์ํ๊ณ ์ปค๋ฐ์ ํ๊ฒ ๋๋ค.
[5] - ์ง์ฐ ๋ก๋ฉ(Lazy Loading)
'๐พBackEnd > ๐ฑ Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ RFC ] ๊ณต์ ๋ฌธ์๋ฅผ ํตํ์ฌ Delete์ Status๋ฅผ ์์๋ณด์ (0) | 2023.03.12 |
---|---|
[ Jackson ] Jackson mock ํ ์คํธ ์ญ์ง๋ ฌํ ์ค๋ฅ (0) | 2023.03.11 |
Spring Boot Test H2 In Memory ์ค์ ํ๊ธฐ (0) | 2023.02.28 |
[SpringBoot] Slack์ผ๋ก ์๋ฆผ ๋ณด๋ด๊ธฐ (0) | 2023.02.15 |
SPRING ์ฟผ๋ฆฌ๋ฅผ 2๊ฐ๋ฅผ 1๊ฐ๋ก ์ค์ด๋ Merge ์ด์ฉํ๊ธฐ (0) | 2022.11.26 |