[프로젝트] 주문 생성시 Location 헤더와 HTTP 상태코드 201 Created 를 반환하는 건 어떨까?

@PreAuthorize("hasRole('ROLE_CUSTOMER')")
@PostMapping("/v1/api/orders")
public MessageDTO createOrder(@ModelAttribute OrderPageRequestDTO orderPageRequestDTO, @CurrentUser Jwt jwt) {
    log.info("createOrder orderPageRequestDTO : {}", orderPageRequestDTO);

    UserDetailsServiceImpl.CustomUserDetails customUserDetails = userDetailsService.loadUserByJwt(jwt);

    Member member = Member.from(customUserDetails.getMemberResponseDTO());

    orderService.createOrder(member, orderPageRequestDTO);

    return new MessageDTO("Order has been created.");
}
  • 기존의 코드에서 단순히 created 가 되었다고 알려주는 것만으로는 정보가 너무 부족한 상황이다.
  • 해당 반환되는 코드의 내역을 수정해야한다.
    • 일단 RESTful API 설계에서 새로운 리소스를 생성하는 행위는 일반적으로 POST 요청을 통해 이루어진다.
    • 해당 과정에서 서버는 클라이언트에게 리소스 생성 성공을 알리는 중요한 2 가지 정보를 제공해야하는데..
      1. 상태코드와
      1. Location 헤더이다.

상태코드

201 Created - HTTP | MDN (mozilla.org)

  • 201 Created 상태코드
    • 클라이언트의 요청이 성공적으로 처리되어 새로운 리소스가 생성되었음을 나타내는 코드이다.
    • 해당 상태코드는 응답과 함께 리소스의 URI 를 포함하는 Location 헤더를 제공하는 것이 일반적이라고 합니다.

Location 헤더

  • 생성된 리소스의 위치를 나타내는 URI 을 포함한다.
  • 클라이언트는 해당 URI 를 사용하여 생성된 리소스에 접근, 혹은 후속 요청이 가능함.

스프링에서 201 Created + Location 헤더 반환법

@PreAuthorize("hasRole('ROLE_CUSTOMER')")
@PostMapping("/v1/api/orders")
public ResponseEntity<OrderResponseDTO> createOrder(@ModelAttribute OrderPageRequestDTO orderPageRequestDTO,
	@CurrentUser Jwt jwt) {
	log.info("createOrder orderPageRequestDTO : {}", orderPageRequestDTO);

	UserDetailsServiceImpl.CustomUserDetails customUserDetails = userDetailsService.loadUserByJwt(jwt);

	Member member = Member.from(customUserDetails.getMemberResponseDTO());

	OrderResponseDTO createdOrder = orderService.createOrder(member, orderPageRequestDTO);

	// 생성된 주문의 상세 정보를 조회할 수 있는 URI 생성 - 201 반환
	URI location = ServletUriComponentsBuilder.fromCurrentRequest()
		.path("/{id}")
		.buildAndExpand(createdOrder.getId())
		.toUri();

	return ResponseEntity.created(location).build();
}
  • ServletUriComponentsBuilder 를 사용하여 생성된 주문의 상세정보를 조회할 수 있는 URI 생성
  • ResponseEntitycreated 의 상태 코드와 함께 Location 헤더를 설정한다.


Uploaded by N2T