[데브코스] Spring Rest API 1
Updated: Categories: TILW5D3 Part2 - Rest API 정의와 Http Message Converter에 대해 알아보자!
Rest API
- Representational State Transfer
- 균일한 인터페이스
Richardson Maturity Model
- Restful한 수준에 등급을 매긴것
Level 0
: URL 매핑을 통해 xml을 전달하는 방식 (리소스가 없음)Level 1
: 리소스를 중심으로 URL을 설계 -> 하나의 리소스에 대해 다양한 타입의 데이터를 제공할 수 있어야 한다
Level 1 - 메타데이터를 통해 다양한 타입을 제공
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 설계
- URL은 정보의 자원을 표현한다. (동사X 명사O)
- 자원에 대한 행위는 HTTP Method로 표현
/
는 계층 관계를 나타낸다- URL 마지막에
/
를 포함하지 않는다 - URI 가독성을 위해선
-
을 사용 (_
사용은 지양) - 행위 표현은 URI 마지막에서 표현한다.
Http Message Converter
- 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을 사용하자!
컨트롤러 옆에 저거 눌러주면
요렇게 API 요청을 보낼수 있다
Accept
: API가 받는 데이터 타입Content-Type
: API가 보내는 데이터 타입