Skip to content

Commit

Permalink
Validation 체크 및 ControllerExceptionAdvice 생성
Browse files Browse the repository at this point in the history
  • Loading branch information
yeonkyungJoo committed Feb 18, 2023
1 parent 4239842 commit e38b6f6
Show file tree
Hide file tree
Showing 7 changed files with 91 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package org.bbaemin.config.advice;

import org.bbaemin.config.exception.BindException;
import org.bbaemin.config.response.ApiResult;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.List;

@RestControllerAdvice
public class ControllerExceptionAdvice {

@ExceptionHandler(BindException.class)
public ApiResult<?> handleBindException(BindException e) {
BindingResult bindingResult = e.getBindingResult();
List<FieldError> fieldErrors = bindingResult.getFieldErrors();
return ApiResult.badRequest(fieldErrors);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package org.bbaemin.config.exception;

import lombok.Getter;
import org.springframework.validation.BindingResult;

@Getter
public class BindException extends RuntimeException {

private BindingResult bindingResult;

public BindException(BindingResult bindingResult) {
this.bindingResult = bindingResult;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ enum ResultCode {
}
}

@Getter
public static class Error<R> {
private HttpStatus httpStatus;
private R cause;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
package org.bbaemin.user.controller;

import lombok.RequiredArgsConstructor;
import org.bbaemin.config.exception.BindException;
import org.bbaemin.config.response.ApiResult;
import org.bbaemin.user.controller.request.JoinRequest;
import org.bbaemin.user.controller.request.UpdateUserInfoRequest;
import org.bbaemin.user.controller.response.UserResponse;
import org.bbaemin.user.service.UserService;
import org.bbaemin.user.vo.User;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.PathVariable;
Expand Down Expand Up @@ -43,7 +46,15 @@ public ApiResult<UserResponse> getUser(@PathVariable Long userId) {

// 회원 등록
@PostMapping
public ApiResult<UserResponse> join(@RequestBody JoinRequest joinRequest) {
public ApiResult<UserResponse> join(@Validated @RequestBody JoinRequest joinRequest, BindingResult bindingResult) {

if (bindingResult.hasErrors()) {
// TODO - CHECK : org.springframework.validation.BindException
// validation 라이브러리에서 제공하는 BindException을 사용하는 것이 좋은가?
// checked 예외 vs unchecked 예외
throw new BindException(bindingResult);
}

User user = userService.join(
User.builder()
.email(joinRequest.getEmail())
Expand All @@ -57,7 +68,12 @@ public ApiResult<UserResponse> join(@RequestBody JoinRequest joinRequest) {

// 회원정보 수정
@PutMapping("/{userId}")
public ApiResult<UserResponse> updateUserInfo(@PathVariable Long userId, @RequestBody UpdateUserInfoRequest updateUserInfoRequest) {
public ApiResult<UserResponse> updateUserInfo(@PathVariable Long userId, @Validated @RequestBody UpdateUserInfoRequest updateUserInfoRequest, BindingResult bindingResult) {

if (bindingResult.hasErrors()) {
throw new BindException(bindingResult);
}

User user = userService.updateUserInfo(userId,
updateUserInfoRequest.getNickname(),
updateUserInfoRequest.getImage(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,23 @@
import lombok.Builder;
import lombok.Getter;

import javax.validation.constraints.NotBlank;

@Getter
public class JoinRequest {

@NotBlank
private String email;
@NotBlank
private String nickname;
private String image;

// TODO - validation check : password.equals(passwordConfirm)
@NotBlank
private String password;
private String passwordConfirm;

@NotBlank
private String phoneNumber;

@Builder
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,15 @@
import lombok.Builder;
import lombok.Getter;

import javax.validation.constraints.NotBlank;

@Getter
public class UpdateUserInfoRequest {

@NotBlank
private String nickname;
private String image;
@NotBlank
private String phoneNumber;

@Builder
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch;
Expand Down Expand Up @@ -132,6 +133,32 @@ void join() throws Exception {
verify(userService).join(any(User.class));
}

@Test
void join_throws_BindException_when_nickname_is_blank() throws Exception {
// given
// when
JoinRequest joinRequest = JoinRequest.builder()
.email("user@email.com")
.nickname("")
.image(null)
.password("password")
.passwordConfirm("passwordConfirm")
.phoneNumber("010-1234-5678")
.build();

mockMvc.perform(post(BASE_URL)
.contentType(MediaType.APPLICATION_JSON)
.content(objectMapper.writeValueAsString(joinRequest)))
.andDo(print())
.andExpect(status().isOk())
.andExpect(jsonPath("$.code").value("FAIL"))
.andExpect(jsonPath("$.result").exists())
.andExpect(jsonPath("$.result.httpStatus").value("BAD_REQUEST"))
.andExpect(jsonPath("$.result.cause").exists());
// then
verify(userService, times(0)).join(any(User.class));
}

@Test
void updateUserInfo() throws Exception {
// given
Expand Down

0 comments on commit e38b6f6

Please sign in to comment.