
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 부분에 어떤 데이터베이스를 쓸 지 명시해주면 된다!
엔티티 매니저는 영속 컨텍스트에 접근하여 엔티티에 대한 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 쿼리가 실행되어 있다.
우리는 엔티티 객체를 조회할 때 테이블이 아닌 객체를 대상으로 검색해야 한다. 그래서 검색 조건이 포함된 SQL을 사용하는데 이 때 JPA에서는 JPQL이라는 것을 사용한다. 문법은 SQL과 비슷해서 join , select, where, group by 등을 사용할 수 있다.
List members = em.createQuery("select m from Member m", Member.class).getResultList();
여기서 m 은 회원 엔티티 객체이고, 테이블이 아니다.
즉 em.createQuery(JPQL, 반환타입) 을 실행해서 쿼리 객체를 만들고 객체의 getResultList를 호출한 것이다.