๐คWhy ?
๊ตญ๋นํ์ ์ปค๋ฆฌํ๋ผ์ ๋ฐ๋ผ ๊ณต๋ถํ๋ฉฐ ๊ณ์ ๋๋ ์๊ฐ์ด ์์๋ค.
๐ก ์ด๊ฑฐ ๋๋ฌด ๋ถํธํ๋ฐ?
๐ก ๋ ํธํ ๋ฐฉ๋ฒ์ ์์๊น?
๐ ์ฒซ ํ๋ก์ ํธ
JDBC api๋ฅผ ์ฌ์ฉํด์ query๋ฌธ์ ์ ํํ๊ฒ ํ๋ํ๋ ์ ๋ ฅํ์ฌ ์ฒ๋ฆฌํ๋ค
๐ ๋๋ฒ์งธ ํ๋ก์ ํธ
sql Mapper(MyBatis)๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋ฐ ์ฝ๋๋ ์ค์์ง๋ง query๋ฌธ์ ์ง์ค๋์ด์๊ณ , ์์ฐ์ฑ์ด ๋จ์ด์ง๋ค๋ ์ ์ ๊ฐ์๋ค.
ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉฐ ๋ง์๋ถ๋ถ์ ๋งก๊ฒ๋์ด ๋ค์ํ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ค๋ณด๋ ํ๋์ ๊ธฐ๋ฅ์ ์ํํ๊ธฐ ์ํด ๋ฌด์ธ๊ฐ ์ ์ฐจ๊ฐ ๋ง๋ค๋ ์๊ฐ์ด ๋ค์๋ค.
์ฐ์ฐํ JPA์๊ฐ ๊ฐ์ข๋ฅผ ๋ฃ๊ฒ๋์๊ณ ์ด๋ ๊ฒ ํธํ๊ฒ? ์ด๋ ๊ฒ ๋นจ๋ฆฌ? ๊ฐ๋ฐ์ ํ ์ ์๋ค๋ ์ค๋ ์์ ๋ฐ๋ก ๊ฐ์๋ฅผ ์๊ฐํ๊ฒ๋์๋ค.
๐ป์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ - ๊ธฐ๋ณธํธ (๊น์ํ๋)
โ SQL ์ค์ฌ์ ์ธ ๊ฐ๋ฐ์ ๋ฌธ์ ์
- SQL์ ์์กด์ ์ธ ๊ฐ๋ฐ
๋ฐ๋ณต ( java๊ฐ์ฒด -> sql๊ฐ์ฒด -> java๊ฐ์ฒด -> ... ์ด๋ฌํ ๊ณผ์ ์ ๋ฐ๋ณต ) - ํ ์ด๋ธ์ ๋ง์ถ ๊ฐ์ฒด ๋ชจ๋ธ๋ง ๋ฌธ์ ์ ( ๋ค๋ฅธ ๊ฐ์ฒด์ ์ฐธ์กฐ๊ฐ ์๋ Id๊ฐ์ ๊ฐ์ง๊ณ ์๋ค )
- ๊ฐ์ฒด๋ค์ด ๋ชจ๋ธ๋ง์ ๋ฌธ์ ์ ( ๋ค๋ฅธ ๊ฐ์ฒด์ ์ฐธ์กฐ๋ก ์ฐ๊ด๊ด๊ณ๋ฅผ ๋งบ๋๋ค )
์ฝ๋๊ฐ ๋ฒ์กํด์ง๊ณ , ๋ฑ๋ก๊ณผ ์์ ์ด ๊น๋ค๋กญ๋ค.
๊ฐ์ฒด๋ ์์ ๋กญ๊ฒ ๊ฐ์ฒด๊ทธ๋ํ๋ฅผ ํ์ํ ์ ์์ด์ผ ํ๋ค, ์ฒ์ ์คํํ sql์ ๋ฐ๋ผ์ ํ์ ๋ฒ์๊ฐ ๊ฒฐ์ ๋๊ธฐ ๋๋ฌธ์ ๊ณ์ธตํ ์ํคํ ์ฒ ๊ด์ ์์ ๋ค์ ๊ณ์ธต์ ๋ฏฟ๊ณ ์ธ ์ ์์ด์ผ ํ๋๋ฐ ๊ทธ๋ ์ง ๋ชปํ ๊ฒ ๋์ด ์ ๋ขฐ๋๊ฐ ๊นจ์ง๋ค.
โ JPA - Java Persistence API
๐ JPA๋ ํ์ค ๋ช ์ธ
- ์ธํฐํ์ด์ค์ ๋ชจ์
- ํ์ค ๋ช ์ธ๋ฅผ ๊ตฌํํ 3๊ฐ์ง ๊ตฌํ์ฒด - ํ์ด๋ฒ๋ค์ดํธ, EclipseLink, DataNucleus
๐ JPA๋ฅผ ์ ์ฌ์ฉํด์ผ ํ๋๊ฐ?
- SQL ์ค์ฌ์ ์ธ ๊ฐ๋ฐ์์ ๊ฐ์ฒด ์ค์ฌ์ผ๋ก ๊ฐ๋ฐ
- ์์ฐ์ฑ, ์ ์ง๋ณด์
- ํจ๋ฌ๋ค์์ ๋ถ์ผ์น ํด๊ฒฐ ( ์์, ์ฐ๊ด๊ด๊ณ, ๊ฐ์ฒด ๊ทธ๋ํ ํ์, ๋น๊ต )
- ์ฑ๋ฅ
- ๋ฐ์ดํฐ ์ ๊ทผ ์ถ์ํ์ ๋ฒค๋ ๋ ๋ฆฝ์ฑ
- ํ์ค
๐ JPA์ ์ฑ๋ฅ ์ต์ ํ ๊ธฐ๋ฅ
๐ก 1์ฐจ ์บ์์ ๋์ผ์ฑ(identity)๋ณด์ฅ
๊ฐ์ ํธ๋์ญ์ ์์์๋ ๊ฐ์ ์ํฐํฐ๋ฅผ ๋ฐํ - ์ฝ๊ฐ์ ์กฐํ ์ฑ๋ฅ ํฅ์
String memberId = "100";
Member m1 = jpa.find(Memeber.class, memberId); //SQL
Member m2 = jpa.find(Memeber.class, memberId); //์บ์
// m1 == m2 true
๐ก ํธ๋์ญ์ ์ ์ง์ํ๋ ์ฐ๊ธฐ ์ง์ฐ(transactional write-behind)
ํธ๋์ญ์
์ ์ปค๋ฐํ ๋๊น์ง INSERT SQL์ ๋ชจ์
JDBC BATCH SQL๊ธฐ๋ฅ์ ์ฌ์ฉํด์ ํ๋ฒ์ SQL ์ ์ก
transaction.begin(); // ํธ๋์ญ์
์์
em.persist(memberA);
em.persist(memberB);
em.persist(memberC);
//์ฌ๊ธฐ๊น์ง INSERT SQL์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ณด๋ด์ง ์๋๋ค.
//์ปค๋ฐํ๋ ์๊ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ INSERT SQL์ ๋ชจ์์ ๋ณด๋ธ๋ค.
transaction.commit(); // ์ปค๋ฐ
ํ๋ฒ์ ๋ชจ์๋ค๊ฐ ๋คํธ์ํฌ๋ก ๋ณด๋ด๊ธฐ ๋๋ฌธ์ ๋คํธ์ํฌ ํต์ ๋น์ฉ์ ์ค์ผ ์ ์๋ค.
๐ก ์ง์ฐ ๋ก๋ฉ๊ณผ ์ฆ์ ๋ก๋ฉ
์ง์ฐ ๋ก๋ฉ : ๊ฐ์ฒด๊ฐ ์ค์ ์ฌ์ฉ๋ ๋ ๋ก๋ฉ
์ฆ์ ๋ก๋ฉ : JOIN SQL๋ก ํ๋ฒ์ ์ฐ๊ด๋ ๊ฐ์ฒด๊น์ง ๋ฏธ๋ฆฌ ์กฐํ
๐ ๊ฐ๋ฐ์ ์ง์ฐ๋ก๋ฉ์ผ๋ก ์ธํ
ํ ์ฑ๋ฅ ๊ณ ๋ คํ์ฌ ์ฆ์๋ก๋ฉ์ผ๋ก ๋ถ๋ถ ์ธํ
๐ ORM ? - Object-relational mapping(๊ฐ์ฒด ๊ด๊ณ ๋งคํ)
๐ JPA Process ( ์ ์ฅ, ์กฐํ )
java application ๊ณผ jdbc API ์ฌ์ด์์ ๋์
๊ธฐ์กด์๋ ๊ฐ๋ฐ์๊ฐ jdbc api๋ฅผ ์ง์ ์ฌ์ฉํ๋ค๋ฉด JPA๊ฐ ์ฌ์ฉ
๐์์ฝ
JPA๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ๊ธฐ์กด์ SQL์ ์์กด์ ์ธ ๊ฐ๋ฐ ๋ฐฉ์์์ ์ข ๋ ๋น์ง๋์ค ๋ก์ง์ ์ง์คํ๊ณ JPAํ์ค์ด ์ ๊ณตํ๋ ๋ค์ํ ์ด์ ๋ค๊ณผ ์ฑ๋ฅ์ต์ ํ ๊ธฐ๋ฅ๋ค์ ์ฌ์ฉํจ์ผ๋ก์จ ๊ฐ๋ฐ ์์ฐ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ์ฆ๋์ํฌ ์ ์๊ธฐ ๋๋ฌธ์ JPA๋ฅผ ๋ฐฐ์ฐ๊ณ ์ฌ์ฉ ํด์ผํ๋ค.
๐ ์ฐธ๊ณ ๋ฐ ์๋ฃ ์ถ์ฒ : ์๋ฐ ORM ํ์ค JPA ํ๋ก๊ทธ๋๋ฐ - ๊ธฐ๋ณธํธ (๊น์ํ)
'Backend > JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JPA] ์์๊ด๊ณ ๋งคํ, @MappedSuperclass (0) | 2024.03.07 |
---|---|
[JPA] ๋ค์ํ ์ฐ๊ด๊ด๊ณ ๋งคํ ( ManyToOne, OneToMany, OneToOne, ManyToMany ) (0) | 2024.03.04 |
[JPA] ๊ฐ์ฒด ์งํฅ ๋ชจ๋ธ๋ง๊ณผ ์๋ฐฉํฅ,๋จ๋ฐฉํฅ ์ฐ๊ด๊ด๊ณ ๋งคํ (0) | 2024.02.17 |
[JPA] JPA ๊ฐ์ฅ ์ค์ํ 2๊ฐ์ง - ์ํฐํฐ ๋งคํ (0) | 2024.02.10 |
[JPA] JPA ๊ฐ์ฅ ์ค์ํ 2๊ฐ์ง - ์์์ฑ ์ปจํ ์คํธ (0) | 2024.02.09 |