ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 이벤트 생성 API 개발 -2
    백기선(인프런 강의)/스프링 기반 REST API 개발 2021. 1. 23. 16:52
    반응형

    공부중인 GIT 주소

     

    위 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
Designed by Tistory.