[Spring] Exception 2

HOJUN·2024년 6월 6일

Backend - Spring

목록 보기
8/34

유효하지 않은 Response

만약 user id를 주소에 포함한 상태로 response를 요청하고 싶고(그런 일은 없겠지만)
PathVariable이나 QueryParam 등으로 user의 id가 입력됐다고 가정하자.

 @GetMapping("/id/{userId}")
    public Api<UserResponse> getUser(
            @PathVariable String userId){
	var user = userList.stream()
            .filter(
                it -> it.getId().equals(userId)
            )
            .findFirst()
                .get();
                
   	Api<UserResponse> response = Api.<UserResponse>builder()
                .resultCode(String.valueOf(HttpStatus.OK.value()))
                .resultMessage(HttpStatus.OK.name())
                .data(user)
                .build();

        return response;
    }

userId는 userList에 존재하는 id를 찾아서 매핑을 시도할 것이다.
userList에 해당하는(it)Id를 가진 데이터를 찾으면(get) user에 UserResponse타입 클래스데이터를 가지고 있을 것이다.

만약 찾았다면

public class Api<T> {

    private String resultCode;

    private String resultMessage;

    private T data;

}

Api클래스의 멤버에 맞는 response를 요청할 것이다.
OK코드와 코드 이름, 찾은 user의 정보를 반환한다.
그럼 없으면 어떻게 되느냐,

var user = userList.stream()
            .filter(
                it -> it.getId().equals(userId)
            )
            .findFirst()
                .get();

유저를 찾는 과정에서 get() 메소드를 수행할 때 빈 껍데기만 내려올 것이다.

그런데 200 코드를 내리는 것으로 봐서는 제대로 된 동작은 하지 않는다.

객체 한 번에 내리기

@ExceptionHandler(value = {NoSuchElementException.class})
    public ResponseEntity<Api> noSuchElement(
            NoSuchElementException e
    ){
        log.error("NoSuchElement",e);

        var response = Api.builder()
                .resultCode(String.valueOf(HttpStatus.NOT_FOUND))
                .resultMessage(HttpStatus.NOT_FOUND.name())
                .build();

        return ResponseEntity.status(HttpStatus.NOT_FOUND).body(response);
    }

그래서 해당 Element를 찾지 못한 예외처리를 하는데
builder패턴으로 객체의 멤버를 채울 수 있다.

404 error는 어떤 주소를 찾지 못 했을 때 나타나는데
NOT_FOUND 상태와 함께 해당 response의 body를 같이 내려준다.

response 자체도 404코드와 함께 body에 메세지까지 잘 내려갔다.
물론 99라는 id는 userList에 없으므로 데이터를 가지지 않는다.

0개의 댓글