EntityManagerFactory와 EntityManager 개념에서 thread-safety(쓰레드 안전성)가 중요한 이유는 Java 에서 데이터베이스에 접근하는 방식과 관련이 깊습니다.
쓰레드 안전성은 여러 쓰레드가 동시에 객체에 접근하더라도 객체의 상태가 올바르게 유지되는 것을 의미합니다. 쓰레드 안전성이 없는 객체를 여러 쓰레드에서 동시에 사용할 경우 데이터 무결성이 깨질 수 있습니다.
close()
메소드)EntityManager는 쓰레드마다 개별적으로 사용해야 하기 때문에, 일반적으로 아래와 같은 방식으로 사용합니다.
EntityManagerFactory emf = Persistence.createEntityManagerFactory("persistence-unit");
EntityManager em = emf.createEntityManager();
try {
em.getTransaction().begin();
// 데이터베이스 연산 수행
em.getTransaction().commit();
} catch (Exception e) {
em.getTransaction().rollback();
} finally {
em.close(); // EntityManager는 사용 후 반드시 닫아야 합니다.
}
위 코드는 각 쓰레드가 독립된 EntityManager를 가져와 데이터베이스 작업을 수행한 후, 작업이 끝나면 close()
로 자원을 해제하는 방식입니다.
Spring 프레임워크나 Java 환경에서는 트랜잭션 관리를 담당하는 기능이 내장되어 있어서, 개발자가 직접 트랜잭션을 관리하지 않아도 됩니다. Spring의 @Transactional을 사용하면 쓰레드마다 적절하게 EntityManager를 할당해줍니다.
@Service
public class MyService {
@PersistenceContext
private EntityManager em;
@Transactional
public void someDatabaseOperation() {
// EntityManager는 트랜잭션 범위 내에서 안전하게 사용됩니다.
em.persist(newEntity);
}
}
@Transactional
어노테이션을 사용하여 쓰레드 안전한 EntityManager 사용을 자동으로 처리할 수 있습니다.