만약 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에 없으므로 데이터를 가지지 않는다.