Web/JPA

JPA - 프로젝트 생성

now0204 2024. 1. 11. 10:47

 

> JPA를 사용하기 위해서는 hibernate-entitymanager 필요함 

> persistence.xml파일이 필요 (Spring 없이 순수 자바에서 jpa 활용) > DB연동, 엔티티 매니저 팩토리 생성시 필요 

> persistence-unit name에 매니저 팩토리 생성시 불러올 이름 지정 

> javax.persistence로 시작하는 속성은 JPA표준 속성이고, hibernate로 시작하는 속성은 하이버네이트 전용 속성이다.

* 어떤 DB접근 기술을 사용하던 커넥션풀과 데이터 소스 등록필수! 

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.2" 
 xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd"> 
 <persistence-unit name="he"> 
 <properties> 
 <!-- 필수 속성 --> 
 <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"/> 
 
 <!-- 옵션 --> 
 <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.hbm2ddl.auto" value="create" />--> 
 </properties> 
 </persistence-unit> 
</persistence>

 

-> dialetc는 DB 방언 부분임 

-> JPA는 특정 데이터 베이스에 종속적이지 않고, 어떤 DB를 사용하던 똑같이 서비스하도록 설계됨

-> 따라서 각 DB마다 문법과 함수가 다른것은 어떤 DB를 기준으로 쿼리를 작성하고 해석할 것인지 알려주는 작업이 필요하다

-> 여기서 방언이란 표준이 아닌, 특정 데이터 베이스에만 고유한 기능을 의미

 

2. JPA 작동 방식 

 

JPA 기본편 (인프런) 김영한

 

- Persistence가 xml설정정보를 통해 매니저 팩토리 생성 -> 매니저를 통해서 JPA사용 (다른 DB접근 기술들과 유사)

- 트랜잭션마다 엔티티 매니저를 꼭 생성해서 사용해야한다 보통 앤티티 매니저들은 WAS가 내려갈때 같이 없어진다.

- 조회와 같은 작업은 트랜잭션이 없어도 작동하지만, 이외의 작업은 트랜잭션 단위에서 실행해야 반영된다! 

 

3. 간단한 작동 예시 

 

@Entity
public class Member{

	@Id
    private Long id;
    private String name;
}

//..
{

		//엔티티 매니저 생성
	EntityManagerFactory emf = Persistence.createEntityManagerFactory("he");
        //매니저 얻기
        EntityManager em = emf.createEntityManager();
        //트랜잭션 얻기
        EntityTransaction tx = em.getTransaction();

        //정석대로 사용하는 방법 -> jpa 순수
        tx.begin();
        try{
            Member member = new Member();
            member.setId(2L);
            member.setName("HelloB");
            em.persist(member);
            
            //기존에 등록된 member update
             Member findmember = em.find(Member.class, 1L);
            findmember.setName("helloJPA");
            tx.commit();
        }catch (Exception e){
            tx.rollback(); //에러 발생시 롤백 
            e.printStackTrace();
        }finally {
            //작업 완료후 em반환하기 
            em.close();

        }
        //다 끝나면 닫아주기
        emf.close();

}

 

> @Entity: JPA가 관리할 객체

> @Id: 데이터베이스 PK와 매핑

> 엔티티 매니저는 쓰레드 사이에서 공유하면 안된다. -> 사용 후 close

> 업데이트는 비교적 간단. 영속성에서 관리해주는 Entity라면 그냥 변경하면 SQL 혹은 Commit시점에 변경감지를 통해 적용

> JPA의 장점은 객체간 그래프 탐색(a.get().get())이 가능하다는 점이다! -> DB를 객체지향스럽게 사용할 수 있다.

 

4. JPQL

 

 > JPA는 검색시에도 테이블이 아닌 엔티티 객체를 대상으로 섬색 

 > 모든 데이터를 객체로 변환해서 검색하는 것은 불가능하다! 따라서 SQL도 당연히 필요하다.

 > JPQL은 SQL을 추상화해서 객체 지향 쿼리 언어를 제공한다. (엔티티 객체를 대상으로 쿼리를 날린다)