ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JPA - 프로젝트 생성
    Web/JPA 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을 추상화해서 객체 지향 쿼리 언어를 제공한다. (엔티티 객체를 대상으로 쿼리를 날린다)

Designed by Tistory.