집돌이 공대남 IT

JPA 프로그래밍 마스터하기: 중급부터 전문가까지 실습을 통한 학습(4) 본문

IT/웹개발

JPA 프로그래밍 마스터하기: 중급부터 전문가까지 실습을 통한 학습(4)

집공이 2023. 9. 1. 12:00

JPA 활용 전략 및 최적화 기법: 트랜잭션 관리 디테일

안녕하세요, 여러분! 집돌이 공대남입니다.

이번 포스트에서는 트랜잭션 관리에 대해 조금 더 디테일하게 살펴보도록 하겠습니다.

 

트랜잭션 관리

데이터베이스에서 트랜잭션은 여러 단계의 처리를 한 번에 수행하는 하나의 작업 단위를 의미합니다. JPA에서 트랜잭션 관리는 EntityManager 인스턴스와 관련이 있습니다.

EntityManager는 EntityTransaction 인스턴스를 통해 트랜잭션을 시작, 커밋, 롤백하는 API를 제공합니다.

아래는 트랜잭션을 사용하는 기본적인 코드 예제입니다.

EntityManagerFactory emf = Persistence.createEntityManagerFactory("example-unit");
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();

try {
    transaction.begin();

    // 여기서 비즈니스 로직 수행...
    ExampleEntity entity = new ExampleEntity();
    entity.setName("example");
    em.persist(entity);

    transaction.commit();
} catch (RuntimeException e) {
    if (transaction.isActive()) transaction.rollback();
    throw e;
} finally {
    em.close();
}

이 코드에서는 EntityTransactionbegin() 메서드를 호출하여 트랜잭션을 시작하고, commit() 메서드를 호출하여 트랜잭션을 커밋합니다. 만약 중간에 예외가 발생하면 rollback() 메서드를 호출하여 트랜잭션을 롤백합니다.

 

스프링에서의 선언적 트랜잭션 관리

스프링 프레임워크에서는 @Transactional 어노테이션을 사용하여 선언적으로 트랜잭션을 관리할 수 있습니다. 이 어노테이션을 통해 트랜잭션의 시작과 끝, 그리고 예외 처리 등을 스프링에게 맡길 수 있습니다. 아래는 @Transactional을 사용하는 방법을 보여주는 예제 코드입니다:

@Service
public class ExampleService {

    private final ExampleRepository repository;

    public ExampleService(ExampleRepository repository) {
        this.repository = repository;
    }

    @Transactional
    public void registerExample(ExampleDto exampleDto) {
        ExampleEntity entity = new ExampleEntity();
        entity.setName(exampleDto.getName());
        repository.save(entity);
    }
}

위 코드에서 registerExample() 메서드에 @Transactional 어노테이션을 붙여 트랜잭션을 관리하고 있습니다. 이 메서드 내에서 발생하는 모든 데이터베이스 작업은 이 트랜잭션 범위 내에서 실행됩니다.

이처럼 JPA는 우리가 트랜잭션을 쉽고 효과적으로 관리하게 도와줍니다.

다음 포스트에서는 JPA와 QueryDSL을 이용한 동적 쿼리 작성 방법에 대해 알아보겠습니다.

감사합니다.