[JPA] persistence.xml 세팅과 엔티티 매니저

김정연·2024년 4월 10일

자바orm표준JPA

목록 보기
1/2
post-thumbnail

JPA 세팅부터 다시 공부 하고 있다. (김영한의 JPA)

JPA는 persistence.xml에서 설정정보를 관리한다. 폴더 경로는 resources/META-INF/persistence.xml을 생성하면 된다.

<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.1">

JPA 2.1 버전을 사용한다는 뜻이다. 내가 원하는 버전에 맞춰 세팅하면 된다.

<persistence-unit name="jpa">

프로젝트의 영속성 유닛을 등록한다.

<property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>

            <property name="javax.persistence.jdbc.user" value="sa"/>
            <property name="javax.persistence.jdbc.password" value=""/>
            <property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" />

JDBC 드라이버를 쓰기 위한 세팅이다. 아이디 비밀번호 url 등을 명시적으로 알려준다.

   <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.format_sql" value="true" />
            <property name="hibernate.use_sql_comments" value="true" />
            <property name="hibernate.id.new_generator_mappings" value="true" />

하이버네이트는 데이터베이스에 연결하기 위한 설정이다.가장 중요한 부분은
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" />
부분인데 데이터 베이스의 고유한 기능을 사용하기 위해 세팅한다.

데이터베이스 방언

JPA는 데이터베이스 종류를 가리지 않는다. 하지만 데이터베스마다 문법이 살짝 다른데 하이버네이트가 이런 JPA 구현체의 문제를 해결해준다. 그래서 dialect 부분에 어떤 데이터베이스를 쓸 지 명시해주면 된다!

  • show_sql : 실행할 SQL 출력
  • format_sql : SQL을 출력할 때 보기 좋게 정렬
  • sql_comments : 쿼리를 출력할 때 주석도 함께 출력

엔티티 매니저 팩토리

엔티티 매니저는 영속 컨텍스트에 접근하여 엔티티에 대한 DB작업이 가능하도록 한다. 예를 들어 find, persist등이 매니저의 메서드이다.

Persistence 에서 설정 정보 조회 > EntityManagerFactory 생성 > EntityManager 생성 (여러개)

즉 persistence에서 엔티티매니저 팩토리를 생성하고 JPA를 사용할 수 있게 준비해준다.

EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpa");

엔티티매니저 팩토리는 애플리케이션 전체에서 딱 한번만 생성하고 공유한다.

엔티티 매니저

팩토리에서는 엔티티 매니저를 생성하는데 JPA의 기능 대부분이 포함되어 있다. 엔티티 매니저를 사용해서 엔티티를 데이터베이스에 등록/수정/삭제/조회가 가능해진다. 엔티티 매니저를 가상의 데이터베이스라고 생각해도 된다.

사용을 다하면 자원을 반드시 되돌려줘야한다. > close();

등록/수정/삭제/조회

		// 등록
		em.persist(member);
        // 수정
        member.setAge(27);
        // 1개 조회
        Member findMember = em.find(Member.class, id);

수정의 경우 업데이트는 따로 없고 setAge를 통해 간단하게 수정을 할 수 있다. 실제 콘솔창을 보면 Update 쿼리가 실행되어 있다.

JPQL

우리는 엔티티 객체를 조회할 때 테이블이 아닌 객체를 대상으로 검색해야 한다. 그래서 검색 조건이 포함된 SQL을 사용하는데 이 때 JPA에서는 JPQL이라는 것을 사용한다. 문법은 SQL과 비슷해서 join , select, where, group by 등을 사용할 수 있다.

  • JPQL은 엔티티 객체를 대상으로 쿼리한다.
  • SQL은 데이터베이스 테이블을 대상으로 쿼리한다.

List members = em.createQuery("select m from Member m", Member.class).getResultList();

여기서 m 은 회원 엔티티 객체이고, 테이블이 아니다.
즉 em.createQuery(JPQL, 반환타입) 을 실행해서 쿼리 객체를 만들고 객체의 getResultList를 호출한 것이다.

profile
백엔드 개발자

0개의 댓글