POST, PUT 메서드
- 서버에 데이터를 생성 할 때는 POST 메서드, 데이터를 수정 할 때는 PUT 메서드를 사용한다.
- 클라이언트는 요청 할 때, 데이터를 HTTP 바디에 포함하여 전달한다.
1. 호텔 객실 데이터 생성 API 명세서
# REST-API 요청
POST /hotels/{hotelId}/rooms
{
"roomNumber" : "West-Wing-3928",
"roomType" : "double",
"originalPrice" : "150.00"
}
# REST-API 응답
- [HEADER] X-CREATED-AT : yyyy-MM-dd'T'HH:mm:ssXXX
{
"id":"1201928183"
}
2. Controller 추가
@RestController
@Slf4j
public class HotelRoomController {
private static final String HEADER_CREATED_AT = "X-CREATED-AT";
private final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssXXX");
...
@PostMapping("/hotels/{hotelId}/rooms")
public ResponseEntity<HotelRoomIdResponse> createHotelRoom(@PathVariable Long hotelId, @RequestBody HotelRoomRequest hotelRoomRequest) {
log.info(hotelRoomRequest.toString());
MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
headers.add(HEADER_CREATED_AT, DATE_FORMATTER.format(ZonedDateTime.now()));
HotelRoomIdResponse body = HotelRoomIdResponse.from(1_002_003_004L);
return new ResponseEntity(body, headers, HttpStatus.OK);
}
}
- 이것도 마찬가지로 DB와 연동되지 않았기에 단순 요청 로그를 서버에 남기고, 처리값을 클라이언트에 반환해준다.
- ResponseEntity 객체는 HTTP body, header, status 세가지 값을 같이 클라이언트에 반환해주는 객체이다.
- body에는 HotelRoomResponse객체에 방 Id를 지정하여 담고,
header에는 키값 'X-CREATED-AT'에 요청을 받은 시간을 담은뒤, 요청이 성공했음을 의미하는 HttpStatus.OK를 넣어준다.
3. 결과
# Room 생성 요청
curl -X POST "http://localhost:8080/hotels/129/rooms" -H "accept: application/json;charset=UTF-8" -H "Content-Type: application/json;charset=UTF-8" -d "{ \"originalPrice\": 0, \"roomNumber\": \"string\", \"roomType\": \"double\"}"
# REST-API 응답
{
"id": "1002003004"
}
- 다음과 같이 요청했을 때, 서버에서 처리후 생성된 방의 Id 값을 반환해준다.
ResponseEnity, Pageable 클래스
- 앞으로 자주 쓰게 될, ResponseEntity, Pageable 클래스에 대하여 자세히 알아본다.
1. ResponseEntity
- 명세서에 나와있듯이 클라이언트에 반환할때는 Body값에 결과 데이터, Header에 포함될 메세지, 또 요청 결과의 처리에 대한 상태코드를 같이 보내주여야 하는데 ResponseEntity객체를 사용하게 되면 스프링 MVC 프레임워크가 이를 사용하여 응답메세지를 알맞게 만들어준다.
- ResponseEntity의 헤더 : MultiValueMap 객체를 사용하여 헤더에 값을 추가 할 수 있다.
- ResponseEntity 상태코드 : HttpStatus.OK와 같은 열거형 클래스를 사용한다.
2. Pageable
- 여러 개의 객체를 리스트로 응답하는 조회 API의 경우, 한 페이지가 포함하는 객체의 수, 정렬조건과 페이지 번호를 파라미터로 전달 했을 경우, 그 범위에 맞게 데이터를 조회하여 응답하는 기능을 뜻한다.
- 예약 정보를 조회하는 API 설계
# REST-API 요청
GET /hotels/{hotelId}/rooms/{roomNumber}/reservations
- page : 페이지 번호, 0부터 시작
- size : 페이지당 포함할 예약 정보의 갯수. 기본값 20
- sort : 정렬 정보. 정렬 프로퍼티의 이름과 방향 키워드를 같이 사요앟며 콤마로 구분한다.
- 방향 키워드로 순차 정렬을 의미하는 ASC, 역순 정렬을 의미하는 DESC를 사용한다.
- e.g. reservationId, asc
- e.g. reservationDate, desc
- Controller 설계
@RestController
@Slf4j
public class ReservationController {
@GetMapping("/hotels/{hotelId}/rooms/{roomNumber}/reservations")
public List<Long> getReservationsByPaging(@PathVariable Long hotelId, @PathVariable String roomNumber,
Pageable pageable) {
log.info("Param param : {}", pageable.getPageNumber());
log.info("Size param : {}", pageable.getPageSize());
pageable.getSort().stream().forEach(order -> {
log.info("Sort param : {} : {}", order.getProperty(), order.getDirection());
});
return Collections.emptyList();
}
}
- getReservationByPaging 함수의 파라미터로 Pageable 객체를 받아주면 스프링 부트에서 알아서 처리해준다.
- Pageable에서 사용하는 변수에 대한 설정은 application.yml에서 설정해 줄 수 있다.
spring:
data:
web:
pageable:
page-parameter: pageNumber // page 번호 파라미터 이름
size-parameter: pageSize // page 최대 객체 수를 지정하는 파라미터 이름
default-page-size: 20
max-page-size: 2000
one-indexed-parameters: false
sort:
sort-parameter: sortOrder // 정렬에 관련된 정보를 지정하는 파라미터 이름
- 결과
# REST-API 요청
http://localhost:8080/hotels/912/rooms/west-wing-2012/reservations?pageNumber=1&pageSize=50&sortOrder=reservationId,desc&sortOrder=reservationDate,desc
# REST-API 응답
[]
'공부 > Spring Boot' 카테고리의 다른 글
[스프링 부트 공부 일지] 4. 웹 어플리케이션 서버 구축하기 (1) (0) | 2022.12.21 |
---|---|
[스프링 부트 공부 일지] 3. 스프링에서 REST API 개발하기 (3) (0) | 2022.12.17 |
[스프링 부트 공부 일지] 3. 스프링에서 REST API 개발하기 (1) (0) | 2022.12.16 |
[스프링 부트 공부 일지] 2. 스프링 웹 MVC (0) | 2022.12.15 |
[스프링 부트 공부 일지] 1. 스프링 애플리케이션 (0) | 2022.12.15 |