@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 가지 정보를 제공해야하는데..
- 상태코드와
- 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 생성
ResponseEntity
의created
의 상태 코드와 함께 Location 헤더를 설정한다.
Uploaded by N2T
'자바 > 리팩토링' 카테고리의 다른 글
엔티티안의 내부 클래스 (0) | 2024.02.19 |
---|---|
[프로젝트] Springcloud Open Feign 으로 주소 API 를 호출해보자 (0) | 2024.02.13 |
[이벤트 리스너] @TransactionalEventListener (0) | 2024.02.07 |
__mysql 5.7 에서 H2 1.4.200 호환을 위한 SCHEMA 수정__ (0) | 2024.02.07 |
@MybatisTest 클래스 레벨의 @Sql 이 수행되지 않는 경우 (0) | 2024.02.06 |