[JPA] JPA 애플리케이션 개발 (JPA 기본편 by 김영한)

kimdoha·2023년 8월 22일
1

[JPA]

목록 보기
2/8
post-thumbnail

해당 프로젝트는 JAVA 17, Gradle 환경에서 실습하였습니다.

JPA 기본 설정

JPA H2 데이터베이스 설정 파일을 작성합니다.

  • application.properties
// setting h2
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console

// setting h2 db
spring.datasource.url=jdbc:h2:tcp://localhost/~/test
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect

// show sql
spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.format_sql=true

// ddl auto
spring.jpa.hibernate.ddl-auto=create

JPA 구동 방식

JPA-구동방식

  • 먼저 application.properties 파일을 조회해서 설정에 맞게 DB를 구성합니다.
  • DB에 접근할 때 매번 커넥션을 생성해주는 EntityManagerFactory를 생성합니다. 이는 각 DB당 하나만 생성해서 Application 전체에서 공유해야 합니다.
  • 각 커넥션(액세스) 때마다 EntityManager가 생성되어 트랜잭션을 처리한 후 소멸됩니다. 이는 쓰레드 간에 공유하면 안되며 각각의 커넥션마다 생성하고 다 사용했다면 버려야 합니다.

mini - 회원 CRUD

PersistenceUnit vs PersistenceContext

  • PersistenceUnit - EntityManagerFactory 주입 시 사용
  • PersistenceContext - EntityManager 주입 시 사용

EntityManager 라이프 사이클을 수동으로 관리할 필요가 없는 경우, PersistenceContext 사용 권장

@RequestMapping("/member")
@RestController
public class MemberController {

  private EntityManagerFactory emf;

  @PersistenceUnit
  public void setEntityManagerFactory(EntityManagerFactory emf) {
    this.emf = emf;
  }

  @GetMapping()
  public Member memberCrud() {
  	// 각 엑세스마다 생성된다.
    EntityManager em = emf.createEntityManager();
    // JPA 의 모든 데이터 변경은 트랜잭션 안에서 이루어진다.
    EntityTransaction tx = em.getTransaction();
    tx.begin();

    try {
    

      Member newMember = Member.of("kimdoha");
      em.persist(newMember);

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

      Member updateMember = em.find(Member.class, 1L);
      updateMember.update("kimdoha2");
      em.persist(updateMember);

      Member deleteMember = em.find(Member.class, 1L);
      em.remove(deleteMember);
      
	  // SQL을 모아서 한번에 보낸다.
      tx.commit();

    } catch (Exception e) {
      tx.rollback();
      
    } finally {
      em.close();
      emf.close();
    }

    return null;
  }
}

https://github.com/kimdoha/spring-playground/tree/feat/1.create-jpa-application/JPA-Study

0개의 댓글

관련 채용 정보