Spring | CRUD 기본 | 엔티티 수정


이어 엔터티의 변경이다. 이미 데이터베이스에 저장되어 있는 데이터를 업데이트하려면 해당 데이터 엔티티를 가져와서, 그 값을 변경해서 저장하는 작업을 해야한다.

아래와 같이 간단한 예제를 작성해 놨다.

package com.devkuam.spring.db;
 
import java.util.List;
 
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Query;
 
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
 
public class App {
    private static EntityManager manager;
 
    public static void main(String[] args) {
        ApplicationContext app = new
            AnnotationConfigApplicationContext(SampleEntityConfig.class);
 
        EntityManagerFactory factory = app.getBean(EntityManagerFactory.class);
        manager = factory.createEntityManager();
 
        // make dummy
        makeDummyData();
         
        // update entity
        updateEntity(1L);
        updateEntity(3L);
 
        // get list
        Query query = manager.createQuery("from SampleEntity");
        List list = query.getResultList();
        printList(list);
 
        System.out.println("...ok.");
    }
 
    public static void makeDummyData() { ...생략... }
    public static void printList(List list) { ...생략... }
     
    // update entity
    public static void updateEntity(long id) {
        SampleEntity entity = manager.find(SampleEntity.class, id);
        entity.setName("**update name**");
        entity.setMail("**update@mail**");
        EntityTransaction transaction = manager.getTransaction();
        transaction.begin();
        manager.merge(entity);
        manager.flush();
        transaction.commit();
    }
}

실행을 하면 4개의 더미 데이터 중에 2개의 내용을 변경해서 출력하고 있다.

변경 처리는 updateEntity 메서드로 정리하고 있다. 이는 데이터를 변경하는 ID 번호를 인수에 전달할 수 있게끔 되어 있다.

그럼 처리의 흐름을 살펴보자.

EntityManagerFactory factory = app.getBean(EntityManagerFactory.class);
manager = factory.createEntityManager();

먼저, EntityManager 인스턴스를 얻어오고, 그것을 사용하여 처리를 하고 있다.

SampleEntity entity = manager.find (SampleEntity.class, id);

SampleEntity 인스턴스를 얻어온다. 이것은 new로 새롭게 만드는 것이 아니라 EntityManger의 “find"메소드를 호출한다. find는 특정 ID의 엔티티를 검색하는 것이다. 이것은 인수에 엔티티 클래스의 class 값과 검색 엔티티의 ID 값을 각각 지정한다.

먼저 목록 리스트를 얻어오는 경우에는 다음 처리 등을 생각하면 귀찮긴 하지만, 이렇게 EntityManager 의 메소드를 사용하면 ID를 지정하는 것만으로 엔티티를 얻을 수 있다. (다만, ID를 모르는 상태에서는 이를 사용할 수 없다.)

다음에 얻어온 엔티티의 메소드를 호출하여 내용을 업데이트한다.

entity.setName ( "** update name **");
entity.setMail ( "** update @ mail **");

편집이 끝나면 신규 작성과 같이 트랜잭션을 사용하여 업데이트 처리를 한다. 이것은 기본적으로 신규 작성을 하는 흐름과 같지만, 갱신하는 부분만 다르다.

EntityTransaction transaction = manager.getTransaction ();
transaction.begin ();
manager.merge (entity);
manager.flush ();
transaction.commit ();

이미 저장되어 있는 엔터티의 변경은 “merge"라는 메소드를 사용해 실시한다. 인수에 업데이트하는 엔터티 클래스의 인스턴스를 지정하면 해당 엔티티의 값을 최신 상태로 업데이트한다.

그 후에는 EntityManager를 flush하고 EntityTransaction을 commit하면 작업 완료이다. 업데이트는 신규 작성과 달리, find에서 특정 ID의 엔티티를 얻어서, merge 업데이트 처리를 하면 된다.