HATEOAS
Hypermedia as the Engin of Application State
Spring HATEOAS : 하이퍼링크 자원과 함께 HAL(JSON Hypertext Application Language) 자원들 생성
Link라는 클래스로 다른 자원에 접근할 수 있는 링크 하이퍼미디어를 제공
다른 상태로 전이할 수 있는 링크 레퍼런스를 제공
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-hateoas</artifactId>
</dependency>
EntityModel
A simple EntityModel wrapping a domain object and adding links to it.
EntityModel 로 전달
import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*;
@GetMapping("/users")
public List<User> retrieveAllUsers(){
return userDaoService.findAll();
}
// GET /users
// HATEOAS 과정
// EntityModel
// WebMvcLinkBuilder
@GetMapping("/users/{id}")
public EntityModel<User> retrieveUser(@PathVariable int id) {
User user = userDaoService.findOne(id);
if(user== null){
throw new UserNotFoundException("id: "+id);
}
EntityModel<User> entityModel= EntityModel.of(user);
WebMvcLinkBuilder link = linkTo(methodOn(this.getClass()).retrieveAllUsers()); // 해당 메소드의 링크
entityModel.add(link.withRel("all-users"));
return entityModel;
}
결과
User, Post 가 생성되었을 때
반환값으로 get URI 반환
@PostMapping("/jpa/users")
public ResponseEntity<User> createUser(@Valid @RequestBody User user) {
User savedUser = repository.save(user);
URI location = ServletUriComponentsBuilder.fromCurrentRequest()
.path("/{id}")
.buildAndExpand(savedUser.getId())
.toUri();
return ResponseEntity.created(location).build();
}
@PostMapping("/jpa/users/{id}/posts")
public ResponseEntity<Object> createPostForUser(@PathVariable int id, @Valid @RequestBody Post post) {
Optional<User> user = repository.findById(id);
if(user.isEmpty())
throw new UserNotFoundException("id:"+id);
post.setUser(user.get());
Post savedPost = postRepository.save(post);
URI location = ServletUriComponentsBuilder.fromCurrentRequest()
.path("/{id}")
.buildAndExpand(savedPost.getId())
.toUri();
return ResponseEntity.created(location).build();
}
HAL Explorer
REST API 설계 시 Response message의 포맷과는 상관없이
API를 쉽게 사용할 수 있는 메타정보를 하이퍼링크 형식으로 제공
actuator를 좀 더 편하게 탐색할 수 있음.
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-rest-hal-explorer</artifactId>
</dependency>
http://localhost:8080/explorer/index.html
http://localhost:8080/explorer/index.html#uri=http://localhost:8080/actuator
Static Filtering
@JsonProperty
public class User
{
private Integer id;
@Size(min=2,max=30)
@JsonProperty("user_name") // json으로 보낼 떄 커스터마이즈
private String name;
@Past
private LocalDate birthDate;
...
@JsonIgnore, @JsonIgnoreProperties({"field1", "field2"})
Json 에서 제외
동적 필터링
@JsonFilter("SomeBeanFilter")
public class SomeBean
{
..
@GetMapping("/filtering")
public MappingJacksonValue filtering(){
Somebean sombean = new SomeBean("value1", "value2", "value3");
MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(someBean);
SimpleBeanPropertyFilter filter = SimpleBeanPropertyFilter.finterOutAllExcept("field1", "field3");
FilterProvider filters = new SimpleFilterProvider().addFilter("SomeBeanFilter", filter);
mappingJacksonValue.setFilters(filters);
return mappingJacksonValue;
}
Actuator
Spring Boot 의 Production-ready features 를 제공함.
애플리케이션 생산에 모니터링, 관리
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
application.properties
management.endpoints.web.exposure.include=*
데이터베이스 초기값 설정
h2 내장 db설정
spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect
spring.jpa.defer-datasource-initialization=true
#hibernate 설정
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.show_sql=true
spring.jpa.hibernate.ddl-auto=create
resources/data.sql 스크립트 작성
application.properties 설정, 테이블 생성 후 스크립트 실행
spring.jpa.defer-datasource-initialization=true
'Back-end > Spring Cloud (MSA)' 카테고리의 다른 글
Spring Cloud (MSA) - Resilience4j @Retry @CircuitBreaker(서킷브레이커) (0) | 2022.12.06 |
---|---|
Spring Cloud (MSA) API Gateway - 경로탐색(Exploring Routes), Logging Filter (0) | 2022.12.03 |
Spring Cloud (MSA) - 로드밸런싱 Eureka, Feign (0) | 2022.11.27 |
Spring Cloud (MSA) - Feign 다른 서버 값 가져오기 (0) | 2022.11.26 |
Spring Cloud (MSA) - Config Server (0) | 2022.11.25 |
댓글