/*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의 링크 값을 얻을 수 있다.
'백엔드' 카테고리의 다른 글
[Spring Boot] RESTAPI - 예외처리 (1) | 2024.01.11 |
---|---|
[Spring Boot] JsonIgnore, JsonIgnoreProperty, JsonFilter (2) | 2024.01.04 |
[Spring Boot] 메시지 국제화 (Internationalization) (0) | 2024.01.02 |
[Spring Boot] @Validation 유효성 (0) | 2023.12.17 |
[Spring Boot] Spring JDBC (0) | 2023.12.16 |