<CodeStates> Spring JPA

한주영·2023년 4월 27일
0

코드스테이츠 학습

목록 보기
19/24

JPA란?

JPA는 Java진영에서 사용하는 ORM기술의 표준사양(또는 명세)

JAVA의 인터페이스로 사양이 정의되어있기때문에 JPA라는 표준 사양을 구현한 구현체는 따로 있다는 것을 의미.

Hibrenate ORM

JPA에서 정의해둔 인터페이스를 구현한 구현체로써 JPA에서 지원하는 기능 외에
Hibernate자체적으로 사용할수있는 API를 지원하고있다
JPA는 Java Persistence API의 약자이지만 , 현재는 Jakarta Persistence라고도 불린다

데이터 액세스 계층에서의 JPA위치

데이터 저장, 조회 등의 작업은 JPA를 거쳐 구현체인 Hibrenate ORM를 통해 이루어진다. 해당 DB는 내부적으로 JDBC API를 이용해서 DB에 접근하게 된다.

JPA에서 P의 의미

영속성 컨텍스트
ORM은 객체와 데이터베이스 테이블의 매핑을 통해 엔티티 클래스 객체 안에 포함된 정보를 테이블에 저장하는 기술
JPA에서는 테이블과 매핑되는 엔티티 객체 정보를 영속성 컨텍스트 라는 곳에 보관해서 애플리케이션 내에서 오래 지속되도록 한다.


그림으로 표현된 영속성 컨텍스트

1차 캐시, 쓰기지연 SQL저장소의 영억이있다
JPA API중에서 엔티티 정보를 영속성 컨텍스트에 저장하는 API를 사용하면 1차 캐시에 엔티티 정보가 저장

영속성 컨텍스트에 엔티티를 저장하는 클래스

import lombok.Getter;

import javax.persistence.*;

@Getter
@Setter
@NoArgsConstructor
@Entity  // (1)
public class Member {
    @Id  // (2)
    @GeneratedValue  // (3)
    private Long memberId;

    private String email;

    public Member(String email) {
        this.email = email;
    }
}

@Entity 애너테이션과 @Id애너테이션을 추가해주면 JPA에서 해당클래스를 엔티티 클래스로 인식함

@GemeratedValue애너테이션은 식별자를 생성해주는 전략을 지정할때 사용
=>기본키가 되는 식별자를 자동으로 설정해준다

package com.codestates.basic;

import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;

@Configuration
public class JpaBasicConfig {
    private EntityManager em;
    private EntityTransaction tx;

    @Bean
    public CommandLineRunner testJpaBasicRunner(EntityManagerFactory emFactory) {
        this.em = emFactory.createEntityManager();
        
        // (1)
        this.tx = em.getTransaction();

        return args -> {
            example02();
        };
    }

    private void example02() {
        // (2)
        tx.begin();
        Member member = new Member("hgd@gmail.com");

        // (3)
        em.persist(member);

        // (4)
        tx.commit();

        // (5)
        Member resultMember1 = em.find(Member.class, 1L);

        System.out.println("Id: " + resultMember1.getMemberId() + ", email: " + resultMember1.getEmail());

        // (6)
        Member resultMember2 = em.find(Member.class, 2L);

        // (7)
        System.out.println(resultMember2 == null);

    }
}

위 코드는 Member 엔티티 클래스의 객체를 JPA의 영속성 컨텍스트에 저장하는 예제코드

영속석 컨텍스트는 EntityManager클래스에 의해서 관리됨
해당 객체는 EntityManagerFactory객체를 Spring으로부터 DI를 받을수있다 -> 스프링 의존

EntityManager클래스의 객체를 통해 API메서드를 사용할수있다
persist(member)메서드를 호출하면 영속성 컨텍스트에 member 객체의 정보들이 저장됨

profile
백엔드개발자가 되고싶은 코린이:)

0개의 댓글