Spring Quick Start(์ฑ )์ Day5 class04~05 ์ค์ต์ ์งํํ๋ฉด์ ๊ธฐ๋กํ ๋ด์ฉ์ ๋๋ค.
์ค์ตํ ์ฝ๋์ ๋งํฌ์ ๋๋ค.
JPA๋?
ORM ํ๋ ์์ํฌ๋ค์ ๋ํ ํ์คํ ์์ ์ ๊ฒฐ๊ณผ๊ฐ JPA์ด๋ค.
JPA(Java Persistence API)๋ ๋ชจ๋ ORM ๊ตฌํ์ฒด(ORM ํ๋ ์์ํฌ)๋ค์ ๊ณตํต ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ค.
JDBC๋ Oracle, Mysql, H2 ๋ฑ ํน์ DBMS์ ์ข ์๋์ง ์๋ DB ์ฐ๋ ๊ตฌํ์ ์ง์ํ๋ค.
์ด์ ๋ง์ฐฌ๊ฐ์ง๋ก JPA API(javax.persistence)๋ฅผ ์ด์ฉํ๋ฉด ๊ฐ๋ฐ ๋น์์๋ Hibernate๋ฅผ ORM ํ๋ ์์ํฌ๋ก ์ฌ์ฉํ๋ค๊ฐ ์ค์ ์๋น์ค๊ฐ ์์๋ ๋๋ TopLink๋ก ๋ณ๊ฒฝํ ์ ์๋ค.
===== JPA ํ๋ก์ ํธ ์์ฑ๋ฐฉ๋ฒ =====
1. maven ํ๋ก์ ํธ ์์ฑ
2. persistence.xml ํ์ผ์ด ์์ฑ
project structure > facet > JPA ์ถ๊ฐ ํ + ๋ฒํผ ๋๋ฌ์ persistence.xml ํ์ธ.
persistence.xml ํ์ผ์ด ์์ฑ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
3. pom.xml ํ์ผ์ JPA ๊ด๋ จ ์์กด์ฑ ์ถ๊ฐ
<!-- MySQL -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.21</version>
</dependency>
<!-- JPA, ํ์ด๋ฒ๋ค์ดํธ -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.1.0.Final</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
4. Board ํด๋์ค ์์ฑํ๊ธฐ
JPA Entity ์์ฑ ๊ธฐ๋ฅ์ด intelliJ์๋ ์๋์ง ๋ชจ๋ฅด๊ฒ ์ผ๋
package com.springbook.biz.board;
import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
/**
* Entity implementation class for Entity: Board
*
*/
@Entity
@Table(name = "BOARD")
public class Board {
@Id
@GeneratedValue
private int seq;
private String title;
private String writer;
private String content;
@Temporal(TemporalType.DATE)
private Date regDate = new Date();
private int cnt;
// Getter/Setter/toString ๋ฉ์๋
}
์ด๋ ธํ ์ด์ ์ ์๋ฏธ
์ด๋ ธํ ์ด์ |
์๋ฏธ |
@Entity |
@Entity๊ฐ ์ค์ ๋ ํด๋์ค๋ฅผ ์ํฐํฐ ํด๋์ค๋ผ๊ณ ํ๋ฉฐ, @Entity๊ฐ ๋ถ์ ํด๋์ค๋ ํ ์ด๋ธ๊ณผ ๋งคํ๋๋ค. |
@Table |
์ํฐํฐ์ ๊ด๋ จ๋ ํ ์ด๋ธ์ ๋งคํํ๋ค. name ์์ฑ์ ์ฌ์ฉํ์ฌ BOARD ํ ์ด๋ธ๊ณผ ๋งคํํ๋๋ฐ ์๋ตํ๋ฉด ํด๋์ค ์ด๋ฆ์ด ํ ์ด๋ธ ์ด๋ฆ๊ณผ ๋งคํ๋๋ค. name, catalog, schema, uniqueConstraints ๋ฑ ๋ค์ํ ์์ฑ์ด ์๋ค. |
@Id |
์ํฐํฐ ํด๋์ค์ ํ์ ์ด๋ ธํ ์ด์ ์ผ๋ก์, ํน์ ๋ณ์๋ฅผ ํ ์ด๋ธ์ ๊ธฐ๋ณธ ํค์ ๋งคํํ๋ค. @Id ๊ฐ ์๋ ์ํฐํฐ ํด๋์ค๋ JPA๊ฐ ์ฒ๋ฆฌํ์ง ๋ชปํ๋ค. |
@Column |
์ํฐํฐ ํด๋์ค์ ๋ณ์ ์ด๋ฆ๊ณผ table์ column์ด๋ฆ์ด ๋ค๋ฅผ ๋ ์ฌ์ฉํ๋ค. name, nullable=false ๋ฑ์ ์์ฑ๋ค์ด ์๋ค. |
@GeneratedValue |
@Id๊ฐ ์ ์ธ๋ ํ๋์ ๊ธฐ๋ณธ ํค๋ฅผ ์๋์ผ๋ก ์์ฑํ์ฌ ํ ๋นํ ๋ ์ฌ์ฉํ๋ค. ๋ค์ํ ์ต์ ์ด ์์ง๋ง @GeneratedValue๋ง ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ๋ผ์ ์๋์ผ๋ก ๊ฒฐ์ ๋๋ค. |
@Transient |
์ํฐํฐ ํด๋์ค ๋ด์ ํน์ ๋ณ์๋ฅผ ์์ ํ๋์์ ์ ์ธํ ๋ ์ฌ์ฉํ๋ค. |
@Temporal |
๋ ์ง ํ์ ์ ๋ณ์์ ์ ์ธํ์ฌ ๋ ์ง ํ์ ์ ๋งคํํ ๋ ์ฌ์ฉํ๋ค. TemporalType์ DATE, TIME, TIMESTAMP ์ค ํ๋๋ฅผ ์ ํํ ์ ์๋ค. |
5. persistence.xml ํ์ผ ์์ฑํ๊ธฐ
persistence.xml ์ JPA์์ ๋ฉ์ธ ํ๊ฒฝ์ค์ ํ์ผ์ด๋ค.
META-INF ํด๋ ์๋์ ์์ผ๋ฉด JPA๊ฐ ์ธ์ํ๋ค.
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="JPAProject">
<class>com.springbook.biz.board.Board</class>
<properties>
<!-- DB ์ปค๋ฅ์
-->
<property name="javax.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver" />
<property name="javax.persistence.jdbc.user" value="jueun" />
<property name="javax.persistence.jdbc.password" value="jueun" />
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/springquickstart?serverTimezone=Asia/Seoul&useSSL=false&allowPublicKeyRetrieval=true" />
<!-- Dialect ํด๋์ค ์ค์ -->
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
<!-- JPA ๊ตฌํ์ฒด ๊ด๋ จ ์์ฑ ์ค์ -->
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.use_sql_comments" value="false" />
<property name="hibernate.id.new_generator_mappings" value="true" />
<property name="hibernate.hbm2ddl.auto" value="create" />
</properties>
</persistence-unit>
</persistence>
<persistance>: ๋ฃจํธ ์๋ฆฌ๋จผํธ
<persistence-unit>: ์์์ฑ ์ ๋ ์ค์ . ์์์ฑ ์ ๋์ ์ฐ๋ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋น ํ๋์ ์์์ฑ ์ ๋์ ์ฌ์ฉํ๋ค.
<class>: ์์์ฑ ์ ๋ ์ค์ ์์ ๊ฐ์ฅ ๋จผ์ Entity class๋ฅผ ๋ฑ๋กํ๋ค.
<properties>
<!-- DB ์ปค๋ฅ์ -->
Entity class์ properties๋ฅผ ์ค์ ํ๋๋ฐ ๋จผ์ DB ์ปค๋ฅ์ ์ ์ค์ ํ๋ค.
<!-- Dialect ํด๋์ค ์ค์ -->
JPA๋ ์ต์ ํ๋ SQL์ ์ ๊ณตํ๊ธฐ ์ํด DBMS๋ง๋ค ๋ค๋ฅธ Dialect ํด๋์ค๋ฅผ ์ ๊ณตํ๋๋ฐ, ์ด๋ฅผ ์ค์ ํ๋ค.
<!-- JPA ๊ตฌํ์ฒด ๊ด๋ จ ์์ฑ ์ค์ -->
์์ฑ |
์๋ฏธ |
hibernate.show_sql |
์์ฑ๋ SQL์ ์ฝ์์ ์ถ๋ ฅํ๋ค. |
hibernate.format_sql |
SQL์ ์ถ๋ ฅํ ๋, ์ผ์ ํ ํฌ๋งท์ผ๋ก ๋ณด๊ธฐ ์ข๊ฒ ์ถ๋ ฅํ๋ค. |
shibernate.use_sql_comments |
SQL์ ํฌํจ๋ ์ฃผ์๋ ๊ฐ์ด ์ถ๋ ฅํ๋ค. |
hibernate.id.new_generator_mappings |
์๋ก์ด ํค ์์ฑ ์ ๋ต์ ์ฌ์ฉํ๋ค. |
hibernate.hbm2ddl.auto |
ํ ์ด๋ธ ์์ฑ์ด๋ ์์ , ์ญ์ ๊ฐ์ DDL ๊ตฌ๋ฌธ์ ์๋์ผ๋ก ์ฒ๋ฆฌํ ์ง๋ฅผ |
6. ํด๋ผ์ด์ธํธ ํ๋ก๊ทธ๋จ
ํด๋ผ์ด์ธํธ ํ๋ก๊ทธ๋จ์ ์์ฑํ๊ณ ์คํํด๋ณด์.
ํ ์ด๋ธ์ด ์๋ ์ํฐํฐ ๊ฐ์ฒด๋ฅผ ๋ค๋ฃจ๊ณ ์๋ค๋ ์ฌ์ค์ ๊ธฐ์ตํ์!
package com.springbook.biz.board;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
public class BoardServiceClient {
public static void main(String[] args) {
// EntityManagerFactory ๊ฐ์ฒด๋ก๋ถํฐ EntityManager ๊ฐ์ฒด ์์ฑ
EntityManagerFactory emf = Persistence.createEntityManagerFactory("JPAProject");
EntityManager em = emf.createEntityManager();
// EntityManager๋ฅผ ํตํด Transaction ๊ฐ์ฒด ์์ฑ
EntityTransaction tx = em.getTransaction(); // ํธ๋์ญ์
์ ์ด
try {
// Transaction ์์
tx.begin();
Board board = new Board();
board.setTitle("JPA ์ ๋ชฉ");
board.setWriter("๊ด๋ฆฌ์");
board.setContent("JPA ๊ธ ๋ฑ๋ก ์ ๋๋ค์.");
// ๊ธ ๋ฑ๋ก
em.persist(board);
// ๊ธ ๋ชฉ๋ก ์กฐํ
String jpql = "select b from Board b order by b.seq desc";
List<Board> boardList = em.createQuery(jpql, Board.class).getResultList();
for (Board brd : boardList) {
System.out.println("---> " + brd.toString());
}
// Transaction commit
tx.commit();
} catch (Exception e) {
e.printStackTrace();
// Transaction rollback
tx.rollback();
} finally {
em.close();
}
emf.close();
}
}
*EntityManager์ CRUD ๋ฉ์๋
EntityManager๊ฐ์ฒด๊ฐ ์ ๊ณตํ๋ CRUD ๊ธฐ๋ฅ์ ๋ฉ์๋์ด๋ค.
๋ฉ์๋ |
๊ธฐ๋ฅ ์ค๋ช |
persist(Object entity) |
INSERT |
merge(Object entity) |
UPDATE |
remove(Object entity) |
DELETE |
find(Object entity) |
SELECTE ONE |
createQuery(Object entity) |
SELECT LIST |
*JPQL
๊ธ ๋ชฉ๋ก์ ์กฐํํ ๋, JPQL(Java Persistence Query Language)๋ผ๋ JPA ๊ณ ์ ์ ์ฟผ๋ฆฌ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ๋ค.
JPQL์ ์์ฑํ๊ณ ์คํํ๋ฉด, ํ์ด๋ฒ๋ค์ดํธ ๊ฐ์ JPA ๊ตฌํ์ฒด๊ฐ JPQL์ ์ฐ๋๋๋ DBMS์ ๋ง๊ฒ ์ ์ ํ SELECT ๋ช ๋ น์ด๋ก ๋ณํํ๋ค.
์์ธ๊ฐ ๋ฐ์ํ๋ค๋ฉด ํธ๋์ญ์ ์ ๋กค๋ฐฑ ์ฒ๋ฆฌํ๋ฉด ๋๋ค.
7. ์คํ๊ฒฐ๊ณผ
'Spring > Spring Quick Start' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Mybatis ํ๋ก์ ํธ (0) | 2021.01.08 |
---|---|
์๋ธ๋ฆฟ ๊ฐ์ฒด์ service() ๋ฉ์๋๊ฐ ํธ์ถ๋๋ ๊ณผ์ (0) | 2021.01.07 |
์คํ๋ง ์ปจํ ์ด๋์ ๊ด๊ณ (0) | 2021.01.07 |
intelliJ ํฐ์บฃ ์๋ฒ๋ก ์คํํ๊ธฐ (0) | 2021.01.07 |
IntelliJ๋ก, Spring ํ๋ก์ ํธ(maven) ์์ฑํ๊ธฐ (0) | 2021.01.07 |
IntelliJ Add Framework Support์ Spring์ด ๋ณด์ด์ง ์์ ๋ (0) | 2021.01.07 |