트러블 슈팅

[트러블 슈팅] @Transactional이 필요한 이유

Young_Han 2024. 10. 17. 12:42

1. 개요

 

기능을 테스트하기 위해 postman을 사용하는 과정에서 문제가 발생했다.  PUT 메서드를 사용 후 결과가 정상적으로 처리가 되었지만 조회를 해보니 수정이 되지 않았다.

  • POST기능은 정상적으로 작동했다.

  • PUT 이후에도 서버는 정상적으로 호출되었다.

  • 하지만 조회 시 수정된 데이터가 조회되지 않았다.

2. 원인

 이러한 문제를 해결하기 위해 디버깅 과정을 거쳤다. 데이터가 누락되는 현상은 없어 보였지만, console창에서 update가 없는 것을 발견했다. 

Hibernate: 
    /* insert for
        com.sparta.scheduledev.entity.User */insert 
    into
        user (created_at, email, login, modified_at, password, username) 
    values
        (?, ?, ?, ?, ?, ?)
Hibernate: 
    select
        u1_0.id,
        u1_0.created_at,
        u1_0.email,
        u1_0.login,
        u1_0.modified_at,
        u1_0.password,
        u1_0.username 
    from
        user u1_0 
    where
        u1_0.id=?

 

확인 도중 @Transactional 어노테이션  누락하여 데이터베이스 트랜잭션이 작동하지 않았다는 것을 확인했다.

 

 @Transactional 어노테이션은 스프링 프레임워크에서 트랜잭션을 처리하는 데 사용되며, 데이터 일관성과 영속성 관리를 보장한다. 영속성이란 주로 엔티티가 영속성 컨텍스트(Persistence Context)에 의해 관리되는 것을 의미한다.

 트랜잭션 범위 내에서 데이터 변경이 발생하면, 엔티티 매니저가 영속성 컨텍스트에 변경 내용을 저장한다. 트랜잭션이 성공적으로 완료되면 영속성 컨텍스트에 저장된 변경 사항이 실제 데이터베이스에 반영된다. 만약 트랜잭션이 실패하면 롤백되어 모든 변경이 취소된다.

 이를 통해 데이터베이스의 일관성과 안정성이 유지된다.

 


3. 해결

@Transactional 어노테이션 추가.

 

1. 해당 메서드에 @Transactional 어노테이션을 추가했다.

2. 추가 후, 데이터베이스 트랜잭션이 올바르게 관리되어 모든 작업이 정상적으로 처리되었다.

Hibernate: 
    /* insert for
        com.sparta.scheduledev.entity.User */insert 
    into
        user (created_at, email, login, modified_at, password, username) 
    values
        (?, ?, ?, ?, ?, ?)
Hibernate: 
    select
        u1_0.id,
        u1_0.created_at,
        u1_0.email,
        u1_0.login,
        u1_0.modified_at,
        u1_0.password,
        u1_0.username 
    from
        user u1_0 
    where
        u1_0.id=?
Hibernate: 
    /* update
        for com.sparta.scheduledev.entity.User */update user 
    set
        email=?,
        login=?,
        modified_at=?,
        password=?,
        username=? 
    where
        id=?

 


결과

  • 정상적으로 수정되었다.

마무리

이번 트러블 슈팅을 요약하면 다음과 같습니다.

(1) 여러 메서드 호출 중 일부만 성공하고 나머지가 실패하여 데이터 일관성 문제 발생했다.

(2) 디버깅을 통하여 데이터는 정상적으로 이동하는 것을 확인했다.

(3) 확인 도중 @Transactional 어노테이션  누락하여 데이터베이스 트랜잭션이 작동하지 않았다는 것을 확인했다.

(4) 해당 메서드에 @Transactional 어노테이션 추가하여 실행한 결과 정상적으로 작동되었다.