본문 바로가기

백엔드

[Spring Boot] RestAPI - ResponseEntity, Hateoas

728x90

 

/*REST API*/

REST (Representational State Transfer) API : 웹 서비스에서 클라이언트와 서버간의 통신을 위한 아키텍처 스타일. 

 

/*ResponseEntity - 빌더사용*/

HTTP 요청에 대한 응답을 캡슐화하는 클래스.

HTTP 상태 코드, 헤더, 바디 를 포함할 수 있다.

Builder를 사용하는 게 직관적이어서 더 좋다고 생각한다.

 

@GetMapping("/test")
public ResponseEntity<String> test(){
    HttpHeaders headers = new HttpHeaders();
    headers.add("HeaderName","HeaderValue");
    return ResponseEntity.ok() //상태코드
            .headers(headers)
            .body("Hello World!")
    }
}

 

 

 

이렇게 설정하면

Response Status = 200 (OK)

HEADERS에 HeaderName : HeaderValue 추가

BODY : Hello World! 가 추가 된 것을 알 수 있다.

 

/*ResponseEntity -  유저 등록 POST*/

 

@PostMapping("/users")
    public ResponseEntity<User> createUser(@Valid @RequestBody User user){
        User savedUser = userDaoService.save(user);
        URI location = ServletUriComponentsBuilder.fromCurrentRequest()
                .path("/{id}").buildAndExpand(savedUser.getId()).toUri();
        // -> location header
        return ResponseEntity.created(location).build();
    }

 

여기서는 ResponseEntity를 이용하였고 URI location을 이용하였다.

 

 

post (유저 등록)을 할 때 Location 값이 잘 나오는 것을 확인할 수 있다.

 

/*ResponseEntity -  유저 조회 */

 

import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*;

import org.springframework.hateoas.server.mvc.WebMvcLinkBuilder;

@GetMapping("/users/{id}")
    public EntityModel<User> retrieveUser(@PathVariable int id) {
        User user = userDaoService.findById(id);
        if (user == null) {
            throw new UserNotFoundException("id:" + id);
        }
        EntityModel<User> entityModel = EntityModel.of(user);
        WebMvcLinkBuilder link = linkTo(methodOn(this.getClass()).retrieveUserList());
        entityModel.add(link.withRel("all-users"));
        return entityModel;
    }

 

id값에 따른 유저 조회는 hateoas 라이브러리를 이용하였다.

 

build.gradle에 다음과 같은 dependency를 추가해야 한다.

implementation 'org.springframework.boot:spring-boot-starter-hateoas'

 

HATEOAS를 사용하는 이유는 다음과 같다.

1. 탐색의 용이성 : HATEOAS는 클라이언트에게 해당 리소스와 관련된 링크를 제공한다.

2. 확장성 : 링크를 추가해 '다음페이지', '수정', '삭제' 등의 작업에 대한 링크를 포함할 수 있다.

 

linkTo, methodOn 메서드는 import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.*; 를 통해 가져온다.

그리고 리턴 값을 EntityModel로 사용한다.

 

 

위 사진과 같이 _links 안에 설정을 해 두었던 userLIst의 링크 값을 얻을 수 있다.

728x90