Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags more
Archives
Today
Total
관리 메뉴

요리사에서 IT개발자로

Spring Boot @Transactional 요약 본문

Spring

Spring Boot @Transactional 요약

H.S-Backend 2024. 7. 2. 20:45

https://hs-backend.tistory.com/209

 

스파르타 코딩클럽 JPA 심화 트랜잭션

트랜잭션이란 데이터 베이스의 상태를 변화시키기 위해서 수행하는 작업의 단위데이터들을 생성 조회 수정 삭제 후 최종 결과물을 만들 때 까지의 하나의 작업을 트랜잭션으로 관리할 수 있다.

hs-backend.tistory.com

 

@Trasactional

Jpa가 아닌 스프링 프레임워크에서 제공하는 에너테이션

데이터의 상태를 변경시키는 작업 또는 한번에 수행되어야 하는 연산들을 의미한다.
Create, Update, Delete

 

한번에 수행되어야하는 연산들은

모두 에러 없이 끝나야 한다.

 

중간에 수정되게 또는 삭제되게 하면 

 롤백한다.

 

@Trasactional

어노테이션이 적용된 클래스는 실행 중에 예외가 발생하면 롤백한다.

(수행한 쿼리들을 모두 롤백한다)

 

스프링 프레임워크의 기본 설정

UnChecked Exception (RuntimeException 또는 상속받는 자식 예외 클래스)가 발생하면

모두 롤백한다.

 

@Transactional을 해당 클래스에 선언하면 클래스에 포함된 모든 메서드에 위에 기능이 적용된다.

원자성

트랜잭션 작업이 끝나면

Commit 또는 Rollback 되어야한다.

 

@Transactional을 사용하면 스프링 프레임워크는 AOP 프록시 객체로 넘긴다.

 

@Transactional은 Repository클래스 보다 Service 클래스의 메서드나 클래스에 선언하는 것이 일반적이다.

 

서비스 클래스는 트랜잭션 단위로 나누어 데이터를 처리하기에 적합하다.

 

Repository클래스는 메서드로 조합되어 있고

Controller는 내부로직이 서비스에 있다.

 

원자성

하나의 처리작업

일관성

있는 유지력

격리성

동시에 실행되지 않게

영속성

결과가 항상 저장되어야한다.


선언하는 방법

@Override
@Transactional
public void registerUser(UserRequestDto.Register requestDto) {

    if (userRepository.existsByUsername(requestDto.getUsername())) {
       throw new DuplicateUsernameException("Duplicate username.");
    }

    User user = User.builder()
       .username(requestDto.getUsername())
       .password(passwordEncoder.encode(requestDto.getPassword()))
       .nickname(requestDto.getNickname())
       .introduce(requestDto.getIntroduce())
       .email(requestDto.getEmail())
       .role(UserRole.USER)
       .build();

    UserPasswordRecord userPasswordRecord = new UserPasswordRecord(
       passwordEncoder.encode(requestDto.getPassword()));
    user.addPasswordRecord(userPasswordRecord);

    userRepository.save(user);
}

https://velog.io/@ha0kim/Transactional

 

@Transactional

실무에서 rabbitmq send message 부분이 데이터 업데이트 하는 @transactional 함수에 같이 포함되어 있는 부분이 있었다.이로 인해, 실제로 데이터가 업데이트가 되던지 말던지 rabbitmq에는 이미 업데이트

velog.io

https://assu10.github.io/dev/2023/09/10/springboot-database-4/

 

Spring Boot - 데이터 영속성(4): 트랜잭션과 @Transactional

이 포스트에서는 JPA 에서의 트랜잭션에 대해 알아본다.

assu10.github.io

반응형