컨트롤러 응답
성공했을 때, 그냥 데이터를 보내는 것 보단, 일정한 형식을 통해 항상 동일하게 보내주는 것이 좋다.
public class ApiResponse<T> {
private int code;
private HttpStatus status;
private String message;
private T data;
public static <T> ApiResponse<T> of(HttpStatus httpStatus,T data) {
return of(httpStatus,httpStatus.name(),data);
}
}
//controller단
@PostMapping("/api/v1/product/new")
public ApiResponse<ProductResponse> createdProduct(@Valid @RequestBody ProductCreateRequest productCreateRequest){
return ApiResponse.of(HttpStatus.OK,productService.createdProduct(productCreateRequest));
}
- 응답할때 틀이 있으면 좋음
- ApiResponse 성공 실패 모두 동일한 응답으로 내려가게 된다.
RestControllerAdvice로 예외처리
응답이 성공했을 경우 ApiResponse 형식으로 return하게된다, 실패했을 때도 동일한 응답이 좋다.
@RestControllerAdvice
public class ApiControllerAdvice {
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(BindException.class)
public ApiResponse<Object> bindException(BindException e) {
return ApiResponse.of(
HttpStatus.BAD_REQUEST,
e.getBindingResult().getAllErrors().get(0).getDefaultMessage(),
null);
//getDefaultMessage는 validationd에서 지정한 메세지가 나옴
}
}
- @Vaild 어노테이션으로 발생한 예외는 bindException
- @RestControllerAdvice 로 RestController 예외처리가 가능해짐
- ApiResponse 형태로 응답과 동일하게 리턴, But 형식은 합의하에 결정하면된다.
@Valid
- @NotNull: NULL 이 아닌지 검증함
- @NotEmpty: NULL 이 아니고, 빈 스트링("") 아닌지 검증함(" "은 허용됨)
- @NotBlank: NULL 이 아니고, 공백(""과 " " 모두 포함)이 아닌지 검증함
- Strign값은 notBlank로 검증하는걸 추천
밸리데이션에 대한 책임 분리
Sring name → 상품 이름은 20자 제한 이라는 조건이 있다.
- 이걸 그럼 @MAX(20) 이라는 valid를 달아서, contoller에서 @Valid를 통해 검증하는게 맞을까?
- 이런 검증은 타고 들어가, 서비스 레이어나, 도매인 객체를 생성하는 시점에서 하는 것이 좋다. 성격에 따라서 레이어에 밸레이데이션에 대한 책임을 나눠가지는 것이 좋다.
레이어간 의존성 문제
위 예시코드는 OrderCreateRquest를 라는 dto를 그대로 서비스로 넘긴다.
- 일부러 controller단에서 만든 DTO 서비스를 service 단까지 내려서 사용한다.
- 두 레이어간의 의존관계가 발생한다.
- 왜냐면 만약 서비스의 기능을 사용하는 곳이, 다양하게 포스기, 키오스크.. 여러곳이 되었을 때, 각 Dto는 다를 수 있다. 그럼 Sevice는 모든 dto를 알게된다.
- 따라서 그대로 넘겨주는 것이 아닌 서비스용 dto로 전환하여 넘겨주는 것을 추천한다.
즉, 서비스 레이어 기능을 동시에 사용하면서, 하위 contoller가 변경되어도 서비스가 영향을 받지 않도록 설계해야한다.
출처 ; https://www.inflearn.com/course/practical-testing-실용적인-테스트-가이드
'TDD' 카테고리의 다른 글
더 나은 테스트를 작성하기 위한 고민 (0) | 2024.12.01 |
---|---|
Mockito로 Stubbing 하기 (1) | 2024.12.01 |
Presentation Layer의 테스트 (0) | 2024.11.24 |
레이어드 아키텍처(Layered Architecture) 와 테스트 (0) | 2024.11.18 |
테스트는 [문서]다 (1) | 2024.11.15 |