트랜잭션

BackEnd_Ash.log·2023년 7월 15일
0

자바스터디

목록 보기
6/19

트랜잭션 ??

Java Spring Boot에서 트랜잭션을 처리하는 방법은 여러 가지입니다. 가장 일반적인 방법은 @Transactional 애너테이션을 사용하는 것입니다. 이 애너테이션은 Spring에서 제공하는 선언적 트랜잭션 관리를 지원합니다.

먼저, 트랜잭션을 이해하는 것이 중요합니다. 트랜잭션은 데이터베이스에서 한 단위의 작업을 나타냅니다. 이 작업은 여러 단계로 이루어질 수 있지만, 모든 단계가 성공적으로 완료되거나, 실패한 경우 원래 상태로 돌아갈 수 있어야 합니다. 이를 원자성(Atomicity)라고 합니다. 또한 트랜잭션은 일관성(Consistency), 고립성(Isolation), 지속성(Durability) - 이를 ACID 속성이라고 부릅니다 - 을 유지해야 합니다.

@Transactional 애너테이션을 사용하면 Spring은 이러한 ACID 속성을 유지하는 데 도움이 됩니다. 트랜잭션을 시작하고, 종료하며, 실패시 롤백하는 등의 역할을 담당합니다.

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;

    @Transactional
    public void updateUser(Long id, String newName) {
        User user = userRepository.findById(id);
        user.setName(newName);
    }
}

위의 예제에서는 updateUser 메서드에 @Transactional 애너테이션이 적용되었습니다. 이 메서드가 호출될 때 Spring은 트랜잭션을 시작하고, 메서드가 정상적으로 완료되면 트랜잭션을 커밋합니다. 만약 메서드 실행 중 예외가 발생하면, Spring은 트랜잭션을 롤백하게 됩니다. 이렇게 함으로써, 데이터의 일관성을 보장하고 데이터베이스에 대한 작업을 안전하게 관리할 수 있습니다.

또한, @Transactional 애너테이션은 속성을 가질 수 있습니다. 예를 들어, readOnly, timeout, rollbackFor, noRollbackFor 등의 속성이 있습니다. 이러한 속성들을 통해 더욱 더 세밀한 트랜잭션 관리가 가능합니다.

Spring Boot에서 트랜잭션 관리는 매우 중요한 부분이며, @Transactional 애너테이션은 이러한 복잡한 작업을 효과적으로 단순화하는 데 도움이 됩니다.

@Transactional 만 해도 적용이 되는거야 ?

네, Spring Framework에서 @Transactional 애너테이션은 트랜잭션 관리를 돕는 데 매우 효과적입니다. 그러나 @Transactional을 사용하려면 몇 가지 주의해야 할 사항이 있습니다.

  1. Spring Bean에만 적용: @Transactional 애너테이션은 Spring Bean에 적용될 때만 동작합니다. 이는 Spring이 AOP(Aspect-Oriented Programming)를 이용해 트랜잭션 관리를 수행하기 때문입니다.

  2. Public 메소드에만 적용: @Transactional 애너테이션은 Public 메소드에만 적용해야 합니다. Private, Protected, Package-private 메소드에 @Transactional을 사용하면 무시되며, 예외를 발생시키지는 않습니다.

  3. 클래스 레벨과 메소드 레벨: @Transactional 애너테이션은 클래스 레벨과 메소드 레벨에 모두 적용할 수 있습니다. 클래스 레벨에 적용하면 해당 클래스의 모든 public 메소드가 트랜잭션을 가지게 됩니다. 메소드 레벨에 적용하면 해당 메소드만 트랜잭션을 가집니다. 두 레벨 모두에 애너테이션이 존재하는 경우, 메소드 레벨의 애너테이션 설정이 우선시 됩니다.

  4. 프록시와 실제 객체: Spring의 @Transactional 애너테이션은 프록시 기반으로 동작합니다. 즉, Spring은 해당 Bean에 대한 프록시를 생성하고, 이 프록시를 통해 트랜잭션 관리를 수행합니다. 따라서, 동일한 객체 내에서 @Transactional 메소드를 다른 메소드에서 직접 호출하면, 트랜잭션이 제대로 동작하지 않습니다. 이는 직접 호출된 메소드가 프록시를 거치지 않고 호출되기 때문입니다.

  5. Propagation, Isolation, Timeout, Read-only 등 속성: @Transactional 애너테이션은 다양한 속성을 가집니다. 트랜잭션의 전파 방식(Propagation), 고립 수준(Isolation), 타임아웃 시간(Timeout), 읽기 전용(Read-only) 등을 설정할 수 있습니다.

@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, readOnly = false, timeout = 60)
public void someBusinessService(...) { ... }

위와 같이 각 트랜잭션에 대해 세부 설정을 할 수 있습니다.
이를 통해 다양한 상황에 맞는 트랜잭션 관리가 가능합니다.

따라서, @Transactional 애너테이션은 매우 강력한 도구이지만,
이를 올바르게 사용하려면 위와 같은 사항들을 이해하고 있어야 합니다.

트랜잭션 진행 과정에 대해서 알려줘

트랜잭션의 진행 과정은 다음과 같습니다.

  1. 트랜잭션 시작: 트랜잭션은 일련의 작업 단위를 수행하는 프로세스의 시작부분에서 시작됩니다. Spring에서는 @Transactional 애너테이션이 붙은 메소드가 호출되면 트랜잭션이 시작됩니다.

  2. 트랜잭션 수행: 트랜잭션이 시작되면, 데이터베이스에 연결되고, SQL 질의가 수행됩니다. 이 과정에서 여러 개의 SQL 질의가 있을 수 있으며, 각 질의는 데이터베이스의 특정 부분을 읽거나 수정하는 역할을 합니다.

  3. 트랜잭션 커밋: 모든 SQL 질의가 성공적으로 수행되면, 트랜잭션은 커밋되어 데이터베이스의 변경사항이 저장됩니다. 커밋은 트랜잭션의 끝을 의미하며, 이후 발생하는 모든 변경사항은 새로운 트랜잭션에서 수행되어야 합니다.

  4. 트랜잭션 롤백: 트랜잭션 수행 중 어느 한 질의가 실패하면, 이미 수행된 모든 질의가 롤백되어 이전 상태로 되돌아갑니다. 롤백은 데이터 일관성을 보장하는 중요한 방법으로, 트랜잭션의 원자성을 유지하는 데 도움이 됩니다.

이러한 과정을 통해 트랜잭션은 데이터베이스의 일관성을 유지하고, 여러 사용자가 동시에 데이터베이스에 액세스하더라도 데이터의 정합성을 보장합니다.

Spring에서는 @Transactional 애너테이션을 사용하여 이러한 트랜잭션 처리를 추상화하고, 개발자가 트랜잭션 관리에 대한 부담을 덜게 해줍니다. @Transactional 애너테이션을 붙인 메소드가 호출되면, Spring은 해당 메소드에 트랜잭션을 시작하고, 메소드가 성공적으로 완료되면 트랜잭션을 커밋하며, 예외가 발생하면 트랜잭션을 롤백하는 역할을 담당합니다.

profile
꾸준함이란 ... ?

0개의 댓글