hayu's 개발 일지

[TIL]240312 트랜잭션(transaction) 본문

프레임워크/spring

[TIL]240312 트랜잭션(transaction)

hayu00 2024. 3. 12. 21:58

트랜잭션(transaction)이란?

- 데이터 베이스 상에서 트랜잭션은 데이터베이스 관리 시스템 또는 유사한 시스템에서 상호작용의 단위이다. 여기서 유사한 시스템이란 트랜잭션이 성공과 실패가 분명하고 상호 독립적이면서 일관되고 밎을 수 있는 시스템을 의미한다. 

 

트랜잭션의 특징

- 원자성 (Atomicity): 트랜잭션의 연산은 데이터베이스에 모두 반영되던지 아니면 반영되지 않아야한다. 중간 단계까지 실행되고 실패하는 일이 없도록 하는 것이다.


- 일관성 (Consistency): 각 데이터 트랜잭션이 데이터 베이스를 일관성있는 상태에서 일관성있는 상태로 이동해야함을 의미한다. 시스템이 가지고 있는 고정요소는 트랜잭션 수행 전과 트랜잭션 수행 완료 후의 상태가 같아야한다. 


- 독립성 (Isolation): 트랜잭션을 수행 시 다른 트랜잭션의 연산 작업이 끼어들지 못하도록 보장하는 것을 의미한다. 수행중인 트랜잭션은 완전히 완료될 때까지 다른 트랜잭션에서 수행 결과를 참조할 수 없다.

-> 과부하로 인해 잘못된 트랜잭션이 발생하지 않아야 한다.


- 지속성 (Durability): 성공적으로 완료된 트랜잭션의 결과는 영구적으로 반영되어야 한다. 데이터 베이스 내의 데이터는 트랜잭션의 결과로만 변경되어야 하며 외부 영향에 의해 변경될 수 없어야 한다. 

 

트랜잭션의 연산

- 커밋: 하나의 트랜잭션이 성공적으로 끝났으며, 데이터 베이스가 일관성이 있는 상태로 유지될 때 트랜잭션이 마무리되었다는 것을 알리기 위한 연산이다.

- 롤백: 트랜잭션의 처리가 비정상적으로 종료된 경우, 트랜잭션을 다시 시작하거나 부분적으로 연산한 경과를 취소시킨다.

@Transactional 이란?

- 스프링에서는 어노테이션 방식으로 트랜잭션 처리를 지원한다. @Transactional 을 선언적 트랜잭션이라고 하는데 @Transactional을 선언하여 사용한다.

- 클래스 또는 메서드 위에 @Transactional을 붙이면, 트랜잭션 기능이 적용된 프록시 객체가 생셩되며 트랜잭션 성공 여부에 따라 Commit 또는 Rollback 작업이 이루어진다. 

+ 프록시(Proxy): 프록시는 '대신'이라는 뜻을 가지며 프로토콜에 있어서는 대리 응답에 사용하는 개념이다. 

 

@Transactional 예시 코드

//판매 게시글 작성
    @Transactional
    public PostResponseDto createPost(PostRequestDto postRequestDto) {

        Post post = new Post(postRequestDto); //DTO 를 받아 Entity 로 변환

        Post postSave = postRepository.save(post); //데이터 베이스에 저장

        PostResponseDto postResponseDto = new PostResponseDto(postSave); //다시 DTO 타입으로 변환

        return postResponseDto; //반환
    }