레알윙 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 (목록으로 가는 링크)

 

 

반응형