백엔드/스프링 부트 3_자바 백엔드

12. 서비스 계층과 트랜잭션

smallsilver_west 2025. 1. 11. 16:30

12.1 서비스와 트랜잭션의 개념

 

서비스

Service, 컨트롤러와 리포지터리 사이에 위치하는 계층으로 비즈니스 로직을 처리하는 순서를 총괄하는 역할

 

트랜잭션

Transaction, 서비스 업무 처리의 최소 단위로 모두 성공해야 하는 일련의 과정

 

롤백

Rollback, 트랜잭션이 실패했을 때, 초기 단계로 되돌리는 역할

 

12.2 서비스 계층 만들기

 

서비스 객체 생성

ArticleService 객체 생성해 articleRepository에 객체 주입

public class ArticleApiController {
    @Autowired
    private ArticleService articleService;
}
@Service
public class ArticleService {
    @Autowired
    private ArticleRepository articleRepository;
}

 

12.3 트랜잭션 맛보기

 

롤백

롤백 기능을 확인하기 위해 의도적으로 예외사항을 발생

@PostMapping("/api/transaction-test")
public ResponseEntity<List<Article>> transactionTest(@RequestBody List<ArticleForm> dtos) {
    List<Article> createdList = articleService.creatArticles(dtos);
    return (createdList != null) ?
            ResponseEntity.status(HttpStatus.OK).body(createdList) :
            ResponseEntity.status(HttpStatus.BAD_REQUEST).build();
}

* 한번에 여러개의 article을 생성하는 메소드

public List<Article> creatArticles(List<ArticleForm> dtos) {
    List<Article> articleList = dtos.stream()
            .map(dto -> dto.toEntity())
            .collect(Collectors.toList());

    articleList.stream()
            .forEach(article -> articleRepository.save(article));

    articleRepository.findById(-1L)
            .orElseThrow(() -> new IllegalArgumentException("결제 실패!"));

    return articleList;
}

* 500 error가 발생하지만, error 전에 insert문을 실행에 DB에 데이터 추가

 

트랜잭션 선언

데이터 생성 실패 이전으로 되돌리기 위해 트랜잭션을 선언

@Transactional
public List<Article> creatArticles(List<ArticleForm> dtos) {
    ...
}