오픈 api 를 기반으로 한 프로젝트를 진행하려다 UriComponentsBuilder 라던지 ResponseEntity 등등의 많은 지식 부족으로 인해 어려움을 겪었고 또 다시 인강을 통한 공부에 들어갔다.
먼저 모르는 것들을 집고 넘어가야 이후에도 원활한 진행이 가능할 것 같다.
일반적인 @RestController 에서 return "hello" 의 경우 status code(상태코드)를 200으로 채우고 body를 "hello" 라는 string 문자열로 채우고 return 을 한다.
ResponseEntity는 status code 와 body 값 그리고 더 나아가서 header 값을 내가 원하는대로 설정을 할 수 있게끔 도와준다.
ResponseEntity는 RequestEntity 와 함께 HttpEntity 라는 클래스를 상속받는다.
ResponseEntity 내부를 들여다보면 body 값, 상태코드, 헤더 map 으로 오버로딩이 되어있는 것을 볼 수가 있다.
다음과 같이 보냈을 때에 정상적으로 Event 객체가 return 되었고 상태코드 또한 OK로 나왔다.
물론 event 위치에 "wow" 라고 string 으로 두었을 때에도 body 값에 "wow"로 나왔다.
내부 구현 스펙과 맞게 MultiValueMap<String, String> 을 이용해 헤더를 만들고 return 해보았다.
정상적으로 header 내부에 보인다!!
상태코드를 OK에서 NOT_FOUND로 바꿔보았다.
정상적으로 404 NOT FOUND 로 응답을 하였다.
조금 더 상세하게 개발자 기량으로 api를 return 할 때에 쓰인다고 생각할 수 있을 것 같다.
+)
Serialization : Object to JSON
Deserialization : JSON to Object
Errors 의 경우에는 JSON으로 변환할 수가 없다.
objectmapper에 serializer가 여러가지 등록이 되어있다.
우리가 responseentity body에 담아준 객체를 JSON으로 변환할 때 objectmapper 를 써서 변환을 하는데, 이 때 objectmapper는 BeanSerializer를 사용해서 자바 빈 스펙을 준수한 객체를 JSON으로 변환시켜준다.
그런데, Errors 같은 경우에는 자바 빈 스펙을 준수하고 있는 객체가 아니다. 따라서 JSON으로 변환이 되지 않는다.
다음과 같은 방법으로 추가해줄 수가 있다.
bepoz-study-diary.tistory.com/191
+)
return ResponseEntity.created(createdUri).body(eventResource);
의 경우에는 어떤식으로 동작하는지 알아보자
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
public static BodyBuilder created(URI location) {
return status(HttpStatus.CREATED).location(location);
}
//created의 경우 상태를 CREATED로 넣고 location 메서드로 보낸다.
@Override
public BodyBuilder location(URI location) {
this.headers.setLocation(location);
return this;
}
public void setLocation(@Nullable URI location) {
setOrRemove(LOCATION, (location != null ? location.toASCIIString() : null));
}
private void setOrRemove(String headerName, @Nullable String headerValue) {
if (headerValue != null) {
set(headerName, headerValue);
}
else {
remove(headerName);
}
}
//location 메서드에서는 헤더에 대해서 setLocation 메서드를 호출하고
//setLocation 메서드내에서는 setOrRemove 메서드를 호출하는데 이곳에서 Location이라는 헤더명에 uri를 넣게된다.
@Override
public <T> ResponseEntity<T> body(@Nullable T body) {
return new ResponseEntity<>(body, this.headers, this.statusCode);
}
//body 메서드는 위에서 진행한 헤더와 상태값이 세팅되어있는 ResponseEntity에 바디값을 넣고 ReponseEntity를 생성하는 것을 리턴해준다.
|
cs |
'Spring' 카테고리의 다른 글
[Spring] Errors Serializer 만들기 (0) | 2020.09.18 |
---|---|
[Spring] @Autowired 생성자 주입방법에 대해서 (0) | 2020.09.18 |
[Spring] @JsonFilter 를 이용한 필드값 필터링하기 (0) | 2020.09.16 |
[Spring] @Valid 를 이용한 Exception처리와 ThymeLeaf 처리 (0) | 2020.09.15 |
[Spring] @ControllerAdvice를 이용한 Exception custom 처리하기 (0) | 2020.09.15 |