๐ 1. JPA๋?
JPA(Java Persistence API)๋ ์๋ฐ ์ ํ๋ฆฌ์ผ์ด์
์์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ค๋ฃจ๊ธฐ ์ํ ORM(Object-Relational Mapping) ๊ธฐ์ ์
๋๋ค. JPA๋ฅผ ์ฌ์ฉํ๋ฉด SQL์ ์ง์ ์์ฑํ์ง ์๊ณ ๋ ์๋ฐ ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ
์ด๋ธ ๊ฐ์ ๋งคํ์ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
- JPA๋ ์ธํฐํ์ด์ค์ด๋ค. ๋ฐ๋ผ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ์ค์ ํด๋์ค๊ฐ ํ์ํ๋ค.
โ๏ธ ์ฃผ์ ํน์ง
- ORM ์ง์: JPA๋ ์๋ฐ ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ
์ด๋ธ์ ๋งคํํ์ฌ ๊ฐ์ฒด ์งํฅ์ ์ธ ๋ฐฉ์์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์
์ ์ํํ ์ ์๋๋ก ํฉ๋๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋
๋ฆฝ์ฑ: JPA๋ ํน์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ข
์๋์ง ์์ผ๋ฉฐ, ์ฌ๋ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์๋ํ ์ ์์ต๋๋ค.
- ์๋ SQL ์์ฑ: JPA๋ ํ์ํ SQL ์ฟผ๋ฆฌ๋ฅผ ์๋์ผ๋ก ์์ฑํ์ฌ ๊ฐ๋ฐ์๊ฐ ์ง์ SQL์ ์์ฑํ ํ์๋ฅผ ์ค์
๋๋ค.
- ํธ๋์ญ์
๊ด๋ฆฌ: JPA๋ ํธ๋์ญ์
์ ๊ด๋ฆฌํ์ฌ ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ ๋ณด์ฅํฉ๋๋ค.
- ์บ์ฑ: JPA๋ 1์ฐจ ์บ์์ 2์ฐจ ์บ์๋ฅผ ์ง์ํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ก์ธ์ค๋ฅผ ์ต์ ํํฉ๋๋ค.
โ๏ธ ์ฃผ์ ๊ตฌ์ฑ ์์
- Entity : ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ
์ด๋ธ๊ณผ ๋งคํ๋๋ ์๋ฐ ํด๋์ค์
๋๋ค. ๊ฐ ์ํฐํฐ๋ @Entity ์ด๋
ธํ
์ด์
์ผ๋ก ์ ์๋ฉ๋๋ค.
- EntityManager: ์ํฐํฐ์ ์๋ช
์ฃผ๊ธฐ๋ฅผ ๊ด๋ฆฌํ๋ ์ธํฐํ์ด์ค๋ก, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์
์ ์ํํฉ๋๋ค.
- EntityManagerFactory: EntityManager๋ฅผ ์์ฑํ๋ ํฉํ ๋ฆฌ ํด๋์ค์
๋๋ค.
- Persistence Unit: JPA ์ค์ ์ ํฌํจํ๋ ๋จ์๋ก, persistence.xml ํ์ผ์ ์ ์๋ฉ๋๋ค.
๐ 2. JPA ๊ฐ๋จ ์์ ์ฝ๋
1. ์ํฐํฐ ํด๋์ค ์ ์
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
@Entity
public class User {
@Id
private Long id;
private String name;
private String email;
}
2. persistence.xml ์ค์
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.1">
<persistence-unit name="examplePU">
<class>com.example.User</class>
<properties>
<property name="jakarta.persistence.jdbc.url" value="jdbc:h2:mem:test"/>
<property name="jakarta.persistence.jdbc.user" value="sa"/>
<property name="jakarta.persistence.jdbc.password" value=""/>
<property name="jakarta.persistence.jdbc.driver" value="org.h2.Driver"/>
</properties>
</persistence-unit>
</persistence>
3. ์ํฐํฐ ๋งค๋์ ์ฌ์ฉ
import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityManagerFactory;
import jakarta.persistence.Persistence;
public class Main {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("examplePU");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
User user = new User();
user.setId(1L);
user.setName("John Doe");
user.setEmail("john.doe@example.com");
em.persist(user);
em.getTransaction().commit();
em.close();
emf.close();
}
}
- JPA๋ ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ๊ฐ๋ฐ์๊ฐ ๋ ์ฝ๊ฒ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํธ ์์ฉํ ์ ์๋๋ก ๋์์ค๋๋ค.
๐ 3. ORM์ด๋?
ORM : Object-Relational Mapping(๊ฐ์ฒด ๊ด๊ณ ๋งคํ)
- ๊ฐ์ฒด์ ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ๋งคํํ๋ ๊ธฐ์
- ORM ํ๋ ์์ํฌ๊ฐ ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค๊ฐ์์ ๋งคํ
- ๊ฐ์ฒด์ ํ
์ด๋ธ์ ๋งคํํ์ฌ ํจ๋ฌ๋ค์ ๋ถ์ผ์น ๋ฌธ์ ๋ฅผ ํด๊ฒฐ
- ORM์ ์ด์ฉํ๋ฉด ๊ฐ๋ฐ์๊ฐ ์ฟผ๋ฆฌ๋ฅผ ์ง์ ์์ฑํ์ง ์์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค.
- ์ ํ๋ฆฌ์ผ์ด์
Class์ RDB(Relational DataBase)์ ํ
์ด๋ธ์ ๋งคํ(์ฐ๊ฒฐ)ํ๋ค๋ ๋ป
โ๏ธ ORM ์ฅ์
- SQL ๋์ ๋ฉ์๋๋ก DB ์กฐ์: ๊ฐ๋ฐ์๋ ๊ฐ์ฒด ๋ชจ๋ธ์ ์ฌ์ฉํ์ฌ ๋น์ฆ๋์ค ๋ก์ง์๋ง ์ง์คํ ์ ์์ต๋๋ค.
- ์ฝ๋ ๊ฐ์ํ: ๋ถ์์ ์ธ ์ฝ๋๋ฅผ ์ค์ฌ ๊ฐ๋
์ฑ์ ๋์
๋๋ค.
- ๊ฐ์ฒด์งํฅ์ ์ฝ๋ ์์ฑ: ๊ฐ์ฒด์งํฅ ์ ๊ทผ์ ํตํด ์์ฐ์ฑ์ด ์ฆ๊ฐํฉ๋๋ค.
- ์ ์ง๋ณด์ ์ฉ์ด: ๋งคํ ์ ๋ณด๊ฐ ํด๋์ค์ ๋ช
์๋์ด ์์ด ERD ์์กด๋๋ฅผ ๋ฎ์ถ๊ณ , ์ ์ง๋ณด์ ๋ฐ ๋ฆฌํฉํ ๋ง์ ์ ๋ฆฌํฉ๋๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ณ๊ฒฝ์ ์ ์ฐ: ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ณ๊ฒฝํด๋ ์ฟผ๋ฆฌ ์์ ์ด ํ์ ์์ต๋๋ค.
โ๏ธ ORM ๋จ์
- ์ค๊ณ์ ์ค์์ฑ: ์ค๊ณ๊ฐ ์๋ชป๋๋ฉด ์๋ ์ ํ ๋ฐ ์ผ๊ด์ฑ ๋ฌธ์ ๋ฅผ ์ด๋ํ ์ ์์ต๋๋ค
- ๋ณต์กํ ์ฟผ๋ฆฌ: ์ฑ๋ฅ์ ์ํด ๋ณต์กํ ์ฟผ๋ฆฌ๋ ํ๋์ด ํ์ํ๋ฉฐ, ๊ฒฐ๊ตญ SQL์ ์จ์ผ ํ ์๋ ์์ต๋๋ค.
- ํ์ต ๋น์ฉ: ํ์ต ๊ณก์ ์ด ๋์ ์ด๊ธฐ ๋์
๋น์ฉ์ด ํด ์ ์์ต๋๋ค.
๐ 4. JPA์ ๋์
โ๏ธ JPA์ ๋์
JPA๋ ์ ํ๋ฆฌ์ผ์ด์
๊ณผ JDBC ์ฌ์ด์์ ๋์ํ๋ค.

- JPA๋ JDBC API๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๊ฒ ๋๋ค.

์ ์ฅ
- MemberDAO ํด๋์ค๋ฅผ ํตํด persist()๋ฅผ ์คํํ๋ฉด, JPA๊ฐ Entity ๊ฐ์ฒด๋ฅผ ๋ถ์ํ์ฌ SQL๋ฌธ์ ์์ฑํ๋ค.
- JDBC API๋ฅผ ์ฌ์ฉํ์ฌ DB์ ์์ฑ๋ INSERT SQL์ ๋ณด๋ด๊ฒ ๋๋ค.
- ์ด ๊ณผ์ ์์ JPA๋ ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ
์ด๋ธ์ ํจ๋ฌ๋ค์ ๋ถ์ผ์น๋ฅผ ํด๊ฒฐํ๋ค.

์กฐํ
- MemberDAO ํด๋์ค๋ฅผ ํตํด find(id)๋ฅผ ์คํํ๋ฉด, JPA๋ SELECT SQL์ ์์ฑํ๋ค.
- JDBC API๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ๋ SELECT SQL์ ๋ณด๋ธ๋ค.
- DB์์ ๋ฐํ๋ ์ ๋ณด๋ฅผ ResultSet ๋งคํ์ ํตํด ๊ฐ์ฒด๋ก ๋ณํํด ์ค๋ค.
- ์ด ๊ณผ์ ์์๋ ํจ๋ฌ๋ค์ ๋ถ์ผ์น ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด ์ค๋ค.
โ๏ธ JPA์ ์์ฐ์ฑ(CRUD)
- JPA๋ฅผ ์ฌ์ฉํ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ์์ฐ์ฑ์ด ๋์์ง๋ค. JDBC ๋ฐฉ์์ ๊ฒฝ์ฐ SQL ์ฟผ๋ฆฌ๋ฌธ์ ์ง์ ์์ฑํด์ผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ๊ทผํ ์ ์๋ค.
- ํ์ง๋ง JPA๋ ์ฟผ๋ฆฌ๋ฌธ์ ๋ณ๋๋ก ์์ฑํ ํ์๊ฐ ์๋ค. ๋์ ๋ค์๊ณผ ๊ฐ์ด ๊ฐ๋จํ ๋ฉ์๋๋ฅผ ํตํด CRUD๊ฐ ๊ฐ๋ฅํ๋ค.
- ์ ์ฅ : jpa.persist(member)
- ์กฐํ : Member member = jpa.find(memberId)
- ์์ : member.setName(โ๋ณ๊ฒฝํ ์ด๋ฆโ)
- ์ญ์ : jpa.remove(member)
โ๏ธ JPA ์ ์ง๋ณด์
๊ธฐ์กด์๋ ์ํฐํฐ ํด๋์ค์ ํ๋๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๋ชจ๋ SQL์ ์์ ํด์ผ ํ๋ค.
JPA์์๋ ์ฟผ๋ฆฌ๋ฅผ ์ง์ ์์ฑํ์ง ์๊ธฐ ๋๋ฌธ์ ํ๋๊ฐ ๋ณ๊ฒฝ๋๋๋ผ๋ ๋งคํ ์ ๋ณด๋ง ์ ์ฐ๊ฒฐํ๋ฉด SQL๋ฌธ์ ์๋์ผ๋ก ์์ฑ๋๋ค.
- ์ด์ ๊ฐ์ด ๊ฐ์ฒด์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์๋ก ๋ค๋ฅธ ๋ชฉ์ ์ ๊ฐ์ง๊ณ ์ค๊ณ๋์๊ธฐ ๋๋ฌธ์ ๋งคํํ๋๋ฐ ์์ด ์ฌ๋ฌ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค. ํ์ง๋ง JPA๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ๋ชจ๋ ํด๊ฒฐํ ์ ์๋ค.
๐ 5. JPA์ ๋์ ์์ ์ฝ๋
ํ
์ด๋ธ ๊ตฌ์ฑ ์์
| id | subject | content |
|---|
| 1 | ์ถ์1์ผ์ฐจ | 1์ผ์งธ ์
๋๋ค |
| 2 | ์ถ์2์ผ์ฐจ | 2์ผ์งธ ์
๋๋ค |
sql ์ฟผ๋ฆฌ๋ก ์์ฑํ๋ค๋ฉด?
creat table board(
id int primary key,
subject varchar(100) not null,
content varchar(1000) not null
);
insert into question (subject, content)
values ('์ถ์1์ผ์ฐจ', '1์ผ์งธ ์
๋๋ค'), ('์ถ์2์ผ์ฐจ', '2์ผ์งธ ์
๋๋ค');
ORM์ ์ด์ฉํ์ฌ ์์ฑํ๋ค๋ฉด!
board q1 = new board();
q1.setSubject("์ถ์1์ผ์ฐจ");
q1.setContent("1์ผ์งธ ์
๋๋ค");
this.boardRepository.save(q1);
board q2 = new board();
q2.setSubject("์ถ์2์ผ์ฐจ");
q2.setContent("2์ผ์งธ ์
๋๋ค");
this.boardRepository.save(q2);
- ์ฝ๋์์ board์ ์๋ฐ ํด๋์ค์ด๋ฉฐ, ์ด์ฒ๋ผ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ ์ฌ์ฉํ๋ ORM ํด๋์ค๋ฅผ ์ํฐํฐ(Entity)๋ผ๊ณ ํ๋ค.
- ORM์ ์ด์ฉํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ข
๋ฅ์ ์๊ด ์์ด ์ผ๊ด๋ ์ฝ๋๋ฅผ ์ ์งํ ์ ์์ด์ ํ๋ก๊ทธ๋จ์ ์ ์งยท๋ณด์ํ๊ธฐ๊ฐ ํธ๋ฆฌํ๋ค.
- ๋ํ ๋ด๋ถ์์ ์์ ํ SQL ์ฟผ๋ฆฌ๋ฅผ ์๋์ผ๋ก ์์ฑํด ์ฃผ๋ฏ๋ก ๊ฐ๋ฐ์๊ฐ ๋ฌ๋ผ๋ ํต์ผ๋ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ์ ์๊ณ ์ค๋ฅ ๋ฐ์๋ฅ ๋ ์ค์ผ ์ ์๋ค.
์ถ์ฒ :