서버에서 200번 코드를 받았다는 것은 정상적인 처리가 되었다는 의미이다.
그러나 GET이라는 메서드와 POST라는 메서드는 용도가 다르기 때문에 응답코드도 구분해서 사용하면 좋다.
응답코드값을 ServletURIComponentBuild클래스를 이용하여 서버에서 반환시켜주려고 하는 데이터를 ResponseEntitiy에 담아 반환시켜주도록 해보려고 한다. 그리고 요청된 사용자를 추가하는 작업 완료 후 어떤 URI를 가지고 추가정보를 확인할 수 있는지 반환해보도록 한다.
//POST 웹 브라우저에서 실행 가능 : html, js, jquery 등 필요
@PostMapping("/users")
public ResponseEntity<User> createUser(@RequestBody User user){
User savedUser = service.save(user);
URI location = ServletUriComponentsBuilder.fromCurrentRequest()
.path("/{id")
.buildAndExpand(savedUser.getId())
.toUri();
return ResponseEntity.created(location).build();
}
먼저 Controller에서 createUser 메서드를 수정해준다.
그 후 postman에서 새로 사용자를 추가하고 코드를 확인해보면 201번 created 코드를 볼 수 있다.
[ HTTP Status Code 제어를 위한 Exception Handling ]
이번에는 RESTful Services 에서 예외처리를 하는 방식에 대해 알아보려고 한다.
이전에 다루었던 전체조회,상세조회,새로운 사용자 등록에 대해 알아보았는데 응용하는 방법에 대해 자세하게 다뤄볼 예정이다.
Postman에서 존재하지 않는 사용자 아이디 100번을 입력하여 반환시켜보면 null값이 나오지만 200번 코드로 처리된 것을 확인 할 수 있다.
데이터베이스에서 존재하지않는 데이터를 처리하는 것은 서버측의 문제가 아니기 때문에 프로그램 실행에는 문제가 없다는 의미인 200번 코드를 전달해버린 것이다.
이는 적절하지 않은 것 같아 예외를 발생켜보겠다.
인텔리제이에서 작업을 진행하려면 오른쪽 커서 > Refactor > Introduce Variable 혹은 Ctrl + Alt + V 단축키를 입력한다.
단축키를 입력하면 변수명을 선택할 수 있다.
변수명을 선택하면 자동으로 변환된 것을 확인 할 수 있다.
변환 후 예외처리를 위해 메서드를 수정해준다.
//GET /users/1 or /users/10 -> String 형태로 전달
@GetMapping("/users/{id}")
//사용자 1명 반환 메서드
public User retrieveUser(@PathVariable int id){
User user = service.findOne(id);
if(user == null){
throw new UserNotFoundException(String.format("ID[%s] not found",id));
}
return user;
}
아직 생성되어있지않은 UserNotFoundException클래스를 만들어준다.
package com.example.restfulwebservice.User;
public class UserNotFoundException extends RuntimeException {
public UserNotFoundException(String message) {
super(message);
}
}
이렇게 작성을 해주고 서버를 다시 시작해준다.
서버가 시작되었다면 Postman에서 예외를 발생시켜보면,
이렇게 에러코드를 확인해볼 수 있다.
서버측에 오류가 발생했다는 뜻인데 이러한 오류를 클라이언트에게 전달하는것도 적절하지 않다. 보안상의 문제도 있을 뿐더러 적절하지 않으므로 다른 상태로 전달하는 것에 대해 작업을 해보려고 한다.
클래스 위에 @ResponseStatus(HTTPStatus.NOT_FOUND) 를 달아준다.
서버를 재시작하고 다시 Postman에서 확인을 해보면
이렇게 404에러메시지를 확인 해볼 수 있다.
'프로그래밍 > SPRING BOOT' 카테고리의 다른 글
[인프런 : spring-boot] DELETE-HTTP Method (0) | 2022.08.30 |
---|---|
[인프런 : spring-boot] AOP를 이용한 예외처리 (0) | 2022.08.30 |
[인프런 : spring-boot] POST-HTTP Method (0) | 2022.08.30 |
[인프런 : spring-boot] User 도메인 클래스 생성 / GET HTTP Method (0) | 2022.08.30 |
[인프런 : spring-boot] Path Variable 사용 (0) | 2022.08.30 |