Spring HATEOAS
Spring HATEOAS : HATEOAS를 구현하기 편리한 기능 제공
HATEOAS
Hypermedia As The Engine Of Application State
Server: 현재리소스와 ‘연관된 링크 정보’를 클라이언트에게 제공
Client: ‘연관된 링크 정보’를 바탕으로 리소스에 접근
‘연관된 링크 정보’
- Relation
- Hypertext Reference
spring-boot-starter-hateoas 의존성 추가 : 많은 것을 자동 설정, 그중 큰 2가지
- ObjectMapper 제공
- 스프링 MVC에서 객체 JSON변환시 사용하였던 바로 그것
- start-web만 의존성해도 추가가 되었음
- 웹MVC와 마찬가지로 Jackson2ObjectMapperBuilder, spring.jackson.* 등이 제공
- LinkDiscovers 제공
- 직접 사용하게 될 일은 많지 않음
- 클라이언트 쪽에서 링크 정보를 Rel 이름으로 검색가능한 XPath 확장 클래스
상세히 알려면 아래 가이드를 순서대로 볼 것
진정한 REST API 를 만들 수 있는 방법
REST API 공부할 때 다시1
CORS
SOP & CORS : 웹브라우저의 표준 기술
SOP: Single-Origin Policy
- 기본값
- 같은 Origin에만 요청을 보낼 수 있다
- 예를 들어 http://localhost:8080의 REST API를
http://localhost:10080의 어플리케이션이 호출할 수 있는가?
-> 실패 ! SOP 위배! Ajax 호출같은거 안됨 - 우회하는 기법이 Ajax 초창기에 많이 소개되었음
CORS: Cross-Origin Resource Sharing -> SOP를 우회하기 위한 표준 기술
- 서로 다른 Origin끼리 Resource를 공유 할 수 있다
- 표준, 스프링 MVC가 지원해서 포함됨
- 스프링 MVC에서 설정하려면 여러가지 빈 설정이 필요한데
스프링부트를 쓰면 자동 설정 되어 있으므로 빈 설정 없이 바로 사용 가능 - 스프링 MVC @CrossOrigin
Origin
- URI 스키마 (http, https)
- hostname(google.com, localhost)
- 포트(8080,80)
예제)
- 프로젝트 A, 프로젝트B 2개가 필요
- A프로젝트는 /hello요청시 @ResponseBody로 “hello” 문자열을 리턴하는
핸들러를 가진 컨트롤러를 만든다 - A프로젝트는 REST API 서버역할을 하며 8080포트로 실행한다
- B프로젝트는 다른포트로 하기위해서 application.properties에 server.port=18080로
설정하고 index.html을 만들고 그곳에 REST API호출을 한다 - AJax사용을 위해 jquery를 WebJar로 의존성을 추가한다
html맨 밑에 스크립트 추가. load시 자동으로 API 요청한다 1
2
3
4
5
6
7
8
9
10
11
12<script src="/webjars/jquery/3.3.1/dist/jquery.min.js"></script>
<script>
$(function(){
$.ajax("http://localhost:8080/hello")
.done(function(msg){
alert(msg);
})
.fail(function(){
alert("fail");
})
})
</script> - 이렇게 하면 실패한다
- 메세지를 잘 읽어보면 A서버의 헤더에서 ‘Access-Control-Allow-Origin’헤더를
발견할 수 없어서 해당 오리진B는 A에 접속할 수 없다고 나온다 - 통신하기 위해선 이 헤더가 존재해야하고 헤더 안의 정보와 B가 매칭이 되어야 실제
요청을 보내게 된다
… - 이를 설정하기 위해선 간단하다
@SpringBootApplication
@RestController
public class Bootdemo4colsApplication {
//CORS 설정
@CrossOrigin(origins = {"http://localhost:180180","/그외 가능/"})
@GetMapping("/hello")
public String hello() {return "hello";}
public static void main(String[] args) {
SpringApplication.run(Bootdemo4colsApplication.class, args);
}
}
- 설명
- 토이 프로젝트라 따로 컨트롤러 만들지 않고 바로 RestController설정
- @CrossOrigin에 설정이 가능하며 여러개도 설정 가능
- Origin을 이루는 3가지가 맞도록 잘 설정
- 이제 A프로젝트를 다시 띠운후 B프로젝트에 매핑된 html을 요청하면
Ajax요청이 성공하여서 “hello”메세지를 가진 alert창이 뜨게된다 - 예제에서는 핸들러에 @CrossOrigin을 하였지만 컨트롤러 클래스에 붙여서
해당 컨트롤러 전체 적용이 가능하다 - 만약 전역적으로 하고 싶다면?
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/hello")
.allowedOrigins("http://localhost:10080");
}
}
Related POST
- [Spring Boot] 13. Spring REST Client
- [Spring Boot] 12. Spring Security
- [Spring Boot] 11. Spring Data
- [Spring Boot] 10. 스프링 웹 MVC-2: Spring HATOAS, CORS
- [Spring Boot] 9. 스프링 웹 MVC-1:
- [Spring Boot] 8. Spring-Boot-Devtools
- [Spring Boot] 7. 테스트(Testing)
- [Spring Boot] 6. 로깅(Logging)
- [Spring Boot] 5. Profiles
- [Spring Boot] 4. 스프링부트 외부설정
- [Spring Boot] 3. 스프링부트 핵심기능
- [Spring Boot] 2. 스프링부트 이해
- [Spring Boot] 1. 스프링부트 시작