유효성 검사, 예외처리
게시글 작성 기능
- 게시글 제목, 내용은 필수적으로 포함해야 한다.
- 제목은 1글자 이상 15글자 이하여야 한다.
- 내용은 1글자 이상 1000글자 이하여야 한다.
- 제목은 공백으로만 이루어질 수는 없다.\
특정 게시글 조회 기능
- 게시글의 id(PK, primary key)로 특정 게시글을 조회했을 때, 존재하지 않는 게시글일 경우 에러 메시지로 응답하기
특정 게시글 수정 기능
- 게시글 작성할 때의 유효성 검사 조건과 동일하게 가져가야 한다.
특정 게시글 삭제 기능
- 게시글의 id(PK, primary key)로 특정 게시글을 삭제하기 위해 조회했을 때, 존재하지 않는 게시글일 경우 에러 메시지로 응답하기
게시글 검색 기능
- 검색 키워드는 공백을 제외한 1글자 이상이어야 한다.
위와 같은 기능 별로 각각 예외처리를 해주어야 했다.
requestDTO에 @NotBlank 같은 검증 어노테이션을 사용하였고 컨트롤러에서 @Valid로 검증하는 방식을 사용했다.
@Valid를 통해 예외가 발생될 경우 MethodArgumentNotValidException이 터지게 되어 이 예외를 처리할 수 있는 핸들러를 @RestControllerAdvice를 사용한 handlerController에 만들어 주었다.
@ExceptionHandler(MethodArgumentNotValidException.class)
protected ResponseEntity<FieldExceptionResponse> handleValidationException(MethodArgumentNotValidException ex){
FieldExceptionResponse response = FieldExceptionResponse.from(ErrorCode.INVALID_INPUT_EXCEPTION, ex);
return new ResponseEntity<>(response, HttpStatus.BAD_REQUEST);
}
하지만 keyword가 query parameter로 들어올 때는 위와 같은 방식으로 검증할 수 없었다.
컨트롤러의 파라미터 자체에 어노테이션을 붙이고 클래스 레벨에 @Validated를 붙여 검증을 하였다.
@Validated
public class BoardController{
public ResponseEntity<List<BoardResponse>> boardListByKeyword(@NotBlank @RequestParam String keyword){
List<BoardResponse> response = boardService.findBoardByKeyword(keyword);
return ResponseEntity.ok(response);
}
}
API 문서 작성
swagger를 이용하여 API 문서를 작성해 보았다.
- @ApiOperation = Method 설명
- @ApiImplicitParam = Request Parameter 설명
- @ApiResponse = Reponse 설명
- @ApiParam = DTO field 설명
- @ApiModelProperty = DTO 예제 설명
- @ApiIgnore = Swagger UI 상 무시
swagger에서 지원하는 어노테이션을 사용하여 API에 대한 정보를 나타내었다.
어려웠던 점, 개선할 점
예외처리에 관한 부분은 한번 큰 구조를 잡아두고 추가로 필요한 예외가 생길 때마다 하나씩 추가하는 방식으로 하다 보니 비교적 쉽게 할 수 있었다.
하지만 swagger를 이용하여 API문서를 작성해 보는 것은 처음이었기 때문에 신경 써야 될 부분이 많았다.
다른 사람들이 작성한 API문서를 보면서 내가 부족한 것이 무엇이고 더 추가해야 할 것들을 배워봐야겠다.
'study' 카테고리의 다른 글
[JSCODE] 회원가입, 로그인 기능 추가 (0) | 2023.05.20 |
---|---|
[JSCODE] Elastic Beanstalk을 통한 배포 (0) | 2023.05.17 |
[JSCODE] 익명 게시판 서비스 개발 시작 (0) | 2023.05.11 |
[JSCODE] 스프링 스터디 회고 (0) | 2023.03.31 |
[JSCODE] 상점 API 추가 (0) | 2023.03.29 |