Spring Boot
강의

#4 - 테스트, 트랜잭션 경계

중년개발자
중년개발자

@loxo

24일 전

31

1. 테스트: 불신을 코드로 고정하는 방법

테스트는 기능을 증명하는 도구가 아니다.

테스트는 "믿지 않겠다는 약속"을 코드로 고정하는 장치다.

1.1 Controller 테스트는 얇아야 한다

Controller 테스트의 목적은 단 하나다.

  • 잘못된 요청은 절대 안으로 들어오지 못한다
java
@WebMvcTest(OrderController.class) class OrderControllerTest { @Test void 수량이_음수면_400을_반환한다() throws Exception { mockMvc.perform(post("/orders") .contentType(MediaType.APPLICATION_JSON) .content("{\"productId\":1, \"quantity\":-1}")) .andExpect(status().isBadRequest()); } }

👉 Controller 테스트는 신뢰 경계 테스트다.


10.2 Service 테스트는 규칙을 증명한다

Service 테스트에서는 "동작"이 아니라 "판단"을 검증한다.

java
@Test void 재고가_없으면_주문할_수_없다() { assertThatThrownBy(() -> orderService.create(req)) .isInstanceOf(BusinessException.class); }

2. 트랜잭션 경계: 신뢰의 범위

트랜잭션은 DB 기술이 아니다.

트랜잭션은 "여기까지는 믿는다"는 선언이다.

21 트랜잭션은 Service에서 시작한다

  • Controller ❌
  • Entity ❌
  • Service ⭕
java
@Transactional public void create(CreateOrderRequest req) { // 이 메서드 안에서만 상태 일관성을 보장한다 }

👉 트랜잭션 밖의 세계는 언제든 실패할 수 있다.


11.2 트랜잭션을 쪼개지 말아야 하는 이유

  • 중간 실패
  • 부분 저장
  • 복구 불가능 상태

이 모든 것은 경계가 흐릿할 때 발생한다.


3. 비동기 처리: 믿지 않음을 전제로 한 설계

비동기는 성능을 위한 도구가 아니다.

비동기는 실패를 전제로 하는 구조다.

3.1 비동기로 넘기기 전에 반드시 끝내야 할 것

  • 비즈니스 규칙 검증
  • 상태 변경의 확정
java
orderRepository.save(order); eventPublisher.publish(new OrderCreatedEvent(order.getId()));

👉 이벤트 이후의 세계는 다시 믿지 않는다.


32 비동기 영역에서 절대 하면 안 되는 것

  • 핵심 상태 변경
  • 트랜잭션 의존 로직

비동기는 "나중에 해도 되는 일"만 맡긴다.


4. 전문가 관점의 최종 정리

  • 테스트는 불신을 고정한다
  • 트랜잭션은 신뢰 범위를 자른다
  • 비동기는 실패를 인정한다

이 세 가지가 합쳐질 때, Spring Boot는 단순한 프레임워크가 아니라 안전한 백엔드 플랫폼이 된다.


여기까지 이해했다면,
이제 Spring Boot 4를 "쓴다"가 아니라
"지배한다"고 말할 수 있다.

목차

#테스트#컨트롤러 테스트#서비스 테스트#트랜잭션#신뢰 경계

댓글 0

Ctrl + Enter를 눌러 등록할 수 있습니다
※ AI 다듬기는 내용을 정제하는 보조 기능이며, 최종 내용은 사용자가 확인해야 합니다.