앞서 UserRepostory, UserService, test작성, 예외 클래스를 만들었습니다.
이제 Controller와 예외가 터졌을 때 클라이언트에게 예외에 대한 내용을 알려줄 수 있도록 ControllerAdvice, ExceptionHandler를 알아보겠습니다. 

 

1. UserController

@RestController
@RequiredArgsConstructor
public class UserController {

    private final UserService userService;

    @PostMapping("/signup")
    public ResponseEntity<String> signup(@RequestBody UserDto.SignupDto signupDto){
        userService.signup(signupDto.getEmail(),signupDto.getPassword(),signupDto.getRole(),
                signupDto.getName(),new Address(signupDto.getCity(),signupDto.getStreet()));
        return new ResponseEntity<>("ok", HttpStatus.OK);
    }

@PostMapping("/login")
    public ResponseEntity<Long> login(@RequestBody UserDto.LoginDto loginDto, HttpServletRequest request){
        SessionDto sessionDto = userService.login(loginDto.getEmail(),loginDto.getPassword());
        HttpSession session = request.getSession();
        session.setAttribute(SessionConst.LOGIN_MEMBER,sessionDto);
        return new ResponseEntity<>(sessionDto.getId(),HttpStatus.OK);
    }
}

@RestController: @ResponseBody + @Controller

  •  @ResponseBody -> 객체의 값을 json형태의 정보로 바인딩하고 반환할 수 있도록 해줍니다.
  • @Controller -> ComponentScan으로 bean으로 등록해주며, 클라이언트로부터 요청 오는 것을 잡아 처리해줍니다.

URLMapping

  • Get, Post, Put, Delete, Patch의 유형이 있습니다. 해당 유형은 동일한 URL이라 해도 유형에 따라 받는 요청을 분리합니다.
  • [Post] http://[ip]:port/signup으로 호출한다면 signup이 호출되며, 로직이 수행됩니다. 즉 Postmapping("/signup")이 어떠한 요청을 불렀는지에 대한 식별자라고 생각하면 됩니다.

@RequestBody: @ResponseBody와 마찬가지로 json형태의 정보 바인딩 해주는 역할을 합니다. 

 

ResponseEntity: 요청에 대한 응답을 담을 수 있고, 상태 코드를 보낼 수 있습니다. 상태 코드에 따라 클라이언트는 요청이 성공했는지, 실패했는지 인지할 수 있습니다. 

 

HttpSession: 사용자에 대한 정보를 메모리가 아닌 서버가 돌아가고 있는 서비스에 저장하는 역할을 합니다. 즉 어떤 Session을 활용한다면 어떤 사용자인지 알 수 있습니다. 로그인을 통해 인증하고 자신이 어떤 사용자인지 알 줄 수 있습니다.

  • session.setAttribute("넣을 이름", 데이터) session("as", sessionDto)라면 session의 as이름으로 sessionDto를 저장하며, session.getAttribute("as")를 하면 sessionDto에 대한 데이터를 얻을 수 있습니다. 

2. ErrorDto 클라이언트에 보여줄 예외에 대한 정보를 담습니다. 

@Data
@AllArgsConstructor
@NoArgsConstructor
public class ErrorDto {
    public String errorMessage;
}

3. advice 패키지를 생성한 후 UserControllerAdvice를 만들어줍니다. 

 

@RestControllerAdvice(assignableTypes = UserController.class)
public class UserControllerAdvice {

    @ExceptionHandler(UserEmailDuplicateException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public ErrorDto duplicateEmail(Exception e){
        return new ErrorDto(e.getMessage());
    }

    @ExceptionHandler
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public ErrorDto wrongEmailOrPassword(UserEmailOrPasswordWrongException e){
        return new ErrorDto(e.getMessage());
    }
}                                             1번

 

@RestControllerAdvice(basePackages = "com.example.league.controller")
public class UserControllerAdvice {

    @ExceptionHandler(UserEmailDuplicateException.class)
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public ErrorDto duplicateEmail(Exception e){
        return new ErrorDto(e.getMessage());
    }

    @ExceptionHandler
    @ResponseStatus(HttpStatus.BAD_REQUEST)
    public ErrorDto wrongEmailOrPassword(UserEmailOrPasswordWrongException e){
        return new ErrorDto(e.getMessage());
    }
}                                             2번

 

 

@RestControllerAdvice : 자신이 관리하는 Controller에 대한 예외가 터졌을 때 예외를 처리해줍니다.

  • RestControllerAdvice 속성: @Annotation 설정, 구체적인 클래스 설정, 패키지 설정이 가능합니다. 1번 예시는 구체적인 클래스를 지정하여한 것입니다. 2번 예시는 패키지로 설정한 것입니다. 

@ExecptionHandler: () 파라미터로 구체 예외 클래스를 줘도 무방하고, 메서드 자체에 구체 예외 클래스를 줘도 됩니다.

 

@ResponseStatus: @ResponseEntity에서 따로 HttpStatus만 떼내어 사용한다고 볼 수 있습니다. 상황에 맞는 HttpStatus를 보내주시면 됩니다. 예제의 간단화를 위해서 오류 코드의 번호대인 400으로 다 통일하였습니다.

 

4. Postman으로 Test를 해보겠습니다.

url -> http://localhost:8080/signup이며 
UserDto에 대한 필드 정보를 담아줍니다. 

  json 형식 표기법은 링크에서 확인 가능합니다. https://dingdingmin-back-end-developer.tistory.com/entry/Postman-%EC%84%A4%EC%B9%98%EC%99%80-%EC%82%AC%EC%9A%A9%EB%B2%95

 

Postman 설치와 사용법

Postman이란? API 개발을 빠르게 만들 수 있고, 이미 개발이 완성된 프로젝트에 대하여 Test가 가능합니다. Test를 위해 다양한 기능을 제공합니다. (다양한 종류의 Request, Header, Session 등등) Postman 설치

dingdingmin-back-end-developer.tistory.com

회원가입이 성공하여 ok가 온 것을 확인할 수 있습니다. 여기서 같은 eamil로 똑같이 보냈을 때 에러 메시지가 오는지 확인해보겠습니다. 

 

앞서 설정한 예외 메시지와 오류 상태 코드인 400이 온 것을 확인할 수 있습니다. login도 위의 방법과 같이 진행해주시면 됩니다. Restful API에 관한 오류 처리는 RestControllerAdvice와 ExceptionHandler로 처리하는 것을 해봤습니다. 감사합니다. 

 

모든 코드는 아래 링크에서 확인 가능합니다. 

https://github.com/rlaehdals/blogProject

 

GitHub - rlaehdals/blogProject

Contribute to rlaehdals/blogProject development by creating an account on GitHub.

github.com