Representation Model

ResourceSupport์˜ ๋ฐ”๋€ ํด๋ž˜์Šค๋กœ ๊ฐ์ฒด์— ๋งํฌ์ •๋ณด๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด ์ง€์›ํ•˜๋Š” ํด๋ž˜์Šค

์‚ฌ์šฉ๋ฒ•

public class EventResource extends RepresentationModel<EventResource> {
    private Event event;

    public EventResource(Event event) {
        this.event = event;
    }

    public Event getEvent() {
        return event;
    }
}

์™€ ๊ฐ™์ด RepresentaionModelํด๋ž˜์Šค๋ฅผ ์ƒ์†๋ฐ›๋Š” ํด๋ž˜์Šค๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค๊ณ  controller์—์„œ ์ƒˆ๋กœ๋งŒ๋“  ํด๋ž˜์Šค์— ๋งํฌ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์‚ฌ์šฉ

//controller์•ˆ์˜ ์–ด๋Š ๋ฉ”์„œ๋“œ ์•ˆ์˜ ์ฝ”๋“œ

EventResource eventResource = new EventResource(event);
eventResource.add(linkTo(EventController.class).withRel("query-events"));

์ด๋ ‡๊ฒŒ ๋งŒ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด returnํ• ๋•Œ EventResource๋ฅผ returnํ•˜๊ณ  ์ด๋ฅผ Object Mapper๊ฐ€ Serialization์„ ํ• ๋•Œ Bean Serialize๋ฅผ ์“ฐ๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ์ฒด๋‚ด์˜ ํ•„๋“œ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ๊ทธ ํ•„๋“œ(Event)๋Š” compose ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌํ•„๋“œ๋“ค์— ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋กœ ๋ฌถ๊ณ  ๋งํฌ๋ฅผ ๋”ฐ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ responseํ•œ๋‹ค.

{
  "event": {
    "id": 1,
    "name": "Spring",
    "description": "rest api practice",
    "beginEnrollmentDateTime": "2020-10-28T17:24:00",
    "closeEnrollmentDateTime": "2020-11-28T17:33:00",
    "beginEventDateTime": "2020-11-20T17:53:00",
    "endEventDateTime": "2020-12-20T17:01:00",
    "location": "๊ฐ•๋‚จ์—ญ",
    "basePrice": 100,
    "maxPrice": 200,
    "limitOfEnrollment": 100,
    "offline": true,
    "free": false,
    "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"
    }
  }
}

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

  • ํ•„๋“œ(๋„๋ฉ”์ธ)์— @JsonUnwrapped์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์—ฌ ์ค€๋‹ค.

public class EventResource extends RepresentationModel<EventResource> {

    @JsonUnwrapped
    private Event event;

    public EventResource(Event event) {
        this.event = event;
        add(linkTo(EventController.class).slash(event.getId()).withSelfRel()); //self link
    }

    public Event getEvent() {
        return event;
    }
}
  • RepresentationModel๊ฐ€ ์•„๋‹Œ EntityModel๋ฅผ ์ƒ์†

    ๋‚ด๋ถ€์ ์œผ๋กœ RepresentationModel์„ ์ƒ์† ๋ฐ›๊ณ  ์žˆ์œผ๋ฉฐ @JsonUnwrapped ๋˜ํ•œ ์„ ์–ธ์ด ๋˜์–ด์žˆ๋‹ค.

public class EventResource extends EntityModel<Event> {

    public EventResource(Event event, Link... links){
        super(event,links);
        add(linkTo(EventController.class).slash(event.getId()).withSelfRel()); //self link
    }
}

๊ทธ๋Ÿฌ๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ํ•œ ๊ฐ์ฒด ์•ˆ์— ํ‘œ์‹œ๊ฐ€ ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

{
  "id": 1,
  "name": "Spring",
  "description": "rest api practice",
  "beginEnrollmentDateTime": "2020-10-28T17:24:00",
  "closeEnrollmentDateTime": "2020-11-28T17:33:00",
  "beginEventDateTime": "2020-11-20T17:53:00",
  "endEventDateTime": "2020-12-20T17:01:00",
  "location": "๊ฐ•๋‚จ์—ญ",
  "basePrice": 100,
  "maxPrice": 200,
  "limitOfEnrollment": 100,
  "offline": true,
  "free": false,
  "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"
    }
  }
}

Last updated