Spring | CRUD 기본 | 새로운 엔티티 추가

이어서 신규 엔터티를 저장한다. 이는 생각하기에는 매우 간단하다. 엔티티 클래스의 인스턴스를 만들고 EntityManager에 있는 저장용의 메소드를 호출하기만 하면 된다.

다만! 데이터베이스 조작은 단순히 데이터를 읽기만 한다면 간단하지만 데이터를 갱신하는 경우에는 주의가 필요하다. 데이터베이스는 동시에 여러 곳에서 액세스되는 경우도 있다. 따라서 다른 데이터가 액세스되는 동안에 데이터가 갱신이 되거나 한다면 문제가 일어날 수 있다.

따라서 데이터의 갱신이 필요한 경우에는 “트랜잭션"이라는 것을 사용해야 한다. 트랜잭션은 여러 처리를모와서 실행 할 수 있도록하는 기능이다.

트랜잭션을 지정하는 동안에는 그 처리를 실시하고 있는 해당 데이터에 대해서, 외부에서 액세스를 할 수 없게 된다. 트랜잭션 처리가 완료된 후에는 외부에서 부터 데이터 액세스 가능해 진다.

package com.devkuma.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 {
 
    public static void main(String[] args) {
        ApplicationContext app = new
            AnnotationConfigApplicationContext(SampleEntityConfig.class);
 
        EntityManagerFactory factory = app.getBean(EntityManagerFactory.class);
        EntityManager manager = factory.createEntityManager();
 
        makeDummyData(manager);
 
        // get list
        Query query = manager.createQuery("from SampleEntity");
        List list = query.getResultList();
        printList(list);
 
        System.out.println("...ok.");
    }
 
    // create dummy entity data.
    public static void makeDummyData(EntityManager manager) {
        EntityTransaction transaction = manager.getTransaction();
        transaction.begin();
        manager.persist(new SampleEntity("tuyano", "syoda@tuyano.com"));
        manager.persist(new SampleEntity("hanako", "hanako@flower"));
        manager.persist(new SampleEntity("taro", "taro@yamada"));
        manager.persist(new SampleEntity("sachiko", "sachico@happy"));
        manager.flush();
        transaction.commit();
    }
 
    public static void printList(List list) { ...생략... }
}

트랜잭션에 의해서 특정 작업을 수행하는 동안, 외부에서 액세스 할 수 없게 하여 안전하게 데이터베이스를 업데이트 할 수 있다는 것이다. 그럼, 처리의 흐름을 살펴 보자.

EntityTransaction transaction = manager.getTransaction ();

EntityManager의 “getTransaction"은 EntityTransaction라는 클래스의 인스턴스를 가져온다. 이것이 트랜잭션 클래스이다.

transaction.begin ();

“begin"메소드를 실행하여 트랜잭션 처리를 시작한다.

manager.persist (new SampleEntity ( "tuyano", "syoda@tuyano.com"));
manager.persist (new SampleEntity ( "hanako", "hanako @ flower"));
manager.persist (new SampleEntity ( "taro", "taro @ yamada"));
manager.persist (new SampleEntity ( "sachiko", "sachico @ happy"));

엔티티의 신규 추가는 EntityManager의 “persist"라는 메서드를 사용한다. 인수에 엔티티 클래스의 인스턴스 (여기에서는 SampleEntity)을 지정하여 호출하는 것으로, 그 엔티티를 데이터베이스에 저장한다.

manager.flush ();
transaction.commit ();

마지막으로 EntityManager의 ‘flush’을 호출해서 버퍼를 비우고, EntityTransaction의 “commit"메서드를 호출하여 커밋하면 persist한 엔티티가 전부 데이터베이스에 저장된다. 커밋을 하면 바로 트랜잭션 처리는 종료되고, 데이터베이스는 개방된다.

데이터 추가는 트랜잭션에 대한 사용법을 모르면 안된다. 이것은 데이터베이스 갱신의 기본이므로 여기에서 기본적인 사용법을 꼭 기억해 두도록 하자.