Hello World

[Spring] HATEOAS 사용하기 본문

Spring/Boot(4.x)

[Spring] HATEOAS 사용하기

EnterKey 2016. 1. 14. 18:13
반응형

1. HATEOAS(Hypermedia As The Engine Of Application State)

  HATEOAS는 RESTful API를 사용하는 클라이언트가 전적으로 서버에 의해 동적으로 상호작용을 할 수 있다.  쉽게 말하면 클라이언트가 서버에 요청시 서버는 요청에 의존되는 URI를 Response에 포함시켜 반환한다. 

  예를들면 사용자정보를 입력(POST)하는 요청 후 사용자를 조회(GET), 수정(PUT), 삭제(DELETE)할 수 있는 URI를 동적으로 알려주게 되는 것이다. 이렇게 동적으로 모든 요청에 의존되는 URI 정보를 보여준다면 아래와 같은 장점이 있을 것이다.

  1. 요청 URI정보가 변경되어도 클라이언트에서 동적으로 생성된 URI를 사용한다면, 클라이언트 입장에서는 URI 수정에 따른 코드 변경이 불필요하다.
  2. URI정보를 통해 의존되는 요청을 예측가능하게 한다. 
  3. 기본 URI정보가 아니라 resource까지 포함된 URI를 보여주기 때문에 resource에 대한 확신을 갖게된다.
RESTful에 대한 설명은 생략되어 있기 때문에 RESTful에 대한 이해가 없다면 위 내용이 이해가 안될수 있다.

2. Spring HATEOAS
  Spring에서는 HATEOAS를 사용하기 쉽게 이미 만들어놨다.
Spring에서 제공하는 HATEOAS 템플릿 프로젝트

3. 예제

Maven
1
2
3
4
5
<dependency>
      <groupid>org.springframework.hateoas</groupid>
      <artifactid>spring-hateoas</artifactid>
      <version>0.15.0.RELEASE</version>
</dependency>
Resources
1
2
3
4
5
class PersonResource extends ResourceSupport {
  int id;
  String firstname;
  String lastname;
}

HATEOAS를 사용하기 위해서는 DTO객체에 org.springframework.hateoas.ResourceSupport 클래스를 상속받아야한다.


Resources에 link 추가

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
PersonResource resource = new PersonResource();
resource.id = 1;
resource.firstname = "Lee";
resource.lastname = "Woniper";
resource.add(new Link("http://localhost:8080/person"));
 
//   결과
//{
//  id:1,
//  firstname : "Lee",
//  lastname : "Woniper",
//  links : [
//        { rel : "self",
//          href : "http://localhost:8080/person" }
//    ]
//}

ResourceSupport클래스를 상속받아야만 Link를 add할 수 있다. 


Controller
1
2
3
4
5
6
@Controller
@RequestMapping(value="/hateoas")
public class HATEOASController {
     ...
     ...
}
위와같은 Controller가 존재한다고 가정하자. 

Link 생성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
PersonResource resource = new PersonResource();
resource.id = 1;
resource.firstname = "Lee";
resource.lastname = "Woniper";
 
// 1. 기본 URI
Link link = linkTo(HATEOASController.class).withRel("manager");
resource.add(link);
//   결과
//{
//  id:1,
//  firstname : "Lee",
//  lastname : "Woniper",
//  links : [
//        { rel : "manager",
//          href : "http://localhost:8080/hateoas" }
//    ]
//}
 
 
// 2. Resource 추가 URI
Link resourceLink = linkTo(HATEOASController.class).slash(person.id).withRel("manager");
resource.add(resourceLink);
//   결과
//{
//  id:1,
//  firstname : "Lee",
//  lastname : "Woniper",
//  links : [
//        { rel : "manager",
//          href : "http://localhost:8080/hateoas/1" }
//    ]
//}
 
// 3. URI List
List<link> list = new ArrayList<>();
list.add(new Link("http://localhost:8080/test1"));
list.add(new Link("http://localhost:8080/test2"));
list.add(new Link("http://localhost:8080/test3"));
resource.add(list);
//   결과
//  id:1,
//  firstname : "Lee",
//  lastname : "Woniper",
//  links: [
//     0:  { rel: "self",
//             href: "http://localhost:8080/test1"
//           }
//     1:  { rel: "self"
//             href: "http://localhost:8080/test2"
//           }
//     2:  { rel: "self"
//             href: "http://localhost:8080/test3"
//           }
//     ]
 
// 4. Method URI
// Method에 URI를 직접선택할 수 있다.
Link methodLink = ControllerLinkBuilder.linkTo(ControllerLinkBuilder.methodOn(HATEOASController.class).getPerson(2L)).withSelfRel();
resource.add(methodLink);
//   결과
//  id:1,
//  firstname : "Lee",
//  lastname : "Woniper",
//  links: [
//           { rel: "self",
//             href: "http://localhost:8080/hateoas/person/2"
//           }


출처: http://blog.woniper.net/219

반응형
Comments