JPA ๊ฐ์
ORM ํ๋ ์์ํฌ : ๊ฐ์ฒด์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋งคํํด์ค๋ค.
JPA ์ ์
- EJB์์ ํ์ด๋ฒ๋ค์ดํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ง ์๋ก์ด ์๋ฐ ORM ๊ธฐ์ ํ์ค
- ์๋ฐ ์ง์์ ORM ๊ธฐ์ ํ์ค์ด๋ค.(object relational mapping)
- ์ง๋ฃจํ๊ณ ๋ฐ๋ณต์ ์ธ crud sql์ ์์์ ์ฒ๋ฆฌํด์ฃผ๊ณ , ์คํ ์์ ์ ์๋์ผ๋ก SQL์ ๋ง๋ค์ด์ ์คํํ๋ค.
- ์กฐํ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ฒด๋ก ๋งคํํ๋ ์์
์ ๋๋ถ๋ถ ์๋์ผ๋ก ์ฒ๋ฆฌํด์ค๋ค.
JPA ์ฅ์
- ์ดํ๋ฆฌ์ผ์ด์
์ SQL์ด ์๋ ๊ฐ์ฒด ์ค์ฌ์ผ๋ก ๊ฐ๋ฐํ๋ค๋ณด๋ ์์ฐ์ฑ, ์ ์ง๋ณด์ ์ธก๋ฉด์์ ์ข๋ค.
- 1๏ธโฃ ์ ์ง๋ณด์ ์ธก๋ฉด
- JPA๋ฅผ ์ฌ์ฉํ๋ฉด, ์ด๋ฌํ ๊ณผ์ ์ ๋์ ์ฒ๋ฆฌํด์ฃผ๊ธฐ ๋๋ฌธ์ ์์ ํ ์ฝ๋๊ฐ ์ค์ด๋ ๋ค.
- SQL์ ์ง์ ๋ค๋ฃจ๋ฉด ์ํฐํฐ์ ํ๋๋ฅผ ํ๋๋ง ์ถ๊ฐํด๋ ๊ด๋ จ๋ ๋ฑ๋ก, ์์ , ์กฐํ SQL๊ณผ ๊ฒฐ๊ณผ๋ฅผ ๋งคํํ๊ธฐ ์ํ jdbc api ์ฝ๋๋ฅผ ๋ชจ๋ ๋ณ๊ฒฝํด์ผ ํ๋ค.
- 2๏ธโฃ ์์ฐ์ฑ ์ธก๋ฉด
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๊ณ ์ค์ฌ์ ํจ๋ฌ๋ค์์ ๊ฐ์ฒด ์ค๊ณ์ค์ฌ์ผ๋ก ์ญ์ ํ ์ ์๋ค.
- jpa์๊ฒ ์ ์ฅํ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํด์ฃผ๋ฉด ๋๊ธฐ ๋๋ฌธ์ sql, jdbc api๋ฅผ ์ง์ ์์ฑํ์ง ์์๋ ๋๋ค.
- 1๏ธโฃ ์ ์ง๋ณด์ ์ธก๋ฉด
- ํน์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ข
์๋์ง ์๋๋ค.(์ถ์ํํ ๋ฐ์ดํฐ ์ ๊ทผ ๊ณ์ธต์ ์ ๊ณต)
- → ์ฝ๋ ์์ ์ด ๊ฑฐ์ ์์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ณ๊ฒฝ์ ์ฝ๊ฒ ํ ์ ์๋ค.
- ํจ๋ฌ๋ค์์ ๋ถ์ผ์น ํด๊ฒฐ
- ์์, ์ฐ๊ด๊ด๊ณ, ๊ฐ์ฒด ๊ทธ๋ํ ํ์๊ณผ ๊ฐ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ค๋ค.
- ๊ฐ์ฒด ๊ทธ๋ํ๋ฅผ ๋ง์๊ป ํ์ํ ์ ์๋ค.→ ์ธ์ ๋์ด์ง ์ง ๋ชจ๋ฅด๋ ๊ฐ์ฒด ๊ทธ๋ํ๋ฅผ ํ์ํด์ผ ํ๋ค๋ ๋ถ์๊ฐ ์กด์ฌ
- → ์์๋ณด๋ ค๋ฉด DAO(๋ฐ์ดํฐ ์ ๊ทผ๊ณ์ธต)๋ฅผ ์ด์ด์ sql์ ํ์ธํด์ผ ํ๋๋ฐ, ์ด๋ ์ํฐํฐ์ ๊ฐํ ์์กด๊ด๊ณ๋ฅผ ๊ฐ์ง๋ค.
- → (๋น๊ต) SQL์ ์ง์ ๋ค๋ฃจ๊ฒ ๋๋ฉด ์ฒ์ ์คํํ๋ sql์ ๋ฐ๋ผ ๊ฐ์ฒด ๊ทธ๋ํ๋ฅผ ์ด๋๊น์ง ํ์ํ ์ ์๋์ง ์ ํด์ง๋ค.
JPA ์ดํ๋ฆฌ์ผ์ด์ ๋ง๋ค๊ธฐ
1. ๊ฐ์ฒด ๋งคํ ๋ฐฉ๋ฒ
//Member.java
@Entity
@Table(name="MEMBER")
public class Member {
@Id
@Column(name = "ID")
private String id;
@Column(name = "NAME")
private String username;
// ๋งคํ ์ ๋ณด๊ฐ ์์
private Integer age;
}
@Table, @Entity, @Column์ ํ์ ํด๋์ค์ ๋งคํ ์ ๋ณด๋ฅผ ํ์ํ๋ ์ด๋ ธํ ์ด์ ์ด๋ค.
@Entity
- ์ด ํด๋์ค๋ฅผ ํ ์ด๋ธ๊ณผ ๋งคํํ๋ค๊ณ JPA์๊ฒ ์๋ ค์ค๋ค.
- JPA์ ์ํฐํฐ : ํ ์ด๋ธ์ ๊ฐ์ฒด๋ก ํํํ ์๋ฐ ํด๋์ค
@Table
- ์ํฐํฐ ํด๋์ค์ ๋งคํํ ํ ์ด๋ธ ์ ๋ณด๋ฅผ ์๋ ค์ค๋ค.
- ์ฌ๊ธฐ์ Member ์ํฐํฐ๋ฅผ MEMBER ํ ์ด๋ธ์ ๋งคํํ๋ค.
@Id
- ์ํฐํฐ ํด๋์ค์ ํ๋๋ฅผ ํ ์ด๋ธ์ ๊ธฐ๋ณธํค์ ๋งคํํ๋ค.
- ์๋ณ์ ํ๋๋ผ๊ณ ํ๋ค.
@Column
- ํ๋๋ฅผ ์ปฌ๋ผ์ ๋งคํํ๋ค.
- Member ์ํฐํฐ์ username ํ๋๋ฅผ ํ ์ด๋ธ์ NAME ์ปฌ๋ผ์ ๋งคํํ๋ค.
NONE
- ๋งคํ ์ ๋ณด๊ฐ ์์๋, ํ๋๋ช ์ ์ด์ฉํด ์ปฌ๋ผ๋ช ์ผ๋ก ๋งคํํ๋ค.
2. ์ดํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ
public class JpaMain {
public static void main(String[] args) {
//์ํฐํฐ ๋งค๋์ ํฉํ ๋ฆฌ ์์ฑ
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabook");
//์ํฐํฐ๋งค๋์ ์์ฑ
EntityManager em = emf.createEntityManager();
//ํธ๋์ญ์
ํ๋
EntityTransaction tx = em.getTransaction();
try {
tx.begin(); //ํธ๋์ญ์
์์
logic(em); //๋น์ฆ๋์ค ๋ก์ง
tx.commit();//ํธ๋์ญ์
์ปค๋ฐ
} catch (Exception e) {
e.printStackTrace();
tx.rollback(); //ํธ๋์ญ์
๋กค๋ฐฑ
} finally {
em.close(); //์ํฐํฐ ๋งค๋์ ์ข
๋ฃ
}
emf.close(); //์ํฐํฐ ๋งค๋์ ํฉํ ๋ฆฌ ์ข
๋ฃ
}
}
- ์ํฐํฐ ๋งค๋์ ํฉํ ๋ฆฌ ์์ฑ
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabook");
- JPA๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ์ค๋นํ๋ค.
- ์์ฑ๋น์ฉ์ด ๋งค์ฐ ํฌ๊ธฐ ๋๋ฌธ์ ์ดํ๋ฆฌ์ผ์ด์ ์ ์ฒด์์ ๋ฑ ํ๋ฒ๋ง ์์ฑ๋์ด์ผ ํ๋ค.
- ์ํฐํฐ ๋งค๋์ ์์ฑ
EntityManager em = emf.createEntityManager();
- JPA์ ๊ธฐ๋ฅ ๋๋ถ๋ถ์ ์ด ์ํฐํฐ ๋งค๋์ ์์ ์ ๊ณตํ๋ค.
- ์ํฐํฐ๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฑ๋ก/์์ /์ญ์ /์กฐํ ํ ์ ์๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์ ์ ์ ์งํ๋ฉด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํต์ ํ๊ธฐ ๋๋ฌธ์ ์ค๋ ๋๊ฐ ๊ณต์ ๋ ์ฌ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅํ๋ค.
- ์ข ๋ฃ
em.close();
์ฌ์ฉ์ด ๋๋ ์ํฐํฐ ๋งค๋์ ๋ ๋ง๋์ ์ข ๋ฃํด์ผ ํ๋ค.
emf.close(); //์ํฐํฐ ๋งค๋์ ํฉํ ๋ฆฌ ์ข
๋ฃ
์ํฐํฐ ๋งค๋์ ํฉํ ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ด ์ข ๋ฃํ๋ค.
- ํธ๋์ญ์ ๊ด๋ฆฌ
try {
tx.begin(); //ํธ๋์ญ์
์์
logic(em); //๋น์ฆ๋์ค ๋ก์ง
tx.commit();//ํธ๋์ญ์
์ปค๋ฐ
} catch (Exception e) {
e.printStackTrace();
tx.rollback(); //ํธ๋์ญ์
๋กค๋ฐฑ
} finally {
em.close(); //์ํฐํฐ ๋งค๋์ ์ข
๋ฃ
}
- JPA๋ฅผ ์ฌ์ฉํ๋ฉด ํญ์ ํธ๋์ญ์ ์์์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ค.
- ํธ๋์ญ์ ์ ์์ํ๋ ค๋ฉด ์ํฐํฐ ๋งค๋์ ์์ ํธ๋์ญ์ API๋ฅผ ๋ฐ์์์ผ ํ๋ค.
- ํธ๋์ญ์ ์์ ์ดํ ์ ์์ ์ผ๋ก ๋์ํ๋ฉด ํธ๋์ญ์ ์ ์ปค๋ฐํ๊ณ , ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ๋กค๋ฐฑํ๋ค.
- ๋น์ฆ๋์ค ๋ก์ง
public static void logic(EntityManager em) {
String id = "id1";
Member member = new Member();
member.setId(id);
member.setUsername("์งํ");
member.setAge(2);
//๋ฑ๋ก
em.persist(member);
//์์
member.setAge(20);
//ํ ๊ฑด ์กฐํ
Member findMember = em.find(Member.class, id);
System.out.println("findMember=" + findMember.getUsername() + ", age=" + findMember.getAge());
//๋ชฉ๋ก ์กฐํ
List<Member> members = em.createQuery("select m from Member m", Member.class).getResultList();
System.out.println("members.size=" + members.size());
//์ญ์
em.remove(member);
}
- ๋น์ฆ๋์ค ๋ก์ง : ํ๋ก๊ทธ๋จ์ ํต์ฌ ๋ก์ง, ์ด๋ป๊ฒ ๋ฐ์ดํฐ๊ฐ ์์ฑ๋๊ณ ์ ์ฅ๋๊ณ ์์ ๋๋์ง๋ฅผ ์ ์ํ ๊ฒ
- ๋ฑ๋ก, ์์ , ์ญ์ , ์กฐํ ์์
์ด ์ํฐํฐ ๋งค๋์ ๋ฅผ ํตํด์ ์ํ๋๋ค.
- ex)em.remove, em.persist, em.createQuery().getResult() …
- ์์
//์์
member.setAge(20);
์์ ๋ถ๋ถ์ ๋ ํนํ๋ค. JPA๋ ์ด๋ค ์ํฐํฐ๊ฐ ๋ณ๊ฒฝ๋์๋์ง ์ถ์ ๋๋ ๊ธฐ๋ฅ์ ๊ฐ์ถ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ํฐํฐ์ ๊ฐ๋ง ๋ณ๊ฒฝํ๋ฉด UPDATE SQL์ ์์ฑํด์ ๋ณ๊ฒฝ์ํจ๋ค.
- ๋ชฉ๋ก ์กฐํ
//๋ชฉ๋ก ์กฐํ
List<Member> members = em.createQuery("select m from Member m", Member.class).getResultList();
JPA์์ ์ํฐํฐ ๊ฐ์ฒด๋ฅผ ๋์์ผ๋ก ๊ฒ์ํ๋ ค๋ฉด, ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ดํ๋ฆฌ์ผ์ด์ ์ผ๋ก ๋ถ๋ฌ์์ ์ํฐํฐ ๊ฐ์ฒด๋ก ๋ณ๊ฒฝํ ๋ค์ ๊ฒ์ํด์ผ ํ๋๋ฐ, ์ด๋ ๋ถ๊ฐ๋ฅํ๋ค.
ํ์ํ ๋ฐ์ดํฐ๋ง ๋ถ๋ฌ์ค๋ ค๋ฉด ๊ฒฐ๊ตญ SQL์ ์ฌ์ฉํด์ผ ํ๋ค. JPA๋ JPQL์ด๋ผ๋ ์ฟผ๋ฆฌ ์ธ์ด๋ก ์ด๋ฅผ ํด๊ฒฐํ๋ค.(JPQL์ SQL๋ฅผ ์ถ์ํํ ์ธ์ด๋ค.)
- JPQL, SQL ์ฐจ์ด์
SQL
: ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์ ๋์์ผ๋ก ์ฟผ๋ฆฌํ๋ค. JPQL
: SQL์ ์ถ์ํํ ์ธ์ด๋ค. ์ํฐํฐ ๊ฐ์ฒด๋ฅผ ๋์์ผ๋ก ์ฟผ๋ฆฌํ๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ์ด๋ธ์ ๋ชจ๋ฅธ๋ค.
JPA๋ JPQL์ ๋ถ์ํด์ ์ ์ ํ SQL์ ๋ง๋ค์ด ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ค.
์ค๊ฐ ํ๊ณ
2์ฅ๊น์ง ๋ณด๋ฉด์ ๋๋์ ์ ์ ์ด๋ณด๊ฒ ๋ค!
ํ๋ก์ ํธ ๊ฒฝํ๋ ์ด๋์ ๋ ์๊ณ , ๊ตฌ๊ธ๋ง์ ํตํด์ ์๋ก์ด ๊ธฐ๋ฅ๋ค์ ๊ตฌํํ๋๊ฒ ์ต์ํด์ ธ์ JPA์ ๋ํด ๋ง์ด ์๋ค๊ณ ์๊ฐํ์๋๋ฐ ์์ ํฐ ์ค์ฐ์ด์๋ค.
๋งค๋ฒ ์ค๋ฌดํ, ์ค์ ํ๋ง์ ์ด์ดํ๋ฉฐ ๊น๊ฒ ๊ณต๋ถํ์ง๋ ์์ ์ฑ ์์ ๊ฐ์ ๊ฐ์ง๊ณ ์์๋๋ฐ ๊ฐ์๋ก ๊น์ ๋ด์ฉ์ ๋ํด ์๊ณ ์ถ๋ค๋ ์ด๋ง์ด ์๊ธฐ๋ ๊ฒ ๊ฐ์์ ํด๋น ์ฑ ์ ๊ตฌ๋งคํ๊ฒ ๋๋ค.
SpringData JPA๋ฅผ ๊ฒฝํํด ๋ณธ ์ ์ ์์ง๋ง JPA๋ฅผ ์ด์ฉํ ์์ ๋ ์ฒ์ ์ ํด๋ดค๋๋ฐ ์ฌ์ค ์ด ๋์ ์ฐจ์ด๋ ์ ๋ชฐ๋์๋ค..-_- ์ถฉ๊ฒฉ์ ์ผ๋ก ์์๋ ๋์ ์ง์์ ๋ฐ์ฑํ๋ฉฐ..
๊ทธ๋๋ ‘๊น๊ฒ ์์๋ณด๊ณ ์ถ๋ค’๋ ์๊ฐ์ด ๋ค์๊ณ ์ค์ค๋ก ์ฐพ์๋ดค๋ค๋๊ฒ ๋ฟ๋ฏํ๋ค. ์ด ์ฑ ์ ๋ง๋์ ๊ธฐ์๋ค!! ์ด ์ฑ ์ ๋ค ์ฝ์๋์ฏค์ด๋ฉด ํ์ธต ๋ ๊น์ ๋ด๊ฐ ๋๊ธธ ๋ฐ๋๋คใ .ใ
์ฐธ๊ณ
์ ํํ ์ ๋ณด๋ฅผ ์ ๋ฌํ๊ณ ์ ์ต์ ์ ๋คํ์ง๋ง, ํ๋ฆฐ ๋ถ๋ถ์ด ์์ ์ ์์ต๋๋ค!
ํ๋ฆฐ ๋ถ๋ถ์ด ์์ ์ ์ง์ ํด์ฃผ์๋ฉด ๊ฐ์ฌํ ๋ฐ์ํ๊ฒ ์ต๋๋ค๐
'๐ค study > JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JPA] Hibernate, JPA, Spring Data JPA, JDBC ์ฐจ์ด (0) | 2022.11.15 |
---|