본문 바로가기
Back-end/Spring Cloud (MSA)

Spring Cloud (MSA) - HATEOAS, HAL Explorer, Static Filtering, Actuator

by javapp 자바앱 2022. 11. 24.
728x90

 

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

 

 

 

 

댓글