JPA 기초) 03. 엔티티 CRUD 처리

meteorfish·2022년 11월 28일

JPA&SpringJPA기초

목록 보기
3/18

본 강의는 JPA & Spring Data JPA 기초 강의 공부용 정리입니다.


우선, EntityManagerFactory를 자주 사용해서, 별도에 클래스로 작성해준다.

-> ENF.java

public class EMF {
    private static EntityManagerFactory emf;

    public static void init() {
        emf = Persistence.createEntityManagerFactory("jpabegin");
    }

    public static EntityManager createEntityManager() {
        return emf.createEntityManager();
    }

    public static void close() {
        emf.close();
    }
}

엔티티 단위 CURD 처리

EntityManager가 제공하는 메서드

  • persist()
  • find()
  • remove()
  • merge()

저장 (persist)

-> GetUserService

public class NewUserService {

    public void saveNewUser(User user) {
        EntityManager em = EMF.createEntityManager();
        EntityTransaction tx = em.getTransaction();
        try {
            tx.begin(); // 트랜잭션 시작
            em.persist(user); // 저장
            tx.commit(); // 커밋
        } catch(Exception ex) {
            tx.rollback();
            throw ex;
        } finally {
            em.close();
        }
    }
}

저번 시간에 배웠던 내용과 다르지 않다.

조회(find)

-> GetUserService.java

public class GetUserService {
    public User getUser(String email) {
        EntityManager em = EMF.createEntityManager();
        try {
            User user = em.find(User.class, email);
            if (user == null) {
                throw new NoUserException();
            }
            return user;
        } finally {
            em.close();
        }
    }
}

find(Class entityClass, Object PrimaryKey)

  • 첫번째 파라미터 : 객체를 받아올 타입
  • 두번째 파라미터 : 식별자

[ 주의 사항 ]

  • null 여부 판단 필요.

  • 엔티티 타입, ID 타입이 맞아야 함.

수정(changeName)

-> ChangeNameService.java

public class ChangeNameService {
  public void changeName(String email, String newName) {
      EntityManager em = EMF.createEntityManager();
      EntityTransaction tx = em.getTransaction();
      try {
          tx.begin();
          User user = em.find(User.class, email);
          if (user == null) {
              throw new NoUserException();
          }
          user.changeName(newName);
          tx.commit();
      } catch(Exception ex) {
          tx.rollback();
          throw ex;
      } finally {
          em.close();
      }
  }
}
  • 트랜잭션 범위 내에서 변경된 값을 자동으로 반영해줌.

삭제(remove)

public class RemoveUserService {
  public void removeUser(String email) {
      EntityManager em = EMF.createEntityManager();
      EntityTransaction tx = em.getTransaction();
      try {
          tx.begin();
          User user = em.find(User.class, email);
          if (user == null) {
              throw new NoUserException();
          }
          em.remove(user);
          tx.commit();
      } catch(Exception ex) {
          tx.rollback();
          throw ex;
      } finally {
          em.close();
      }
  }
}

[ 주의 사항 ]

  • find()로 불러온 객체를 remove 해야 에러가 안생김!
  • 삭제 대상이 존재하지 않아도 익셉션 발생!

0개의 댓글