JPA 설정과 애플리케이션 개발 시작

Shinny·2022년 5월 27일
0

JPA 프로그래밍

목록 보기
3/4

어떻게 JPA는 DB 정보를 인식할까?

JPA는 persistence.xml 을 사용해서 필요한 설정 정보를 관리한다. 이 설정 파일은 반드시 META-INF/persistence.xml 경로에 있어야 한다.

property 즉 속성부분에 적어줘야 하는 것은 필수 값과 옵션이 있다.

필수값

  • JPA 표준 속성
    • javax.persistence.jdbc.driver

    • javax.persistence.jdbc.user

    • javax.persistence.jdbc.driver.password

    • javax.persistence.jdbc.driver.url

      이렇게 javax.persistence 로 시작하는 것은 JPA 표준 속성이다. 구현체에 영향을 받지 않는다.

  • 하이버네이트 속성
    • hibernate.dialect

      이것은 하이버네이트에서만 사용할 수 있는 하이버네이트 전용 속성이다. 앞선 글에서 말했던 것처럼 JPA는 특정 데이터베이스 기술에 종속되지 않는다. 그래서 데이터 베이스 교체가 굉장히 단순하다. 그리고 그 방법은 바로 이 방언 설정으로 손쉽게 교체 가능하다.

      <property name=”hibernate.dialect” value = “org.hibernate.dialect.H2Dialect” />

      위 처럼 설정하면 H2 데이터베이스를 쓰겠다는 뜻이고 MySQL은 H2Dialect 부분을 MySQL5InnoDBDialect로 변경해주면 된다.

옵션

  • hibernate.show_sql : 하이버네이트가 실행한 SQL 출력
  • hibernate.format_sql : SQL 출력시 보기좋게 정렬
  • hibernate.use_sql_comments : 주석도 함께 출력

개발 시작 전, EntityManagerFactory와 EntityManager 이해하기

엔티티 매니저 팩토리

앞선 persistence.xml 파일에서 으로 설정을 해두었다. 이 jpabook 이라는 것은 persistence unit의 이름이므로 원하는 것으로 등록하면 된다. 책에서는 jpabook이라고 되어 있어 따라해보았다.

그래서 이 이름으로 우선 엔티티 매니저 팩토리를 생성할 수 있다. 그리고 그 엔티티 매니저 팩토리를 통해서 엔티티 매니저를 생성할 수 있다.

엔티티 매니저 팩토리 생성

EntityManagerFactory emf = Persistence.createEntityManagerFactory(”jpabook”);

(중요) 엔티티 매니저 팩토리 생성은 비용이 크기 때문에 애플리케이션 전체에 한번 생성하고 공유해서 사용한다.

엔티티 매니저 생성

EntityManager em = emf.createEntityManager();

엔티티 매니저를 사용해서 엔티티를 데이터 베이스에 등록/수정/삭제/조회할 수 있다. 대부분의 JPA 기능은 이 엔티티 매니저를 통해 이루어지는데, 데이터베이스 커넥션과 밀접한 관계가 있기 때문에, 스레드 간에 공유하거나 재사용해서는 안 된다.

그래서 크게 보면 전체 순서는 이렇게 된다.

  1. 엔티티 매니저 팩토리 생성
  2. 엔티티 매니저 생성
  3. 트랜잭션 시작
  4. 비즈니스 로직 실행
  5. 트랜잭션 커밋 or 실패 시 롤백
  6. 엔티티 매니저 종료
  7. 엔티티 매니저 팩토리 종료

JPA로만 개발하기 가능할까?

대답은 No이다. JPA보다 SQL을 직접 작성하거나 혹은 JPQL을 쓰는 것이 더 낫거나 혹은 유일한 방법일 때도 있다.

예를 들어 데이터를 검색할 때, 애플리케이션이 필요한 데이터만 데이터베이스에서 불러오려면 검색 조건이 포함된 SQL을 사용해야 한다. 그래서 JPA는 객체 지향 쿼리 언어인 JPQL을 제공한다. JPQL은 테이블이 어떻게 생긴지 모르고, 엔티티 객체를 대상으로 쿼리를 한다.

JPQL을 사용하는 코드는 아래와 같다.

em.createQuery(JPQL, 리턴 타입).getResultList();

profile
비즈니스 성장을 함께 고민하는 개발자가 되고 싶습니다.

0개의 댓글