๋ชฉ์ฐจ
์์์ฑ ์ปจํ ์คํธ?
์์์ฑ ์ปจํ ์คํธ๋ ๋ ผ๋ฆฌ์ ์ธ ๊ฐ๋ ์ด๋ค.
์ํฐํฐ๋งค๋์ ๋ฅผ ํตํด์ ์์์ฑ ์ปจํ ์คํธ์ ์ ๊ทผํ๋ค.
- J2EE ๊ฐ์ ํ๊ฒฝ
์ํฐํฐ๋งค๋์ ์ ์์์ฑ ์ปจํ ์คํธ๊ฐ 1:1 ๊ด๊ณ.
์ํฐํฐ๋งค๋์ ์์ ์์์ฑ ์ปจํ ์คํธ๊ฐ 1๊ฐ ์๋ค.
- ์คํ๋ง ํ๋ ์์ํฌ ๊ฐ์ ์ปจํ ์ด๋ ํ๊ฒฝ
์ํฐํฐ๋งค๋์ ์ ์์์ฑ ์ปจํ ์คํธ๊ฐ 1:N ๊ด๊ณ.
์ฌ๋ฌ ์ํฐํฐ๋งค๋์ ๋ฅผ ํตํด 1๊ฐ์ ์์์ฑ ์ปจํ ์คํธ์ ์ ๊ทผํ๋ค.
์์์ฑ ์ปจํ ์คํธ ๊ตฌ์กฐ
1. Mapํํ์ 1์ฐจ ์บ์ ๊ณต๊ฐ : transaction.commit()์ ๊น์ง ๊ฐ์ ๋ชจ์๋๋๋ค.
2. ์ฐ๊ธฐ์ง์ฐ SQL์ ์ฅ์ : transaction.commit()์ ๊น์ง SQL๋ฌธ๋ค์ ๋ชจ์๋๋๋ค.
em.persist(memberA) ํ๋ฉด
- insert SQL๋ฌธ์ ์ฐ๊ธฐ์ง์ฐ SQL์ ์ฅ์์ ์ ์ฅํ๊ณ ,
- memberA์ํฐํฐ๋ฅผ 1์ฐจ ์บ์์ ์ ์ฅํ๋ค.
- memberA์ํฐํฐ์ ์ค๋ ์ท์ ๋ง๋ค์ด์ ๋ณด๊ดํ๋ค. (๋์ค์ ์ค๋ ์ท๊ณผ ์ํฐํฐ๋ฅผ ๋น๊ตํ์ฌ ๋ณ๊ฒฝ๋ ๊ณณ์ ์ฒดํนํ๋ค)
์ด๋, @id๊ฐ์ DB์ id๊ฐ๊ณผ ๊ฐ๋ค.
์ํฐํฐ์ @GeneratedValue ์ ๋ต์ด identity์ธ ๊ฒฝ์ฐ, DB์ ์ ์ฅ๋๊ธฐ ์ ๊น์ง๋ id๊ฐ null์ด๊ธฐ ๋๋ฌธ์
JPA๋ @GeneratedValue์ ๋ต์ด identity์ผ๋๋ง em.persist()๋ฅผ ํ๋ฉด ๋ฐ๋ก insert SQL๋ฌธ์ DB์ ์ ์กํ๊ณ
๋ฐ์ id๊ฐ์ 1์ฐจ ์บ์์ ํค๋ก ์ฌ์ฉํ๋ค.
์์์ฑ ์ปจํ ์คํธ์ ์ด์
1. 1์ฐจ ์บ์์์ ์กฐํ
em.persist(member)ํ๋ฉด member๊ฐ 1์ฐจ ์บ์์ ์ ์ฅ๋๊ณ
em.find(member)ํ๋ฉด 1์ฐจ ์บ์น์ ์ ์ฅ๋ member๋ฅผ ๋ฐํํด์ค๋ค.
=> DB๊น์ง ๊ฐ์ง ์์๋ ๊ฐ์ ๋ฐํํด์ค ์ ์๋ค!
em.find(member2)ํ์ ๋ 1์ฐจ ์บ์์ ์๋ค๋ฉด, ๊ทธ๋ DB์์ ์กฐํํ๋ค.
DB์์ ์กฐํํ ๊ฒฐ๊ณผ๋ฅผ 1์ฐจ ์บ์์ ์ ์ฅํ๊ณ , 1์ฐจ ์บ์์ ์ ์ฅ๋ member2๋ฅผ ๋ฐํํด์ค๋ค.
(ํ์ง๋ง, ์ํฐํฐ๋งค๋์ ๋ ๊ฐ ์์ฒญ๋ง๋ค ์์ฑ๋์๋ค๊ฐ ์ญ์ ๋๋ค. ์์ฒญ์ด ์ด์์์ ๋์๋ง 1์ฐจ ์บ์์ ์ด์ ์ ๋๋ฆด ์ ์๋ค)
2. ๋์ผ์ฑ (identity) ๋ณด์ฅ
List<Member> memberList = new ArrayList<>();
memberList.add(memberA);
memberList.add(memberA);
memberList.get(0) == memberList.get(1);
=> ๊ฐ์ฒด์งํฅ ๋ฆฌ์คํธ์์ ๊ฐ์ ๊ฐ์ ์ ์ฅํ ๊ฒ์ ๊ฐ๋ค๊ณ ๋ณธ๋ค. (๊ฐ์ ์ฐธ์กฐ์ด๊ธฐ๋๋ฌธ์)
Member memberA = em.find(Member.class, memberA.getId());
Member memberB = em.find(Member.class, memberA.getId());
memberA == memberB;
=> ๊ฐ์ ์๋ณ์๋ก ๊ฐ์ ธ์จ ๊ฐ์ด๋ ๊ฐ๋ค๊ณ ํ๋จํ๋ค.
3. ํธ๋์ญ์ ์ ์ง์ํ๋ ์ฐ๊ธฐ ์ง์ฐ (Transactional write-behind)
em.persist(membr)๋ ์ฆ์ insert SQL๋ฌธ์ DB์ ์ ์กํ์ง ์๋๋ค.
์ฟผ๋ฆฌ๋ฅผ ์์์ฑ ์ปจํ ์คํธ์ ์ฐ๊ธฐ์ง์ฐ SQL์ ์ฅ์์ ์์๋๊ณ ์๋ค๊ฐ,
transaction.commit()ํ๋ ์๊ฐ ๋ชจ์๋์ ์ฟผ๋ฆฌ๋ฅผ DB์ ๋ณด๋ธ๋ค (์ผ์ข ์ ๋ฒํผ)
4. ๋ณ๊ฒฝ ๊ฐ์ง (Dirty Checking)
์ํฐํฐ๋ฅผ 1์ฐจ ์บ์์ ์ ์ฅํ ๋, ์ํฐํฐ๋ฅผ ๋๊ฐ์ด ๋ณต์ฌํ ์ค๋ ์ท์ ์ ์ฅํ๋ค.
์ํฐํฐ์ ๊ฐ์ ์์ ํ๊ฒ๋๋ฉด ์ค๋ ์ท๊ณผ ๋ฌ๋ผ์ง๊ฒ๋๋, ์ด๊ฒ์ ํ์ธํ์ฌ JPA๊ฐ ์์์ Update SQL๋ฌธ์ ์์ฑํ๋ค.
๊ฐ์ฒด๋ฅผ ์์ ํ ๋์ ์ ์ฌํ๋ค.
List<Member> memberList = new ArrayList<>();
Member member = memberList.get(0);
member.changeName("memberZ");
//memberList.add(member); => ์์ ํ ๊ฐ์ฒด๋ฅผ ๋ค์ ๋ฆฌ์คํธ์ ์ ์ฅํ์ง ์๋ ๊ฒ์ฒ๋ผ
Member findMember = em.find(Member.class, "memberA");
findMember.changeName("memberZ"); => ๊ฐ๋ง ์์ ํด์ฃผ๋ฉด ๋๋ค.
5. ์ง์ฐ๋ก๋ฉ (Lazy Loading)
์ํฐํฐ์ ์๋ช ์ฃผ๊ธฐ
1. ๋น์์ (new/transient)
๊ฐ์ฒด๊ฐ ์ฒ์ ์์ฑ๋ ์ํ. ์์์ฑ ์ปจํ ์คํธ์ ์ ํ ๊ด๊ณ์๋ ์ํ.
Member member = new Member();
member.setId("member1");
2. ์์ (managed)
์์์ฑ ์ปจํ ์คํธ์ ๊ด๋ฆฌ๋๋ ์ํ
em.persist(member) : ์ํฐํฐ๋งค๋์ ๋ฅผ ํตํด ์์์ฑ ์ปจํ ์คํธ์ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๋ค.
em.find(member) : JPA๋ 1์ฐจ ์บ์๋ฅผ ๋จผ์ ์ดํผ๊ณ , 1์ฐจ ์บ์์ member๊ฐ ์๋ค๋ฉด DB์์ ์กฐํํ๋ค.
DB์ ์กฐํํ ๊ฒฐ๊ณผ๋ฅผ 1์ฐจ ์บ์์ ๋จผ์ ์ ์ฅํ๊ณ , 1์ฐจ ์บ์์ ๊ฐ์ ๋ค์ ๋ฐํํด์ค๋ค.
๋ฐ๋ผ์ em.find()ํ ๋๋ ์์์ฑ ์ปจํ ์คํธ์ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ผ๊ฐ๊ฒ๋๋ค.
3. ์ค์์ (detached)
์์์ฑ ์ปจํ ์คํธ์์ ๋ถ๋ฆฌ๋ ์ํ
em.detach(member) : ์ํฐํฐ๋งค๋์ ๋ฅผ ํตํด ์์์ฑ ์ปจํ ์คํธ์์ member๋ฅผ ์ญ์ ํ๋ค.
em.clear() : ์ํฐํฐ๋งค๋์ ๋ฅผ ํตํด ์์์ฑ ์ปจํ ์คํธ์ ๋ด์ฉ์ ๋ชจ๋ ์ญ์ ํ๋ค.
4. ์ญ์ (removed)
์ญ์ ๋ ์ํ
em.remove(member) : ์ค์ DB์์ member์ ํด๋น๋๋ ๋ด์ฉ์ ์ญ์ ํ๋ค.
์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ - ๊ธฐ๋ณธํธ
'๐พ Database' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JPA] ์์๊ด๊ณ ๋งคํ, ๊ณตํต ์์ฑ ๋งคํ (0) | 2022.02.21 |
---|---|
[JPA] ๋ค์ํ ์ฐ๊ด๊ด๊ณ ๋งคํ(๋ค๋์ผ, ์ผ๋์ผ, ๋ค๋๋ค) (0) | 2022.02.21 |
[JPA] ์ฐ๊ด๊ด๊ณ ๋งคํ (0) | 2022.02.20 |
[JPA] Java Persistence API ๋ฑ์ฅ๋ฐฐ๊ฒฝ, ์ฌ์ฉ๋ฐฉ๋ฒ (0) | 2022.01.28 |
[MyBatis] ๋์์๋ฆฌ, ์ฌ์ฉ๋ฐฉ๋ฒ ์ ๋ฆฌ (0) | 2022.01.27 |