본문 바로가기

Spring Boot/Spring Boot

56 : 복수의 트랜잭션으로 Comment 처리 (Springboot + JPA)

다중 트랜잭션 (복수 트랜잭션) 

(하나의 API에 콜 할 때) DB에 (Insert, Update, Delete) 시키는 로직을 여러번 수행해야 할 때
예를들어 댓글을 구현할 때 다음과 같은 두 가지 sql 문을 실행해야한다

  1. 첫 번째로 댓글 입력하는 insert와
  2. 두 번째로 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