제 11장. HTTP와 REST 컨트롤러

강연주·2023년 10월 15일
0

REST API란?

REST란, HTTP URL로 서버의 자원(resources)를 명시하고, HTTP 메서드(POST,GET,PATCH/PUT,DELETE)로 해당 자원에 대해 CRUD(생성,조회,수정,삭제)하는 것을 말합니다.
API란, 클라이언트가 서버의 자원을 요청할 수 있도록 서버에서 제공하는 인터페이스입니다.

결국, REST API란 REST 기반 API를 구현한 것으로, 클라이언트가 기기에 구애받지 않고 서버의 자원을 이용할 수 있을 뿐만 아니라, 서버가 클라이언트 요청에 체계적으로 대응할 수 있어서 서버 프로그램의 재사용성과 확장성이 좋아집니다.

REST API URL 설계 과정

REST API를 구현하려면 REST API의 주소, 즉 URL을 설계해야 합니다.
URL 설계 규칙은 다음과 같다.

  1. 마지막에 '/'를 포함하지 않는다.
  2. _(underline) 대신 -(dash)를 사용한다.
  3. 소문자를 사용한다.
  4. 행위(method)를 URL에 포함하지 않는다.
  5. POST, GET, PUT, DELETE 4가지 methods는 반드시 제공한다.
  6. 의미에 맞는 HTTP status를 리턴한다.

참고) https://sanghaklee.tistory.com/57

앞에서 만든 Article에 대한 CRUD URL을 다음과 같이 설계할 수 있다.

  • 조회: GET /api/articles 또는 GET /api/articles/{articledId}
  • 생성: POST /api/arcitles
  • 수정: PUT /api/articles/{articleId}
  • 삭제: DELETE /api/articles/{articleId}

이제 해당 URL 요청을 받아 그 결과를 JSON으로 반환해 줄 컨트롤러를 생성하자.

REST API 구현하기

REST 컨트롤러와 일반 컨트롤러의 차이

REST 컨트롤러는 HttpMessageConverter가 JSON이나 텍스트 같은 데이터를 반환하는 반면 일반 컨트롤러는 viewResolver가 뷰 페이지를 반환합니다.

HttpMessageConverter 동작 방식
@RestController 선언 시 반환값이 문자면 StringConverter가 동작하여 문자 전달을 하고, 반환값이 객체면 JsonConverter가 동작하여 JSON 방식(default)으로 데이터를 만들어서 HTTP 응답에 반환한다!

CRUD 구현하기

  1. GET 방식

    전체 조회 결과

    단건 조회 결과
  1. POST 방식

    위와 같이 요청하면 오류가 난다. 컨트롤러는 form 태그가 실어 보낸 데이터를 객체(DTO)에 담아 받는다. 하지만 REST API에서 데이터를 생성할 때는 JSON 데이터를 받아와야 하므로 단순히 매개변수로 DTO를 쓴다고 해서 받아올 수 있는 것이 아니다. 즉, DTO 매개변수 앞에 @RequestBody라는 어노테이션을 추가해줘야 한다! 이렇게 요청하면 본문에 실어보내는 데이터를 createArticle() 메서드의 매개변수로 받아올 수 있다.

    요청과 응답

@RequestBody와 @ResponseBody
@ResquestBody 요청: JSON 요청 -> HTTP 메시지 컨버터 -> 객체
@ResponseBody 응답: 객체 -> HTTP 메시지 컨버터 -> JSON 응답
(@RestController에 @ResponseBody가 포함되어 있다.)

  1. PATCH 방식
    수정은 고려해야할 사항이 두 가지가 있다.
  • 데이터 전체 수정인지, 일부 수정인지
  • 잘못된 id 요청인지
    데이터 일부 수정이지만, patch 요청을 그냥 보내게 되면 나머지 부분은 null로 수정이 된다. 이를 위하여 Article 클래스에 patch 메서드를 만들어준다!

    잘못된 id 요청이 들어왔을 시, 400 에러를 위하여 ResponseEntitiy를 사용하자. ResponseEntity는 REST 컨트롤러의 API 응답을 위해 사용하는 클래스이다. 응답 시, HTTP 상태코드, 헤더, 본문을 실어보낼 수 있다.
    HttpStatus는 HTTP 상태 코드를 관리하는 클래스로, 상태코드 200은 HttpStatus.OK, 201은 HttpStatus.CREATED, 400은 HttpStatus.BAD_REQUEST를 의미한다.

    위 코드는 두 가지 고려사항을 모두 적용한 updateArticle 메소드이다.
    오류(id 존재 X) 요청과 응답

    전체 수정 요청과 응답

    일부 수정 요청과 응답
  1. DELETE 방식

    삭제 요청과 응답
profile
백엔드 개발자 준비중

0개의 댓글