[JPA] JPA 애플리케이션 개발 (JPA 기본편 by 김영한)

su_y2on·2022년 1월 17일
2

JPA

목록 보기
1/17
post-thumbnail

JPA 애플리케이션 개발

JPA를 사용해서 간단한 회원 CRUD를 실습해보려고합니다

먼저 회원객체를 생성하고 DB의 테이블과 매핑하도록 하겠습니다. 아래와 같이 Member테이블 생성 쿼리를 날려 DB에 테이블을 생성한뒤

create table Member ( 
 id bigint not null,
 name varchar(255),
 primary key
 );

Member라는 java class를 생성해서 방금 만든 테이블과 매핑해줍니다. Entity라는 어노테이션을 붙여주면 JPA가 관리할 객체로 인식을 합니다. 그리고 @Id는 DB의 PK와 매핑해준다는 의미입니다. 여기서는 id를 pk로 쓰게 됩니다. 그리고 여기서 이렇게 자연스럽게 table과 매핑이 되는 이유는 기존에 DB에 만들어놓은 테이블의 이름과 필드명들이 모두 같기 때문입니다. 이와 다르게 설정하고 싶다면 따로 name이라는 옵션으로 테이블명과 필드명 모두 DB와 다르게 할 수 있습니다.(권장x)

 @Entity
 public class Member {
 @Id
 private Long id;
 private String name;
//Getter, Setter ...
}




이제 JpaMain이라는 java class를 생성해 CRUD를 실행해보겠습니다. 그전에 JPA의 구동방식을 살펴보면 아래와 같이 META-INF라는 곳 아래에 persistence.xml을 설정정보로 참고한 뒤 EntityManagerFactory를 생성하고 거기서 EntityManager를 생성해서 요청을 실행합니다.

이 구동방식을 코드로 구현한 것이 아래와 같습니다. 추가로 모든 데이터의 변경(수정,삭제,추가..)은 transaction안에서 실행되어야하기 때문에 tx.begin이후에 DB에 대한 코드를 작성해줍니다.
code부분에 DB에 대한 코드를 작성한 뒤 tx.commit부분에서 실제로 쿼리가 날라가고 DB에 적용되기 때문에 try문에서 에러가 나면 tx.rollback으로 DB에 반영하지 않을 수 있습니다. 그리고 항상 요청이 끝나면 em.close를 해줘서 entityManager를 버려줘야합니다.

public class JpaMain {
    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");

        //em은 사용하고 바로바로 버려야한다
        EntityManager em = emf.createEntityManager();
        // 모든데이터 변경은 transaction 안에서 실행해야한다
        EntityTransaction tx = em.getTransaction();
        tx.begin();
        try {
             //code
             ...
             tx.commit();
             
         }catch (Exception e){
             tx.rollback();
         } finally {
            em.close();
         }

        emf.close();
     }

}




회원 CRUD추가

tx.commit에서 insert쿼리가 날라갑니다. 그리고 이때 보여지는 쿼리는 persistence.xml에서 설정한 dialect의 종류에 맞게 날려지는 것입니다. 즉 데이터베이스의 종류(H2, Oracle, Mysql...)에 맞게 쿼리가 변환되어 날려지는 것입니다.

try{
	// 회원객체 생성 
 	   Member member = new Member();
           member.setId(2L);
           member.setName("HelloB");
          
           em.persist(member);
           tx.commit();
     }

나머지 조회, 삭제, 수정은 아래와 같습니다. JPA를 사용하면 객체를 다루듯 DB를 다룰 수 있습니다. 가장 그 특징이 잘 드러나는 곳은 수정부분입니다. 그저 ✨findMember객체의 이름만 바꿔줬을 뿐인데 변경사항을 알아서 체크하고 DB에 수정쿼리를 날려줍니다

try{
 //	    조회
            Member findMember = em.find(Member.class, 2L); //(클래스, pk)
//          삭제
            em.remove(findMember);
//          수정
            findMember.setName("HelloJPA");
            
            tx.commit();
     }

전체조회는 JPQL을 사용해야합니다 SQL이 테이블을 대상으로 날리는 쿼리라면 JPQL은 객체를 대상으로 날린다고 생각하면 됩니다. 따라서 select m.name, m.id 가 아닌 select m만으로도 조회가 가능한 것이죠 -> 매핑이 따로 필요없이 Member객체가 이쁘게 나옵니다.

try{
  // 	      전체조회 : JPQL
              List<Member> result = em.createQuery("select m from Member as m", Member.class)
                      .getResultList();
              for (Member member : result){
                  System.out.println("member.name = " + member.getName());
              }          
   }

0개의 댓글