JPA

JPA 와 JPA 시작하기

스파이더웹 2022. 8. 26. 16:08
728x90
반응형

JPA란

- Java Persistence API의 약자

- 자바 ORM 기술 표준

 

ORM 이란

- Object - relational mapping(객체 관계 매핑)

- 객체와 관계형데이터베이스의 간극을 ORM 프레임워크가 중간에서 매핑을 통해  객체와 관계형 데이터베이스의 패러다임 불일치 문제를 해결

 

JPA의 성능 최적화 기능

1. 1차 캐시와 동일성 보장

2. 트랜잭션을 지원하는 쓰기 지연

3. 지연 로딩

 

1차캐시와 동일성 보장

- 같은 트랜잭션 안에서는 같은 엔티티를 반환 

String memberId= 1;

Member m1 = jpa.find(Member.class, memberId); //SQL 조회

Member m2 = jpa.find(Member.class, memberId); //캐시 조회

 

그러므로 SQL은 1번만 실행되어, 1차에 조회한 엔티티를 2차에도 반환하여 동일성을 보장한다

 

 트랜잭션을 지원하는 쓰기 지연

- 트랜잭션을 커밋할 때까지 INSERT SQL을 모음

 

지연 로딩

- 객체가 실제 사용될 때 로딩

 

JPA 시작하기

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 {
            em.persist();
            tx.commit();
        }catch (Exception e){
            tx.rollback();
        }finally {
            em.close();
        }
        emf.close();

    }
}

persistence.xml에서 지정된 name의 값을 가져와 EntityManagerFactory와 EntityManager를 생성해준다

엔티티 매니저 팩토리는 하나만 생성하여 애플리케이션 전체에서 공유하고 엔티티 매니저는 쓰레드간 공유하지 않는다

 

JPA의 모든 데이터는 트랜잭션안에서 변경이 이루어지므로 tx.begin() 트랜잭션을 실행해주고, 정상처리되면 commit, 비정상적으로 종료되는 경우 rollback 처리를 해준다.

 

JPA를 알아보기위해 간단한 예제로 Member 객체를 생성해주었다

@Entity는 JPA가 관리할 객체를 지정해주고, @ID는 기본키를 지정해준것이다 

그러면 여기서 의아한게 객체를 만들고 DB도 만들었는데, 서로 어떻게 연결시켜준다는 거지? 인데 그것은 JPA가 자동으로 클래스의 명칭과 테이블의 명칭을 매핑시키고, 컬럼과 필드를 매핑 시켜준다(혹시 테이블 이름과 클래스가 다른경우 클래스 선언부 위에 @Table 어노테이션을 사용하여 매핑시켜주고, 필드와 컬럼이 다를경우는 필드명 위의 @Column 어노테이션을 사용하여 일치시켜주면된다  ex. DB Table : Member, 클래스명 : User 인 경우, 클래스 선언부 위에 @Table(name = "Member") 해주면 된다)

@Setter
@Getter
@Entity
public class Member {

    @Id
    private Long id;
    private String name;


}

 

이제 매핑은되었고, 실행했을 때 DB의 테이블이 데이터가 insert되는지 확인해보자

		//..기존 동일 코드

	try {
       	    Member member = new Member();

            member.setId(1L);
            member.setName("HelloA");

            em.persist(member);
            tx.commit();
        }catch (Exception e){
            tx.rollback();

 

콘솔 창
H2 Select 쿼리 실행

정상적으로 콘솔창에 DB의 Insert 쿼리가 실행되었으며, DB에서 데이터 조회시 정상적으로 값이 들언간것을 확인할 수 있다.

 

그러면 조회는 어떨까? 조회의 경우는 em.find(클래스타입, 기본키값); 을 통해 조회할 수 있다.

try {

            Member findMember = em.find(Member.class, 1L);
            System.out.println("findMember.getId() = " + findMember.getId());
            System.out.println("findMember.getName() = " + findMember.getName());

            tx.commit();

쿼리가 실행되면서 정상적으로 기대값이 출력되는것을 확인할 수 있다.

 

삭제의 경우는 em.remove( ); 를 실행해주면 된다.

 

변경은 특이하게도 em.persist( ); 를 호출하지 않고, 값만 바꾸어도 변경이 가능하다

 try {
            Member member = new Member();

            Member findMember = em.find(Member.class, 1L);
            findMember.setName("HelloJPA");

            tx.commit();

값만 바꾸어 주었는데, DB의 값또한 변경되었다 그이유는 무엇일까? 

이유는 JPA를 통해 Entity 호출시 jpa가 트랜잭션 commit 시점의 변경된 내용을 확인하여 변경이 이루어졌으면 Update 쿼리를 실행한다 

 

 

공부 - 김영한님 jpa

https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런

www.inflearn.com

 

728x90
반응형