JPA ๊ธฐ์ด ์ ๋ณต ํฌ์ธํธ
1. ๊ฐ์ฒด - RDB ๊ฐ ๋งคํ(์ค๊ณ ๊ณผ์ )
2. ์ค์ JPA ๋์ ~ ์์์ฑ ์ปจํ ์คํธ
๊ฐ์ฒด ๋งคํํ๊ธฐ
ํ์ํ ์ด๋ ธํ ์ด์ :
@Entity
@Id : DB PK์ ๋งคํํ ํ๋
Persistence.xml
JPA ์ค์ ํ์ผ
jakartax.persistence ~ : JPA ํ์ค ์์ฑ (๊ฑฐ์ ์ฌ์ฉ ์ํจ)
hibernate : ํ์ด๋ฒ๋ค์ดํธ ์ ์ฉ ์์ฑ
์ค์ต : (* = ์คํ๋ง ๋ถํธ๊ฐ ํ๋ ์ผ ํ์ ํ๊ธฐ)
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ผ๊ธฐ
Maven์ ์ฌ์ฉํ ํ๋ก์ ํธ ์์ฑ -> JDK 8, hibernate-entitymanager, h2database ์ฌ์ฉ
Main, ์ํฐํฐ ํจํค์ง - Member ํด๋์ค ์์ฑ + @Entity/@Id ~ ๊ธฐ๋ณธ DB ์ฐ๊ฒฐ์ธํ ์๋ฃ
Getter, Setter ์ค์ ~ JPA ๊ตฌ๋๋ฐฉ์
Persistence.xml ์ค์
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.2">
<persistence-unit name="hello">
<properties>
<!-- ํ์ ์์ฑ -->
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
<property name="javax.persistence.jdbc.user" value="sa"/>
<property name="javax.persistence.jdbc.password" value=""/>
<property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" />
<!-- ์ต์
-->
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.use_sql_comments" value="true" />
<property name="hibernate.id.new_generator_mappings" value="true" />
<property name="hibernate.hbm2ddl.auto" value="create" /> <!-- ์๋ table์ dropํ๊ณ ์๋ก ๋ง๋ฌ -->
</properties>
</persistence-unit>
</persistence>
๋ฐฉ์ธ(Dialect) ์ง์ ๋ฐฉ๋ฒ -> hibernate.dialect.๋ฐฉ์ธ ~ ex) H2: org.hibernate.dialect.H2Dialect
์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ
- ์ํฐํฐ ๋งค๋์ ํฉํ ๋ฆฌ ์ค์
- ์ํฐํฐ ๋งค๋์ ์ค์ : ์ํฐํฐ ๋งค๋์ โ JPA
- ํธ๋์ ์
package hellojpa;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
public class Main {
public static void main(String[] args) {
EntityManagerFactory emf =
Persistence.createEntityManagerFactory("hello");
// persistence.xml ์ค์ ์ ๊ฐ์ง๊ณ ์๋ ์ํฐํฐ๋งค๋์ ํฉํ ๋ฆฌ ์์ฑ
EntityManager em = emf.createEntityManager(); // ์ํฐํฐ ๋งค๋์ ์์ฑ
EntityTransaction tx = em.getTransaction(); // Transaction์ ์ป๋๋ค
tx.begin(); // ํธ๋์ ์
์์
try {
Member member = new Member(); // ๊ฐ์ฒด ์์ฑ ๋ฐ ๊ฐ ๋ณ๊ฒฝ
member.setId(1L);
member.setName("hello");
em.persist(member); // ์๊ตฌ์ ์ฅ
tx.commit(); // ์ปค๋ฐ
} catch (Exception e) {
tx.rollback(); // ์์ธ ๋ฐ์์ ํธ๋์ ์
๋กค๋ฐฑ
} finally {
em.close(); // ์ํฐํฐ ๋งค๋์ ๋ ์ฌ์ฉ ํ ๋ฌด์กฐ๊ฑด ๋ซ์์ค์ผ ํ๋ค.
}
emf.close();
}
}
๋งค๋์ ํ๋ก์ธ์ค
ํธ๋์ ์ ์ ์ป๊ธฐ ~ JPA์ ๋ชจ๋ ํ๋์ Transaction ์์์ ์ด๋ฃจ์ด์ง๋ค -> ๊ฐ์ฒด ์์ฑ ๋ฐ ์์ฑ ์์ ์ํ(๋์ผ๋ด์ฉ ์ค๋ณต์ํ์ PK ๊ฐ์ ์ถฉ๋๋ก ์ค๋ฅ๋ฐ์) -> ๋งค๋์ ์ ๊ฐ์ฒด ๊ฐ ์ ์ฅ -> ์ปค๋ฐ ํ ์ํฐํฐ ๋งค๋์ ์ข ๋ฃ
*์ฃผ์ํ ์ :
์ํฐํฐ ๋งค๋์ ํฉํ ๋ฆฌ๋ ํ๋๋ง ์์ฑํด์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด์์ ๊ณต์ ํ๋ค
์ํฐํฐ ๋งค๋์ ๋ ์ฐ๋ ๋ ๊ฐ ๊ณต์ ํ๋ฉด ์๋๋ค(์ฌ์ฉํ๊ณ ๋ฒ๋ ค์ผ ํ๋ค)
JPA์ ๋ชจ๋ ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ํธ๋์ ์ ์์์ ์คํ
- ๋น์ฆ๋์ค ๋ก์ง(CRUD)
JPA์ ์ฅ์ : ์ง์ ๋งคํ์ ํ๊ธฐ ๋๋ฌธ์, JPA๋ฅผ ํตํด ํ ์ด๋ธ์ ์ง์ ๋ง๋ค ์ ์๋ค.
~ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐฉ์ธ์ ํ์ฉํด ์ ์ ํ DDL ์์ฑ -> ์ด DDL์ ๊ฐ๋ฐ ์ฅ๋น์์๋ง ์ฌ์ฉํด์ผ ํ๋ค(Create, Create-drop, Update)
๋งคํ ์ด๋ ธํ ์ด์
@Column
name : ํ๋์ ๋งคํํ ํ ์ด๋ธ์ ์ปฌ๋ผ ์ด๋ฆ
insertable, updatable : ์ฝ๊ธฐ ์ ์ฉ
nullable : null ํ์ฉ์ฌ๋ถ ๊ฒฐ์ , DDL ์์ฑ ์ ์ฌ์ฉ
unique : ์ ๋ํฌ ์ ์ฝ ์กฐ๊ฑด, DDL ์์ฑ ์ ์ฌ์ฉ
columnDefinition, length, precision, scale (DDL)
@Temporal
@Enumerated
EnumType.String : ์ด๊ฑฐํ ์ด๋ฆ์ ๊ทธ๋๋ก ์ ์ฅ
@Lob
CLOB, BLOB ๋งคํ
CLOB : String, char[], java.sql.CLOB
BlOB : byte[], java.sql.BLOB
@Lob
private String lobString;
@Lob
private byte[] lobByte;
@Transient : DB์ ๋งคํํ๊ณ ์ถ์ง๋ ์์๋ฐ ๊ฐ์ฒด ์์ฑ์ผ๋ก ์ ์ฅํด๋๊ณ ์ถ์ ๊ฐ
์๋ณ์ ๋งคํ
@Id : ์ง์ ๋งคํ
@GeneratedValue ~ @GeneratedValue(strategy = GenerationType.Auto) :
id ๊ฐ์ DB ์ํ์ค ์ค๋ธ์ ํธ๋ฅผ ์ฌ์ฉํ์ฌ ์๋์ผ๋ก ๋ถ์ฌ
Auto ๋์ : Identity - MYSQL/ Sequence(@SequenceGenerator) - ORACLE/ Table(@TableGenerator) - ๋ชจ๋ DB
*์๋ณ์ ์ ๋ต
1) ๊ธฐ๋ณธ ํค ์ ์ฝ์กฐ๊ฑด : not null, ์ ์ผํ ๊ฐ, ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅํด์ผ ํ๋ค.
2) ๋น์ฆ๋์ค์ ๊ด๊ณ์๋ ๋๋ฆฌ ํค๋ฅผ ์ฌ์ฉํ์ ~ ๋ถ๋ณํ๋ ์์ฐ ๊ฐ์ ์ฐพ๋ ๊ฒ์ ์ ๋ง ์ด๋ ต๋ค.
=> ๊ถ์ฅ : Long + ๋์ฒด ํค + ํค ์์ฑ์ ๋ต
'Spring๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์คํ๋ง ์๋ จ : Project MySelectShop (3) (0) | 2022.12.15 |
---|---|
์คํ๋ง ์๋ จ : Project MySelectShop (2) (0) | 2022.12.15 |
์คํ๋ง ์๋ จ : Project MySelectShop (1) (0) | 2022.12.13 |
T ์์นด๋ฐ๋ฏธ : JPA ํ๋ก๊ทธ๋๋ฐ ๊ธฐ์ด (2) (1) | 2022.12.13 |
JPA : ORM ์ด์ ๊น์ง ํ๋ฆ (0) | 2022.12.05 |