[Spring] ResponseEntity로 예외 처리해보기

19·2022년 7월 21일
0

Spring

목록 보기
5/29
post-custom-banner

coco 프로젝트를 하던 중에, 예외 처리를 잘 해보라는 튜터님의 피드백이 있었다.
기존에 우리 팀은 특별한 예외처리를 해주지 않았었고, 에러가 발생하면 무조건 500 에러로 처리되고 있었다.

어떻게 예외 처리를 해주어야 할 지 이리 저리 찾아보다가 ResponseEntity라는 것을 보게 되었고 적용해보기로 했다!


변경 전

| MemberService.java

// 로그인
public LoginResponseDto login(LoginRequestDto requestDto) {
    // requestDto에 담긴 로그인 정보들이 DB에 있는지 확인
     Member findMember = memberRepository.findByEmail(requestDto.getEmail()).orElseThrow(
            () -> new IllegalArgumentException("일치하는 사용자가 없습니다.")
    );
    ...
}
  • findByEmail로 값을 얻어오면, 반환형이 Optional<Member>이기 때문에 orElseThrow로 예외를 처리해주었었다.
  • 하지만 이렇게 하면 500 에러로 처리된다.
    • 잘못된 이메일을 입력한 클라이언트의 오류인데도 500 에러로 처리

변경 후

| MemberService.java

// 로그인
public ResponseEntity<LoginResponseDto> login(LoginRequestDto requestDto) {
    // requestDto에 담긴 로그인 정보들이 DB에 있는지 확인
    Optional<Member> memberOptional = memberRepository.findByEmail(requestDto.getEmail());
    if (memberOptional.isEmpty()) {
        return new ResponseEntity<>(
                LoginResponseDto.builder().status(StatusMessage.BAD_REQUEST).build(),
                HttpStatus.valueOf(StatusCode.BAD_REQUEST)
        );
    }
    Member findMember = memberOptional.get();
    ...
}
  • Optional을 사용해 Optional로 감싸진 Member 데이터를 가져오고, 만약 유효하지 않은 값이라면 예외를 처리해준다.
  • 기존과는 다르게, 400 에러로 처리된다.

이렇게 예외를 처리해주기 위해 상태코드 / 상태메세지를 담은 클래스를 만들었다.
| StatusCode.java

public class StatusCode {
    public static final int SUCCESS = 200;
    public static final int BAD_REQUEST = 400;
    public static final int INVALID_TOKEN = 400;
    public static final int INVALID_PARAM = 400;
    public static final int UNAUTHORIZED_USER = 401;
    public static final int FORBIDDEN_USER = 403;
    public static final int DUPLICATED_USER = 409;
}

| StatusMessage.java

public class StatusMessage {
    public static final String SUCCESS = "Success";
    public static final String BAD_REQUEST = "Bad request";
    public static final String INVALID_TOKEN = "Invalid token";
    public static final String INVALID_PARAM = "Invalid param";
    public static final String UNAUTHORIZED_USER = "Unauthorized user";
    public static final String FORBIDDEN_USER = "Forbidden user";
    public static final String DUPLICATED_USER = "Duplicated user";
}

이렇게 상태코드 클래스, 상태메세지 클래스를 만들고 예외 부분에 ResponseEntity의 인자값으로 넣어 처리해주었다.

profile
하나씩 차근차근
post-custom-banner

0개의 댓글