2023. 9. 12. 15:27ㆍLecture/JPA
이 글은 김영한 선생님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 2-2강을 듣고 정리한 글입니다.
MEMBER TABLE 생성
id 컬럼과 name 컬럼을 생성해주고 id는 primary key(pk)로 지정한다.
MemberVO 생성
package hellojpa.VO;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "MEMBER")
public class Member {
@Id
private Long Id;
@Column(name = "name")
private String name;
public Long getId() {
return Id;
}
public void setId(Long id) {
Id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@Entity - 테이블과 매핑할 클래스에 사용하여 JPA가 해당 클래스를 관리하게한다.
@Table - 테이블명과 객체명이 서로 다른 경우 테이블 이름을 지정해 매핑할 수 있다.
@Column - 컬럼명과 필드명이 서로 다른 경우 컬럼명을 지정해 매핑할 수 있다.
@Id - 테이블의 기본키가 지정된 컬럼과 매핑된 필드에 사용한다.
JPA 기본 문법
1. 데이터 Insert
package hellojpa;
import hellojpa.VO.Member;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
public class Main {
public static void main(String[] args) {
// 서비스에 단 한번
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
Member member = new Member();
member.setId(1L);
member.setName("HelloA");
em.persist(member);
tx.commit();
}catch (Exception e){
tx.rollback();
} finally {
em.close();
}
emf.close();
System.out.println("Hello world!");
}
}
EntityManagerFactory는 절대 공유해선 안되고 상황에 따라 만들어야한다. - 동시에 접근이 가능하게하면 하나를 수정하고 있을 때 다른 사용자도 수정할 수 있기 때문. 사용이 끝나면 close()로 만납해야한다.
EntityManager는 Entity를 관리하는 역할이다. 엔티티 매니저 내부에 영속성 컨텍스트를 만들어서 관리한다. 사용이 끝나면 close()로 반납해야한다.
EntityTransaction은 하나의 트랜잭션을 생성한다. tx.begin()을 통해 트랜잭션 시작을 알리고 로직을 수행 후 commit 또는 rollback을 해주어야한다.
2.데이터 Update
package hellojpa;
import hellojpa.VO.Member;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
public class Main {
public static void main(String[] args) {
// 서비스에 단 한번
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
Member member = em.find(Member.class, 1L);
member.setName("HelloB");
tx.commit();
}catch (Exception e){
tx.rollback();
} finally {
em.close();
}
emf.close();
}
}
다른 점은 위에서 설명한 것과 같고 try-catch-finally 구문을 구면 em.find로 해당 객체를 조회한 후 객체의 필드를 변경하고 commit하면 update 구문이 실행된다.
3. 데이터 Delete
package hellojpa;
import hellojpa.VO.Member;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
public class Main {
public static void main(String[] args) {
// 서비스에 단 한번
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
Member member = em.find(Member.class, 1L);
em.remove(member);
}catch (Exception e){
tx.rollback();
} finally {
em.close();
}
emf.close();
}
}
em.find로 해당 데이터를 조회 한 후 em.remove()를 실행하면 데이터가 삭제된다.
JPQL
- JPA를 사용하면 엔티티 객체를 중심으로 개발
- 문제는 검색 쿼리
- 검색을 할 때도 테이블이 아닌 엔티티 객체를 대상으로 검색
- 모든 DB 데이터를 객체로 변환해서 검색하는 것은 불가능
- 애플리케이션이 필요한 데이터만 DB에서 불러오려면 결국 검색 조건이 포함된 SQL이 필요
package hellojpa;
import hellojpa.VO.Member;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import java.util.List;
public class Main {
public static void main(String[] args) {
// 서비스에 단 한번
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
List<Member> result = em.createQuery("select m from Member as m where name = 'HelloB'", Member.class)
.getResultList();
System.out.println(result.get(0).getName());
tx.commit();
}catch (Exception e){
tx.rollback();
} finally {
em.close();
}
emf.close();
}
}
'Lecture > JPA' 카테고리의 다른 글
JPA(7) - 영속성 컨텍스트2 (0) | 2023.09.13 |
---|---|
JPA(6) - 영속성 컨텍스트 (0) | 2023.09.12 |
JPA(4) (0) | 2023.09.12 |
JPA(3) (0) | 2023.09.11 |
JPA(2) (0) | 2023.09.08 |