JPA는 ORM 기술의 표준 사양을 정의한 것이다.
이때, ORM(Object-Relational Mapping) 이란❓
자바 객체와 관계형 DB 간의 매핑 처리를 위한 API이다.
@Entity // DB 테이블과 매핑 대상
@Table(name = "user") // user 테이블과 매핑
public class User {
@Id // 식별자에 대응, 주로 PK와 매핑하는 칼럼, 필드명과 동일한 테이블 칼럼과 매핑
private String email;
private String name;
@Column(name = "create_date") // 필드명과 칼럼명이 다른 경우 @Column 사용
private LocalDateTime createDate;
transaction.begin();
User user = new User("user@user.com", "user", LocalDateTime.now());
entityManager.persist(user);
transaction.commit(); //
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabegin");EntityManager em = emf.createEntityManager();EntityTransaction transaction = entityManager.getTransaction(); // 트랜잭션 생성
try{
transaction.begin(); // 트랜잭션 시작
User user = new User(...);
entityManager.persist(user);
transaction.commit(); // 트랜잭션 커밋
} catch (Exception ex) {
ex.printStackTrace();
transaction.rollback(); // 예외 발생 시 트랜잭션 롤백
}
String id = "myid";
Member member = new Member();
member.setId(id);member.setAge(20);em.remove(member);Member member = em.find(entity 클래스 타입, PK 값)import jakarta.persistence.*;
import jpabasic.reserve.domain.User;
import java.time.LocalDateTime;
public class UserSaveMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabegin");
EntityManager entityManager = emf.createEntityManager();
EntityTransaction transaction = entityManager.getTransaction(); // 트랜잭션 생성
try{
transaction.begin(); // 트랜잭션 시작
User user = new User("user@user.com", "user", LocalDateTime.now());
entityManager.persist(user); // persist 호출시 entity로 매핑한 객체를 db에 저장
transaction.commit();
} catch (Exception ex) {
ex.printStackTrace();
transaction.rollback();
} finally {
entityManager.close(); // entityManager 닫기 -> 사용한 리소스 반환
}
emf.close(); // entityManagerFactory를 닫기 -> 사용한 리소스 반환
}
}
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabegin");
EntityManager entityManager = emf.createEntityManager();
EntityTransaction transaction = entityManager.getTransaction();
try{
transaction.begin();
User user = entityManager.find(User.class, "user@user.com"); // find(매핑 클래스 타입 지정, PK(app id로 매핑된 칼럼 값) 전달)
if (user == null) {
System.out.println("User 없음");
} else{
System.out.pringf("User 있음: email=%s, createDate=%s\n", user.getEmail(), user.getName(), user.getCreateDate());
}
transaction.commit();
} catch (Exception ex) {
ex.printStackTrace();
transaciton.rollback();
} finally {
entityManager.close();
}
emf.close();
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabegin");
EntityManager entityManager = emf.createEntityManager();
EntityTransaction transaction = entityManager.getTransaction();
try{
transaction.begin();
User user = entityManager.find(User.class, "user@user.com"); // find 메서드를 사용하여 바꿀 대상을 조회
if (user == null) {
System.out.println("User 없음");
} else{
String newName = "이름" + (System.currentTimeMillis() % 100);
user.changeName(newName); // 조회한 객체의 필드를 변경
}
transaction.commit();
} catch (Exception ex) {
ex.printStackTrace();
transaciton.rollback();
} finally {
entityManager.close();
}
emf.close();
✔️ 업데이트를 위한 별도의 EntityManager를 호출할 필요가 없고 트랜잭션 범위 내에서 조회한 객체의 형태만 변경하면 된다.
JPA 개념
기본 구조