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) {
...
}
'백엔드 > 스프링 부트 3_자바 백엔드' 카테고리의 다른 글
14. 댓글 엔티티와 리파지터리 만들기 (0) | 2025.01.11 |
---|---|
13. 테스트 코드 작성하기 (1) | 2025.01.11 |
11. HTTP와 REST 컨트롤러 (0) | 2025.01.04 |
10. RESET API와 JSON (0) | 2025.01.04 |
9. CRUD와 SQL 쿼리 종합 (0) | 2025.01.04 |