[우아한테크코스 4기] 220713 F12 개발일지

Jihoon Oh·2022년 7월 13일
1

우아한테크코스 4기

목록 보기
21/43
post-thumbnail

오늘 진행한 일

본격적인 스프린트 2 기능들을 개발하기에 앞서 스프린트 1에서 미처 하지 못하고 지나갔던 부분들을 마무리하고 지나가는 시간을 가졌다.

Spring Validation

도메인 로직이라고 볼 수 있는 규칙들, 예를 들면 리뷰의 평점은 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의 어노테이션으로 지정한 유효성 검증에 지정한 메시지들을 줄 단위로 이어붙여서 예외 메시지로 사용할 수 있다.

Spring REST Docs 적용

원래 API를 만들면서 계속 REST Docs를 작성했어야 하지만 스프린트 1 때 워낙 바빠서 API 명세는 그냥 노션으로 프론트엔드에 넘겨주고 REST Docs 작성을 계속 미뤄왔었다. 하지만 API가 점점 많아지면 REST Docs를 한 번에 적용하기 더 힘들 것이 분명하기 때문에, 본격적인 스프린트 2 시작 전에 도입하기로 하고 REST Docs를 작성하는 시간을 가졌다. 문제는 이슈가 발생해서 골머리를 썩었다는 점. 이슈는 후술하도록 하겠다.

리뷰 DTO에 키보드 정보 추가

랜딩 페이지에서 보여줘야 하는 리뷰 정보는 어떤 제품에 대해 리뷰를 남겼는지 해당 제품의 정보도 담겨 있어야 한다. 때문에 어제 연관관계를 맺어주는 작업을 진행한 것이었는데, 오늘은 키보드 정보를 가지고 있는 리뷰 DTO를 따로 만들어서 제품 id로 조회를 할 때는 그냥 리뷰 DTO 페이지를, 전체 리뷰 조회를 할 때는 키보드 정보가 있는 리뷰 DTO 페이지를 반환하도록 해주었다.

오늘 발생한 이슈

Spring REST Docs의 asciidoc 이슈(포기)

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 하나를 만드는 것을 목표로 하고 있다.

profile
Backend Developeer

1개의 댓글

comment-user-thumbnail
2022년 7월 13일

오늘도 고생 많으셨습니다 😃

답글 달기