[데브코스] Spring Rest API 1

Updated: Categories:

W5D3 Part2 - Rest API 정의와 Http Message Converter에 대해 알아보자!

Rest API

  • Representational State Transfer
  • 균일한 인터페이스

Richardson Maturity Model

  • Restful한 수준에 등급을 매긴것

image

  • Level 0 : URL 매핑을 통해 xml을 전달하는 방식 (리소스가 없음)
  • Level 1 : 리소스를 중심으로 URL을 설계 -> 하나의 리소스에 대해 다양한 타입의 데이터를 제공할 수 있어야 한다
Level 1 - 메타데이터를 통해 다양한 타입을 제공

image

  • Level 2 : 목적에 맞는 HTTP Method를 사용하는 것. 자세한건 -> (🚀 포스팅 이동)
  • Level 3 : HATEOAS(Hypermedia as the Engine of Application State)를 사용하는것
HATEOAS : 리소스를 통해 컨트롤 가능한 '행위'까지 제공한다.
{
    "id": "1",
    "contents": "공부합시다.",
    "createAt": "2020-01-01 12:00:00",
    "likes": 2,
    "likesOfMe": false,
    "comments": [],
    "writer": { "id": "2", "email": "harry@gmail.com", "name": "harry" },
    "links": [
        {"rel": "self", "action": "GET", "href": "/api/v1/posts/1"},
        {"rel": "deletePost", "action": "DELETE", "href": "/api/v1/posts/1" },
        {"rel": "getWriter", "action": "GET", "href": "/api/v1/users/1" },
        {"rel": "addComment", "action": "POST", "href": "/api/v1/posts/1/comments"}
    ]
}

API 설계

  1. URL은 정보의 자원을 표현한다. (동사X 명사O)
  2. 자원에 대한 행위는 HTTP Method로 표현
  3. /는 계층 관계를 나타낸다
  4. URL 마지막에 /를 포함하지 않는다
  5. URI 가독성을 위해선 -을 사용 (_ 사용은 지양)
  6. 행위 표현은 URI 마지막에서 표현한다.


Http Message Converter

image

  • HTTP 요청, 응답을 자바에서 바로 처리할 수 없기 때문에 메시지 컨버터를 통해 파싱(?)하는 과정을 거친다.
  • Contents Type을 통해 메시지 컨버터의 동작 여부를 정한다!

의존성 설정

  • pom.xml 의존성 추가
<!-- Spring oxm -->
<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-oxm</artifactId>
</dependency>

<!-- xstream -->
<dependency>
	<groupId>com.thoughtworks.xstream</groupId>
	<artifactId>xstream</artifactId>
	<version>1.4.17</version>
</dependency>

Converter 적용

@ResponseBody
@RequestBody

Converter 변경

  • 컨버터의 default 형식은 json이지만 servlet app context에서 변경할 수 있음
  • configureMessageConverters 메소드를 Servlet App Context Config 클래스에 등록하고 내부를 구현하면됨
  • 하지만 이는 기본 컨버터를 모두 덮어씌워버린다.
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    var messageConverter = new MarshallingHttpMessageConverter();
    var xStreamMarshaller = new XStreamMarshaller();
    // java -> xml
    messageConverter.setMarshaller(xStreamMarshaller);
    // xml -> java
    messageConverter.setUnmarshaller(xStreamMarshaller);
    // 기존 컨버터에 설정한거 추가
    converters.add(messageConverter);
}

Converter 추가, 시간형식 변경

  • 컨버터를 덮어씌우지 않고 추가하려면 extendMessageConverters 메소드를 사용하면 된다.
  • 또 json으로 출력되는 형식도 변경이 가능하다.
    • 아래는 시간 출력형식을 변경하는 예제
똑같이 Config에 등록
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
    ...위와동일...
    // 추가 컨버터를 우선순위 0으로 추가
    converters.add(0, messageConverter);

    // json 시간 출력형식 변경
    var javaTimeModule = new JavaTimeModule();
    javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormattISO_DATE_TIME));
    var modules = Jackson2ObjectMapperBuilder.json().modules(javaTimeModule);
    converters.add(1, new MappingJackson2HttpMessageConverter(modules.build()));
}
  • json 형식 변경할 때 Jackson2ObjectMapper을 주로 쓴다고 함


Intellij로 Rest API 테스트하기

  • Intellij에서 Postman처럼 API 테스트 툴을 제공한다 (없는게 뭐야?)
    • But 테스트 양이 많아지면 Postman을 사용하자!
컨트롤러 옆에 저거 눌러주면

image

요렇게 API 요청을 보낼수 있다

image

  • Accept : API가 받는 데이터 타입
  • Content-Type : API가 보내는 데이터 타입