<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
spring data jpa 의존성을 추가한다.
그 외에도 h2, lombok을 추가로 설정해줬다.
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Entity
@Table(name="SARAM")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SaramEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long seq;
private String id;
private String name;
private int age;
}
JPA는 매핑 어노테이션으로 어떤 객체가 어떤 테이블과 관계가 있는지 알아냄!
name="테이블이름"
으로 해당 엔티티를 테이블이름
테이블에 매핑[식별자 값 생성 전략]
@GeneratedValue(strategy = GenerationType.IDENTITY)
@GeneratedValue(strategy = GenerationType.SEQUNCE)
@GeneratedValue(strategy = GenerationType.TABLE)
@GeneratedValue(strategy = GenerationType.AUTO)
(https://gmlwjd9405.github.io/2019/08/12/primary-key-mapping.html)
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.1"
xmlns:xsi="http://www.w3.org/2001/XMSchema-instance">
<persistence-unit name="SaramJPA">
<class>org.comstudy.saramjpa.domain.SaramEntity</class>
<properties>
<!-- 필수 속성 - Database Source 설정 -->
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver" /> <!-- JDBC 드라이버 -->
<property name="javax.persistence.jdbc.user" value="userId" /> <!-- DB 접속 ID -->
<property name="javax.persistence.jdbc.password" value="userPw" /> <!-- DB 접속 PW -->
<property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test" /> <!-- DB 접속 URL -->
<!-- DB Dialect 설정 -->
<!-- DB 변경 시 DB 방언(Dialect)만 교체 -->
<!--
오라클 10g : org.hibernate.dialect.oracle10gdialect
MySQL : org.hibernate.dialect.mysql5innodbdialect
SQL Server : org.hibernate.dialect.sqlserver2012dialect -->
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" />
<!-- 옵션 JPA 구현체(Hibernate) 설정 -->
<property name="hibernate.show_sql" value="true" /> <!-- hibernate가 실행한 SQL을 출력 -->
<property name="hibernate.format_sql" value="true" /> <!-- hibernate가 실행한 SQL 출력 시 정렬 -->
<property name="hibernate.use_sql_comments" value="true" /> <!-- 쿼리 출력 시 주석도 함께 출력 -->
<property name="hibernate.id.new_generator_mappings" value="true" /> <!-- JPA 표준에 맞춘 새로운 키 생성 전략 사용 -->
<property name="hibernate.hbm2ddl.auto" value="create" />
</properties>
</persistence-unit>
</persistence>
src/main/resources/META-INF/persistence.xml
해당 경로로 persistence.xml를 생성하고 자신의 개발환경에 맞게 수정한다.
* web에서는 application.yml에서 설정한다.
- create : Session factory가 실행될 때에 스키마를 지우고 다시 생성. 클래스패스에 import.sql 이 존재하면 찾아서, 해당 SQL도 함께 실행함.
- create-drop : create와 같지만 session factory가 내려갈 때 스키마 삭제.
- update : 시작시, 도메인과 스키마 비교하여 필요한 컬럼 추가 등의 작업 실행. 데이터는 삭제하지 않음.
- validate : Session factory 실행시 스키마가 적합한지 검사함. 문제가 있으면 예외 발생.
public class JPAClient {
public static void main(String[] args) {
// 엔티티 매니저 팩토리 생성
EntityManagerFactory emf = Persistence.createEntityManagerFactory("SaramJPA");
// 엔티티 매니저 생성
EntityManager em = emf.createEntityManager();
// 트랜잭션 기능 획득
EntityTransaction tx = em.getTransaction();
try {
tx.begin(); //트랜잭션 시작
SaramEntity saram = new SaramEntity();
saram.setId("HONG");
saram.setName("홍길동");
saram.setAge(25);
// 등록
em.persist(saram);
// 한 건 조회
SaramEntity searchSaram = em.find(SaramEntity.class, 1L);
System.out.println("Saram 검색 => "+searchSaram.toString());
tx.commit(); //트랜잭션 커밋
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
} finally {
em.close();
}
emf.close();
}
}
// 엔티티 매니저 팩토리 생성
EntityManagerFactory emf = Persistence.createEntityManagerFactory("SaramJPA");
persistence.xml파일에 설정된 영속성 유닛 정보가 로딩될 수 있도록 Persistence.createEntityManagerFactory("SaramJPA")
의 SaramJPA와 같은 이름을 persistence.xml의 <persistence-unit name="SaramJPA">
에서 설정한 name과 같게하여 엔티티 매니저 팩토리 생성한다.
엔티티 매니저 팩토리는 애플리케이션 전체에 한 번 생성하고 공유해서 사용한다.
// 엔티티 매니저 생성
EntityManager em = emf.createEntityManager();
엔티티 매니저를 통해 CRUD 기능을 수행할 수 있다.
엔티티 메니저는 데이터베이스 커넥션과 밀접한 관계가 있어 스레드간에 공유하거나 재사용하면 안된다.
EntityTransaction tx = em.getTransaction(); //트랜잭션 기능 획득
try {
tx.begin(); //트랜잭션 시작
logic(em); //비즈니스 로직
tx.commit();//트랜잭션 커밋
} catch (Exception e) {
tx.rollback(); //트랜잭션 롤백
}
등록/수정/삭제 작업은 항상 트랜잭션 안에서 데이터를 변경해야 실제 SQL이 생성되고 처리된다. 트랜잭션을 시작하기 위해 엔티티 메니저에서 트랜잭션 API를 받아온다.
https://github.com/EunbiAn/webkit-backend/tree/master/springboot_jpa_day28