hanker

Spring - JPA EntityManager 완벽 정복 본문

SPRING

Spring - JPA EntityManager 완벽 정복

hanker 2024. 10. 23. 08:31
반응형

EntityManager는 데이터베이스와 애플리케이션 사이에서 데이터를 관리하는 도구이다.
즉, 프로그램에서 사용하는 객체(엔티티)를 데이터베이스에 저장하거나, 데이터베이스에서 불러오고, 수정하거나 삭제하는 일을 담당한다.

  • 생명주기 관리: 프로그램에서 객체가 생성되거나 사라질 때, 그 상태를 추적하고 적절한 시점에 데이터베이스에 저장하거나 삭제하는 일을 함.
  • 데이터베이스와 상호작용: 객체를 데이터베이스에 저장할 때, EntityManager가 그 중간에서 데이터를 저장, 수정, 삭제, 조회하는 작업을 대신 처리해줌.

즉, 개발자가 일일이 SQL 문을 작성하지 않고, EntityManager가 알아서 데이터베이스와 소통하도록 도와주는 중간 관리자 역할을 하게 된다.
 
 

주요 기능

  • 영속성 컨텍스트* 관리: 엔티티의 상태를 추적하고 관리
  • CRUD** 연산: 엔티티의 생성, 조회, 수정, 삭제 작업을 수행
  • 쿼리 실행: JPQL(Java Persistence Query Language) 또는 네이티브 SQL 쿼리를 실행
  • 트랜잭션 관리: 데이터베이스 트랜잭션과 연계하여 작업

 

주요 메서드

메서드명 기능
persist() 새로운 엔티티를 영속성 컨텍스트에 추가 (insert)
find() 주어진 ID로 엔티티를 데이터베이스에서 조회 (select)
merge() 분리된 상태의 엔티티를 영속성 컨텍스트에 병합 (update)
remove() 엔티티를 영속성 컨텍스트와 데이터베이스에서 삭제 (delete)
createQuery() JPQL(Java Persistence Query Language) 쿼리를 생성하고 실행
createNativeQuery() 네이티브 SQL 쿼리를 실행
flush() 영속성 컨텍스트의 변경사항을 데이터베이스에 동기화 (즉시 반영)
refresh() 엔티티의 상태를 데이터베이스의 최신 상태로 새로고침
detach() 엔티티를 영속성 컨텍스트에서 분리
contains() 주어진 엔티티가 현재 영속성 컨텍스트에서 관리되고 있는지 확인

 

메서드 예제
 

- persist()

private final EntityManager em;

/**
 * persist(): 새 엔티티를 영속성 컨텍스트에 추가
 * @param id hanker
 * @param pw 1234
 * @param name Han-ker
 */
public void createUser(String id, String pw, String name) {
    User user = new User();
    user.setUserId(id);
    user.setPassword(pw);
    user.setUserName(name);
    em.persist(user);
}

 
결과 (insert)

 

반응형


 
- find()

private final EntityManager em;

/**
 * find(): 주어진 ID로 엔티티 조회
 * @param id : 14L
 * @return User
 */
public User getUser(Long id) {
    return em.find(User.class, id);
}

결과 (select)

 
 
- merge()

private final EntityManager em;

/**
 * merge(): 분리된 엔티티를 영속성 컨텍스트에 병합
 * getUserSn : 14L
 * getUserId : hanker-T
 * getPassword : 4321
 * getUserName : Han-ker-T
 * @param user
 */
public void updateUser(User user) {
    em.merge(user);
}

결과 (update)

 
 
- remove()

private final EntityManager em;

/**
 * remove(): 엔티티 삭제
 * @param id : 14L
 */
public void deleteUser(Long id) {
    User user = em.find(User.class, id);
    if (user != null) {
        em.remove(user);
    }
}

 
결과 (delete) 삭제 후 다시 생성시킴

 
 
- createQuery()

private final EntityManager em;

/**
 * createQuery(): JPQL 쿼리 생성 및 실행
 * @param name : Han-ker
 * @return
 */
public List<User> findUsersByUserName(String name) {
    return em.createQuery("SELECT u FROM User u WHERE u.userName = :name", User.class)
            .setParameter("name", name)
            .getResultList();
}

 
결과

 
 
- createNativeQuery()

/**
 * createNativeQuery(): 네이티브 SQL 쿼리 실행
 * @param name : Han-ker
 * @return
 */
public List<User> findUsersNative(String name) {
    return em.createNativeQuery("SELECT * FROM user WHERE user_name = ?", User.class)
            .setParameter(1, name)
            .getResultList();
}

결과

 
 
- flush()

private final EntityManager em;

/**
 * flush() : 변경사항을 데이터베이스에 동기화
 */
public void flushChanges() {
    em.flush();
}

 
 
- refresh()

private final EntityManager em;

/**
 * refresh() : 엔티티를 데이터베이스 상태로 새로고침
 * @param user
 */
public void refreshUser(User user) {
    em.refresh(user);
}

 
 
- detach()

/**
 * detach(): 엔티티를 영속성 컨텍스트에서 분리
 * @param user
 */
public void detachUser(User user) {
    em.detach(user);
}

 
 
- contains()

/**
 * contains(): 엔티티가 영속성 컨텍스트에 있는지 확인
 * @param user
 * @return
 */
public boolean isManaged(User user) {
    return em.contains(user);
}

 
 
 

마치며

 

  • persist(), remove(), flush(), refresh(), detach()는 void를 반환하지만, 엔티티의 상태나 데이터베이스에 직접적인 영향을 미친다
  • find()merge()는 엔티티 객체를 반환합니다. find()는 기존 엔티티를 반환하고, merge()는 병합된 엔티티의 새로운 인스턴스를 반환한다.
  • createQuery()createNativeQuery()는 즉시 결과를 반환하지 않고, 쿼리를 실행할 수 있는 객체를 반환합니다. 실제 결과를 얻으려면 이 객체의 getResultList() 또는 getSingleResult() 메서드를 호출해야 한다.
  • contains()는 엔티티의 영속성 상태를 확인하는 데 유용하며, boolean 값을 반환한다.

 
 

 
참고.
* 영속성 컨텍스트 : 엔티티 객체가 데이터베이스에 저장되거나, 불러오거나, 삭제되는 동안 그 상태를 관리하는 일종의 메모리 공간
** CRUD : CRAETE, READ, UPDATE, DELETE

 
 
끝.

반응형