본문 바로가기

SPRING/JPA

[ JPA | 강의 따라 공부하기 ] 3. CRUD 기능 사용법 소개 및 TypedQuery맛보기

3.1. 데이터 추가하기

데이터를 추가하는 일반적인 진행 단계

  1. EntityManager를 생성한다.(by EntityManagerFactory) - 트랜젝션을 가지고 있다.
  2. EntityTransaction을 시작한다.(by EntutyManager)
  3. 저장하고자 하는 Entity를 생성한다. - 먼저 만들어도 된다.
  4. EntityManager.persist()메소드를 통해 영속성 컨텍스트에 Entity객체를 저장한다. - 변경감지를 통해 데이터베이스에 저장하여 사전준비를 한다.
  5. EntrityTransaction.commit()메소드를 통해 DB에 실제 반영한다.

Exception.3~5단계에서 예외가 발생할 경우transaction.rollback()

   6. EntityManager.close()종료

 

3.2. 데이터 조회하기

데이터를 조회하는 일반적인 진행 단계에서는 단일 조회의 경우 트랜잭션이 필요하지 않다.

  1. EntityManager를 생성한다.(by EntityManagerFactory)
  2. EntityManager.find()메소드를 통해 Entity를 DB에서 조회한다.
  3. EntityManager.close()종료
  4. 조회성공 조회된 값이 없다면 Null

따라서 널체크가 필요하다.

 

3.3. 데이터 변경하기

  1. EntityManager를 생성한다.(by EntityManagerFactory)
  2. EntityTransaction을 시작한다.(by EntutyManager)
  3. 변경하고자 하는 Entity를 조회한다.
  4. 조회된 Entity 객체에서 값을 변경한다. - 필요한 set메서드를 조합한다.
  5. EntityTransaction.commit()메소드를 통해 DB에 실제 반영한다.(Dirty Check)

Exception.3~5단계에서 예외가 발생할 경우transaction.rollback()

   6. EntityManager.close()종료

 

영속성컨텍스트는 변경감지를 한다.

 

3.4. 데이터 삭제하기

  1. EntityManager를 생성한다.(by EntityManagerFactory)
  2. EntityTransaction을 시작한다.(by EntutyManager)
  3. 삭제하고자 하는 Entity를 조회한다.
  4. EntityManager.remove()메소드를 통해 영속성 컨텍스트에서 영속 객체를 삭제한다..
  5. EntityTransaction.commit()메소드를 통해 변경 감지 및 DB에 실제 반영한다 (Dirty Check)

Exception.3~5단계에서 예외가 발생할 경우transaction.rollback()

    6. EntityManager.close()종료

 

3.5. TypedQuery

TypedQuery는 작성한 JPQL쿼리를 실행시키기 위한 객체이다.(JPQL은 엔티티 객체를 조회하는 객체 지향 쿼리언어를 의미한다.)

쿼리의 반환 타입이 명확하면 TyqedQuery를 사용하고 명확하지 않다면 Query를 사용한다.

TypedQuery<UserEntity> query = entityManager.createQuery("select u from UserEntity u", UserEntity.class)
//<>엔티티객체의 반환타입, 쿼리문은 SQL문과 비슷 엔티티객체타입으로 지정 AS는 사용하지 않아도 된다. 

List<UserEntity> userEntities = query.getResultList();
// 리스트로 결과값 리턴
package studio.aroundhub.simple_example.service.impl;

import java.util.List;
import java.util.Optional;
import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;
import studio.aroundhub.simple_example.common.exceptions.DuplicateException;
import studio.aroundhub.simple_example.common.exceptions.NotFoundException;
import studio.aroundhub.simple_example.entity.UserEntity;
import studio.aroundhub.simple_example.factory.CEntityManagerFactory;
import studio.aroundhub.simple_example.service.UserService;

public class UserServiceImpl implements UserService {

    @Override
    public void saveUser(UserEntity userEntity) {
        EntityManager entityManager = CEntityManagerFactory.createEntityManger();
        // EntityTransaction 으로 객체를 생성해서 트랜잭션 관리를 해도 되지만 EntityManager 만으로도 사용할 수 있음
        entityManager.getTransaction().begin();

        try {
            UserEntity foundUser = entityManager.find(UserEntity.class, userEntity.getEmail());
            // User 데이터를 추가하기 전에 같은 값이 있는지 체크
            if (foundUser != null) {
                // 기존에 동일한 데이터가 있다면 예외 호출
                throw new DuplicateException();
            }
            entityManager.persist(userEntity);  
							// Persistence Context에 객체 추가

            entityManager.getTransaction().commit();// 실제 DB 적용
        } catch (Exception e) {
            entityManager.getTransaction().rollback();
            e.printStackTrace();

        } finally {
            entityManager.close();
        }
    }

    @Override
    public Optional<UserEntity> getUser(String email) {
        EntityManager entityManager = CEntityManagerFactory.createEntityManger();
        // 조회만 할 경우 트랜잭션은 필요하지 않음
        UserEntity userEntity = entityManager.find(UserEntity.class, email);
        //if() 객체에 값이 들어왔는지 확인해 볼수도 있다. 
        entityManager.close();
        return Optional.ofNullable(userEntity);
    }

    @Override
    public void updateUserName(String email, String newName) {
        EntityManager entityManager = CEntityManagerFactory.createEntityManger();

        entityManager.getTransaction().begin();
        try {
            UserEntity userEntity = entityManager.find(UserEntity.class, email);
            if (userEntity == null) {
                throw new NotFoundException();
            }
            userEntity.changeName(newName); // 이름 수정
            entityManager.getTransaction().commit(); // 업데이트쿼리진행
        } catch (Exception e) {
            e.printStackTrace();
            entityManager.getTransaction().rollback();
        } finally {
            entityManager.close();
        }
    }

    @Override
    public List<UserEntity> getUserList() {
        EntityManager entityManager = CEntityManagerFactory.createEntityManger();
        try {
            //entityManager.getTransaction().begin();
						//조회작업에는 필요없음
            TypedQuery<UserEntity> query = entityManager.createQuery(
                "select u from UserEntity u", UserEntity.class);
            List<UserEntity> userEntities = query.getResultList();
            /*
            아래 코드로 대체 가능
            Query query = entityManager.createQuery("select u from UserEntity u");
            List userEntities = query.getResultList();
             */
            //entityManager.getTransaction().commit();
            return userEntities;
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            entityManager.close();
        }
        return null;
    }

    @Override
    public void deleteUser(String email) {
        EntityManager entityManager = CEntityManagerFactory.createEntityManger();
        entityManager.getTransaction().begin();
        try{
            UserEntity userEntity = entityManager.find(UserEntity.class, email);
            if(userEntity==null){
                throw new NotFoundException();
            }
            entityManager.remove(userEntity);
            entityManager.getTransaction().commit(); //삭제 쿼리 진행
        }catch (Exception e){
            e.printStackTrace();
            entityManager.getTransaction().rollback();
        }finally {
            entityManager.close();
        }

    }
}

 

 

*학습 자료 출처 : 어라운드 허브 스튜디오