다중 트랜잭션 (복수 트랜잭션)
(하나의 API에 콜 할 때) DB에 (Insert, Update, Delete) 시키는 로직을 여러번 수행해야 할 때
예를들어 댓글을 구현할 때 다음과 같은 두 가지 sql 문을 실행해야한다
- 첫 번째로 댓글 입력하는 insert와
- 두 번째로 board의 댓글 수를 +1 하여 update 하는 작업
만약 insert는 성공했는데 update에 실패했다고 생각해보자.
분명 sql에는 데이터는 추가되었는데 board의 commentCount는 그대로이다.
이렇게 되면 데이터의 무결성이 파괴된다 -> 서비스에 신뢰가 떨어진다
이럴때 복수 트랜잭션을 사용하여 insert, update 둘중 하나라도 실패하면 -> 전체 실패처리
이를 @Transactional 의 성질 중 하나인 원자성으로 구현할 수 있다. 자세한 내용은 아래에
CommentJpa 생성
이제 위 기능을 수행하는 commentJpa를 구현해보자
commentJap 디렉토리 안에 controller , model , service 구조로 디렉토리를 생성한다.
- controller.CommentJapController
- service.CommentJpaService
- model.Comment
- model.CommentRepository (인터페이스)
CommentJapController
CommentJpaService
스프링에서는 트랜잭션 처리를 지원하는데 그중 어노테이션 방식으로 @Transactional을 선언한다.
(선언적 트랜잭션)
위 코드를 두가지 작업으로 나눈다면
첫 번째 작업인 insert 그리고 내용을 저장하는 commentRepository.save(c);
두 번째 작업인 update 그리고 내용을 저장하는 boardRepository.save(board);
여기서 @Transactional 어노테이션 성질에 따라 한 트랜잭션 내 작업들은
모두 성공 또는 모두 실패로 나뉜다.
따라서 insert가 실행되고 update가 실패하면 insert도 실행되지 않는다
57 : @Transactional
@Transactional 이란? 스프링에서는 트랜잭션 처리를 지원하는데 그중 어노테이션 방식으로 @Transactional을 선언하여 사용하는 방법이 일반적이며, 선언적 트랜잭션이라 부른다 @RequiredArgsConstructor
dwc04112.tistory.com
Comment
CommentRepository
'Spring Boot > Spring Boot' 카테고리의 다른 글
59 : jar & war 파일로 빌드하기 (0) | 2021.11.02 |
---|---|
58 : 답글 구현하기 (SpringbootApi + JPA) (0) | 2021.11.01 |
55 : JPA+Pageable 페이징처리 (Springboot + JPA) (0) | 2021.10.26 |
53 : JPA로 삭제와 리스트 출력 review (Springboot + JPA) (0) | 2021.10.26 |
51 : JPA로 CRUD 기능 구현 (SpringbootApi) (0) | 2021.10.25 |