본격적인 스프린트 2 기능들을 개발하기에 앞서 스프린트 1에서 미처 하지 못하고 지나갔던 부분들을 마무리하고 지나가는 시간을 가졌다.
도메인 로직이라고 볼 수 있는 규칙들, 예를 들면 리뷰의 평점은 1~5점이어야 한다.
라는 규칙은 도메인 단에서 이미 검증중이지만, 클라이언트로부터 요청이 들어올 때 아예 값이 들어오지 않아 null
이 바인딩되거나 하는 경우를 걸러주기 위해 Spring Validation
을 적용했다. @NotNull
과 @Valid
어노테이션을 적절히 사용하여 @RequestBody
로 들어오는 DTO에 null이 들어와서는 안되는 자리에 null이 들어오는지 체크해주었다.
이 때 Spring Validation을 사용하면 MethodArgumentNotValidException
이 발생하는데, 이 예외에서 메시지를 가져오기가 조금 복잡하다. 바인딩 결과를 가져온 뒤, 에러를 모두 꺼내와서 해당 에러들을 돌면서 예외 메시지를 찾아야 한다.
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<ExceptionResponse> handleValidationException(
final MethodArgumentNotValidException exception) {
final StringBuilder stringBuilder = new StringBuilder();
exception.getBindingResult().getAllErrors().forEach((error) -> stringBuilder.append(error.getDefaultMessage())
.append(System.lineSeparator()));
return ResponseEntity.badRequest().body(ExceptionResponse.from(stringBuilder.toString()));
}
이렇게 하면 여러 Spring Validation의 어노테이션으로 지정한 유효성 검증에 지정한 메시지들을 줄 단위로 이어붙여서 예외 메시지로 사용할 수 있다.
원래 API를 만들면서 계속 REST Docs를 작성했어야 하지만 스프린트 1 때 워낙 바빠서 API 명세는 그냥 노션으로 프론트엔드에 넘겨주고 REST Docs 작성을 계속 미뤄왔었다. 하지만 API가 점점 많아지면 REST Docs를 한 번에 적용하기 더 힘들 것이 분명하기 때문에, 본격적인 스프린트 2 시작 전에 도입하기로 하고 REST Docs를 작성하는 시간을 가졌다. 문제는 이슈가 발생해서 골머리를 썩었다는 점. 이슈는 후술하도록 하겠다.
랜딩 페이지에서 보여줘야 하는 리뷰 정보는 어떤 제품에 대해 리뷰를 남겼는지 해당 제품의 정보도 담겨 있어야 한다. 때문에 어제 연관관계를 맺어주는 작업을 진행한 것이었는데, 오늘은 키보드 정보를 가지고 있는 리뷰 DTO를 따로 만들어서 제품 id로 조회를 할 때는 그냥 리뷰 DTO 페이지를, 전체 리뷰 조회를 할 때는 키보드 정보가 있는 리뷰 DTO 페이지를 반환하도록 해주었다.
asciidoc을 컨트롤러별로 나오는 API들끼리 묶어서 각각 만들고, index.adoc
에서 하나로 묶어서 html파일로 만들려고 했는데, 빌드 하고 나면 계속 각각의 adoc들을 include 할 수 없다는 에러만 나왔다. 거의 두 시간을 이 문제 해결에만 매달렸는데, 아무리 구글링해보고 해결책을 적용해봐도 해결되지 않았다. 우리의 결론은 gradle 7 버전으로 올라오면서의 문제라는 것. 7버전에서 asciidoctor가 안먹는 문제는 이미 해결한 상태였지만 경로 찾는 과정에서 뭔가 문제가 있는 것 같았다. REST Docs가 기능에 영향을 주는 부분은 아니므로 일단 각각의 api들끼리 묶인 adoc 여러개를 만들어서 각각 html 파일로 번역하는 정도로 끝마쳤다.
오전에는 release
브랜치에 스프린트 1 버퍼(스프린트 1에서 못다한 부분들을 본격적 스프린트 2 시작 전에 마무리하는 브랜치)를 머지하고, 이미 진행중이던 스프린트 2의 브랜치들에 rebase하여 conflict를 해결한 뒤 리뷰에 제품 정보를 추가하는 브랜치를 Pull Request 할 예정이다.
오후부터는 인증 / 인가 기능을 본격적으로 들어갈 예정이다. 최소한 로그인 요청에 대해 토큰과 회원 정보를 반환해주는 API 하나를 만드는 것을 목표로 하고 있다.
오늘도 고생 많으셨습니다 😃