[REST API] Post method 개선 - 올바른 HTTP Status Code와 Location URL 설정

민지·2024년 3월 13일
0

REST API - Spring Boot

목록 보기
9/27

REST API의 다양한 response 상태

  • 404 -> Resource is not found (ex- 존재하지 않는 url 반환)
  • 500 -> Server Exception
  • 400 -> Validation error
  • 201 -> Created (ex - POST 요청으로 새 리소스 생성했을 때)
    이렇게 다양한 HTTP response status code (response 상태 코드)가 존재한다.

해야 할 일

REST API를 구현할 때는, 적절한 http status code를 반환하는 것이 중요하다.
하지만, 바로 앞 포스팅의 실행결과에서는, POST method 성공 시 얻어야 할 응답상태는 201인데, 200(spring에서 기본으로 제공해주는 상태코드)가 뜬 것을 확인할 수 있었다 ‼️

이번 포스팅에서 올바른 http response status code를 리턴할 수 있도록 코드를 짜주자!

ResponseEntity를 이용해, createUser 메서드 리팩토링

ResponseEntity 클래스의 다양한 메서드


response status code에 맞게 메서드가 여러 개 있고, 그 중에서 필요한 response status 관련 메서드를 사용하면 된다.

코드ing - ResponseEntity클래스로 http response status code 추가

	// POST /users
	@PostMapping("/users")
	public ResponseEntity<User> CreateUser(@RequestBody User user) {
		service.save(user);

		return ResponseEntity.created(null).build();
	}

빌더를 이용해 CREATED statuc code(201)를 생성했다.

그 결과,

하지만 아직 코드를 개선할 사항은 남아있다. 코드를 개선할 때는 항상 API 사용자 입장에서 생각해야 한다. 만일, REST API 사용자가 create user를 하려고 한다.
user resource가 추가되면 201 response status code를 반환하는 건 이미 만들었는데, 새로 추가된 user resource의 정보만 반환해서 REST API 사용자에게 보여줄 수는 없을까?

예를 들어, 추가된 /users/4의 정보만 반환해줄 수는 없을까?

코드end - location 헤더

	@PostMapping("/users")
	public ResponseEntity<User> CreateUser(@RequestBody User user) {

		User savedUser = service.save(user);
		// /users/4 => /users/{id}, user.getID
		URI location = ServletUriComponentsBuilder.fromCurrentContextPath()

				.path("/{id}").buildAndExpand(savedUser.getId()).toUri();

		return ResponseEntity.created(location).build();
	}

보통 생성된 resource의 URL을 반환할 때 사용하는 HTTP 헤더location 헤더를 사용한다!
또한, ResponseEntity의 created메서드는 URL location헤더를 매개변수로 받을 수 있다.


/users/4 => /users/{id}, user.getID
/users 부분을 pick up하고, 거기야 /{id}를 append하고, id부분에는 user.getID 부분이 들어가야 한다.

fromCurrentContextPath() → 현재 request의 url을 반환해준다. 즉 /users를 반환
path() → 현재 url에 /{id} url를 append시키고,
buildAndExpand로 path parameter값을 추가된 유저의 id로 replace시키고,
toUri() → URI 클래스 형태로 반환시켜준다

실행결과 확인


POST method로 정적 데이터 값 3개를 가진 User에서 데이터값을 user resource 1개를 추가한 결과,

  • 201 http response status code 반환 성공
  • location 헤더 생성 -> 해당 URL에 들어가면 /users/4 사용자 정보를 조회할 수 있다!




참고 및 출처
이 시리즈는 Udemy 강의의 내용을 정리한 것입니다.
https://www.udemy.com/course/spring-boot-and-spring-framework-korean/

profile
배운 내용을 바로바로 기록하자!

0개의 댓글