[스프링 부트 공부 일지] 3. 스프링에서 REST API 개발하기 (2)

2022. 12. 16. 20:28·공부/Spring Boot

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
'공부/Spring Boot' 카테고리의 다른 글
  • [스프링 부트 공부 일지] 4. 웹 어플리케이션 서버 구축하기 (1)
  • [스프링 부트 공부 일지] 3. 스프링에서 REST API 개발하기 (3)
  • [스프링 부트 공부 일지] 3. 스프링에서 REST API 개발하기 (1)
  • [스프링 부트 공부 일지] 2. 스프링 웹 MVC
뚝딱뚝딱2
뚝딱뚝딱2
  • 뚝딱뚝딱2
    개발도상국
    뚝딱뚝딱2
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 공부
        • Java
        • Spring Boot
        • LORA
      • Web
        • 인스타 클론 코딩
        • GPT 응답 API 서버
        • Spring Boot 예외 처리
        • 코테 준비용 서비스 만들기
      • DevOps
        • 쿠버네티스
        • 서버 만들기
      • 코딩테스트
        • 알고리즘
      • 교육
        • 스파르타코딩클럽 - 내일배움단
        • 혼자 공부하는 컴퓨터 구조 운영체제
      • 잡다한것
  • 블로그 메뉴

    • 홈
  • 링크

    • GITHUB
  • 공지사항

  • 인기 글

  • 태그

    클론코딩
    티스토리챌린지
    쿠버네티스
    Entity
    Java
    mapstruct
    spring boot
    REST API
    MSA
    인스타그램
    예외
    리액트
    백준
    오블완
    chat GPT
    클러스터
    react
    스프링부트
    스프링 부트
    OpenAI API
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
뚝딱뚝딱2
[스프링 부트 공부 일지] 3. 스프링에서 REST API 개발하기 (2)
상단으로

티스토리툴바