
출처 - 인프런 김영한님 자바 ORM 표준 JPA 프로그래밍 - 기본편
인강의 내용이 있기 때문에 출처를 밝힙니다.
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의
JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런
www.inflearn.com
코드스쿼드 프로젝트를 진행하며 JPA 를 사용하게 됐는데, 복습의 필요성을 느꼈고, 인강을 복습하며 기록하려고 한다.
설정 부분은 따로 기록하지 않아도 될 듯 .. ㅎㅎ
복습 시작 ~
실습을 위한 Main, Member Entity 및 Member Table 생성
JPA 구동을 확인할 Main 클래스와 간단한 Entity 하나를 만들어보자.
JPA 를 사용하기 위해선 EntityManagerFactory, EntityManager, EntityTransaction 이 세 가지 클래스가 필요하다.
쉽게 엔티티 공장에서 엔티티 매니저를 만들어내고 ~ 이런 식으로 생각하자.
그리고 JPA 의 모든 데이터 변경은 무조건 트랜잭션 안에서 실행되기 때문에, 트랜잭션.begion() 이후 코드를 작성하면 되고,
모든 작업이 끝나면 엔티티 매니저.close() 로 닫아줘야 한다. (쓰레드간 절대 공유하면 안되고 한번 썼으면 무조건 닫기)
마지막으로 엔티티 매니저 팩토리 또한 하나가 애플리케이션 전체에서 공유되기 때문에 애플리케이션이 내려가는 시점에 닫아줘야 한다.
1. Main 클래스
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import java.util.List;
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
/*
... 코드작성
*/
tx.commit();
em.close();
emf.close();
}
}
JPA 구동 전 Member 테이블을 만들어줘야 한다.
Spring Data JPA 쓰던 습관에 테이블을 따로 만들어주지 않았더니, 없는 테이블에 계속 INSERT 쿼리가 나가서 진땀뺐다.. 😵💫
2. Member 테이블
create table Member (
id bigint not null,
name varchar(255),
primary key (id)
)
영한님은 엔티티에 Getter, Setter 를 모두 만들어줬는데, 이건 실습을 위해 그런거고.. Setter 는 만들지 않는 편이 좋다고 생각했다.
하지만 이후 Setter 가 없으면 강의를 따라가기 힘들기 때문에 일단 추가.
3. 간단한 Member Entity
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
@Getter
@Setter
public class Member {
@Id
private Long id;
private String name;
}
실습 (CRUD)
1. 생성 em.persist()
Member 객체를 생성하고 Setter 를 통해 Id, Name 값을 셋팅하고 em.persist(member) 하면 생성이 완료된다.
persist() 는 영속성 컨텍스트에 집어넣는건데 강의 듣다가 보면 나오니까 그때 기록하기로 ㅎ.ㅎ
package hellojpa;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
public class JpaMain {
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("TestNameA");
em.persist(member);
}
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
em.close();
}
emf.close();
}
}
실행 결과
Hibernate:
/* insert hellojpa.Member
*/ insert
into
Member
(name, id)
values
(?, ?)
2. 조회 em.find()
엔티티와 조회하고 싶은 PK 값을 find() 메서드 내부 인자로 넣어주면 SELECT 문이 잘 나가는 것을 확인할 수 있다.
package hellojpa;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
Member findMember = em.find(Member.class, 1L);
System.out.println("findMember.getId() = " + findMember.getId());
System.out.println("findMember.getName() = " + findMember.getName());
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
em.close();
}
emf.close();
}
}
실행 결과
Hibernate:
select
member0_.id as id1_0_0_,
member0_.name as name2_0_0_
from
Member member0_
where
member0_.id=?
findMember.getId() = 1
findMember.getName() = TestNameA
3. 수정
먼저 find() 를 통해 엔티티 데이터를 찾아오고, Setter 를 통해 Name 을 수정해봤다.
근데 실행 결과를 보면 신기한게, SELECT 쿼리 이후 UPDATE 쿼리가 나오고 프린트가 찍히는게 아니라, SELECT 쿼리 이후 바로 새로
수정한 Name 이 나온다. 이것도 영속성 컨텍스트와 관련이 있었던 것 같은데 정확하게 기억이 안나니까 복습 열심히 하자 .......
package hellojpa;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
Member findMember = em.find(Member.class, 1L);
findMember.setName("changNameTestA");
System.out.println("findMember.getId() = " + findMember.getId());
System.out.println("findMember.getName() = " + findMember.getName());
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
em.close();
}
emf.close();
}
}
실행 결과
Hibernate:
select
member0_.id as id1_0_0_,
member0_.name as name2_0_0_
from
Member member0_
where
member0_.id=?
findMember.getId() = 1
findMember.getName() = changNameTestA
Hibernate:
/* update
hellojpa.Member */ update
Member
set
name=?
where
id=?
4. 삭제 em.remove()
역시 삭제할 데이터를 찾아온 뒤, remove() 를 통해 삭제를 진행할 수 있다.
package hellojpa;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
try {
Member findMember = em.find(Member.class, 2L);
em.remove(findMember);
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
em.close();
}
emf.close();
}
}
실행 결과
Hibernate:
select
member0_.id as id1_0_0_,
member0_.name as name2_0_0_
from
Member member0_
where
member0_.id=?
Hibernate:
/* delete hellojpa.Member */ delete
from
Member
where
id=?
'JPA' 카테고리의 다른 글
[인강 복습] JPA 기본편 다양한 연관관계 매핑 (#5) (0) | 2022.07.06 |
---|---|
[인강 복습] JPA 기본편 연관관계 매핑 기초 (#4) (0) | 2022.07.05 |
[인강 복습] JPA 기본편 요구사항 분석과 기본 매핑 까지 (#3) (0) | 2022.06.16 |
[인강 복습] JPA 기본편 영속 컨텍스트 까지 (#2) (0) | 2022.06.12 |