-
이벤트 생성 API 개발 -2백기선(인프런 강의)/스프링 기반 REST API 개발 2021. 1. 23. 16:52반응형
위 GIT주소에 개발 step 별로 commit 해두었다.
진행되는 과정은 아래와 같다.
1. 입력값들을 전달하면 JSON 응답으로 201이 나오는지 확인.
- Location 헤더에 생성된 이벤트를 조회할 수 있는 URI 담겨 있는지 확인.
- id는 자동생성된 값으로 나오는지 확인
2. 입력값으로 누가 id나 eventStatus, offline, free 이런 데이터까지 같이 주면?
- Bad_Request로 응답 vs 받기로 한 값 이외는 무시
3. 입력 데이터가 이상한 경우 Bad_Request로 응답
- 입력값이 이상한 경우 에러
- 비즈니스 로직으로 검사할 수 있는 에러
- 에러 응답 메시지에 에러에 대한 정보가 있어야 한다.
4. 비즈니스 로직 적용 됐는지 응답 메시지 확인
- offline과 free 값 확인
5. 응답에 HATEOA와 profile 관련 링크가 있는지 확인.
- self (view)
- update (만든 사람은 수정할 수 있으니까)
- events (목록으로 가는 링크)
6. API 문서 만들기
- 요청 문서화
- 응답 문서화
- 링크 문서화
- profile 링크 추가
5 응답에 HATEOA와 profile 관련 링크가 있는지 확인.
5-1. 스프링 HATEOAS 적용
EvnetResource 만들어 사용
extends ResourceSupport의 문제
import org.springframework.hateoas.RepresentationModel; public class EventResource extends RepresentationModel { private Event event; public EventResource(Event event) { this.event = event; } public Event getEvent() { return event; } }
{ "event":{ "id":1, "name":"Spring", "description":"Rest API Development with Spring", "beginEnrollmentDateTime":"2021-01-20T18:47:00", "closeEnrollmentDateTime":"2021-01-21T18:47:00", "beginEventDateTime":"2021-01-22T18:47:00", "endEventDateTime":"2021-01-23T18:47:00", "location":"경기ë ììì ë²ê³", "basePrice":0, "maxPrice":0, "limitOfEnrollment":200, "offline":false, "free":true, "eventStatus":null }, "_links":{ "query-events":{ "href":"http://localhost/api/events" }, "self":{ "href":"http://localhost/api/events/1" }, "update-event":{ "href":"http://localhost/api/events/1" } } }
Evnet라는 객체 안에 데이터가 존재한다. 그렇기 때문에 Serilizser를 사용하게 된다면 Event안에 데이터가 존재하여 오류가 발생이된다.(id존재 안해서)
이를 해결하기 위해서는 여러가지 방법이 존재하는데
첫째, @JsonUnwrapped를 이용하면 된다.
import com.fasterxml.jackson.annotation.JsonUnwrapped; import org.springframework.hateoas.RepresentationModel; public class EventResource extends RepresentationModel { @JsonUnwrapped private Event event; public EventResource(Event event) { this.event = event; } public Event getEvent() { return event; } }
둘째, extends Resource<T>로 해결하면 된다.
Resource안에 @JsonUnwrapped가 존재
public class EventResource extends EntityModel<Event> { /* * self link는 resource마다 설정해줘야 하므로 여기에 공통으로 추가한다. */ public EventResource(Event event, Link... links) { super(event, links); add(linkTo(EventController.class).slash(event.getId()).withSelfRel()); } }
문제점 해결 후 나온 결과
{ "id":1, "name":"Spring", "description":"Rest API Development with Spring", "beginEnrollmentDateTime":"2021-01-20T18:47:00", "closeEnrollmentDateTime":"2021-01-21T18:47:00", "beginEventDateTime":"2021-01-22T18:47:00", "endEventDateTime":"2021-01-23T18:47:00", "location":"경기ë ììì ë²ê³", "basePrice":0, "maxPrice":0, "limitOfEnrollment":200, "offline":false, "free":true, "eventStatus":null, "_links":{ "query-events":{ "href":"http://localhost/api/events" }, "update-event":{ "href":"http://localhost/api/events/1" } } }
테스트
응답에 HATEOA와 profile 관련 링크가 있는지 확인.
- self (view)
- update (만든 사람은 수정할 수 있으니까)
- events (목록으로 가는 링크)
반응형'백기선(인프런 강의) > 스프링 기반 REST API 개발' 카테고리의 다른 글
REST API 보안 적용 (0) 2021.01.24 이벤트 생성 API 개발 -3 (0) 2021.01.24 스프링 HATEOAS (0) 2021.01.23 이벤트 생성 API 개발 - 1 (0) 2021.01.22 REST API 소개 (0) 2021.01.21