[Spring] 메세지 컨버터는 어떻게 동작할까 4

커스텀 메세지 컨버터 만들기

개요

  • 메세지 컨버터를 통해 특정한 요청과 응답에 전용 메세지 컨버터를 적용시킴
  • WelcomeRequest를 사용하는 요청에 날자 데이터 추가
  • WelcomeResponse에 Welcome 메세지 추가

Request

WelcomeRequest를 커스텀하게 변환시킬려면 전용 메세지 컨버터가 있어야 한다. 그렇기 때문에 WelcomeRequest를 전용으로 하는 WelcomeRequestMessageConverter를 만들면 된다. 좀 더 다양하게 사용할 수 있다는 부분을 보여주기 위해 Content-Type 또한 커스텀하게 적용시켰다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class WelcomeRequestMessageConverter extends AbstractHttpMessageConverter<WelcomeRequest> {
private static final MediaType WELCOME_REQUEST = new MediaType("welcome", "request");
public static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;

public WelcomeRequestMessageConverter() {
super(DEFAULT_CHARSET, WELCOME_REQUEST);
}

@Override
protected boolean supports(Class<?> clazz) {
return clazz == WelcomeRequest.class;
}

@Override
protected WelcomeRequest readInternal(Class<? extends WelcomeRequest> clazz, HttpInputMessage httpInputMessage) throws IOException, HttpMessageNotReadableException {
String name = StreamUtils.copyToString(httpInputMessage.getBody(), DEFAULT_CHARSET);
return WelcomeRequest.builder().name(name).requestDate(new Date()).build();
}

@Override
protected void writeInternal(WelcomeRequest welcomeRequest, HttpOutputMessage httpOutputMessage) throws IOException, HttpMessageNotWritableException {
return;
}
}

Response

WelcomeResponse의 결과에 Welcome 메세지를 추가하기 위해서는 여러 방법이 있겠지만 본 글에서는 메세지 컨버터를 이용한 방법을 소개한다. 본문에 실을 값이 Object 이기에 ObjectMapper로 변환을 해 주어야 한다.

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
public class WelcomeResponseMessageConverter extends AbstractHttpMessageConverter<WelcomeResponse> {
private static final MediaType WELCOME_RESPONSE = new MediaType("welcome", "response");
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
public static final Charset DEFAULT_CHARSET = StandardCharsets.UTF_8;

public WelcomeResponseMessageConverter() {
super(DEFAULT_CHARSET, WELCOME_RESPONSE);
}

@Override
protected boolean supports(Class<?> clazz) {
return clazz == WelcomeResponse.class;
}

@Override
protected WelcomeResponse readInternal(Class<? extends WelcomeResponse> aClass, HttpInputMessage httpInputMessage) throws IOException, HttpMessageNotReadableException {
return null;
}

@Override
protected void writeInternal(WelcomeResponse welcomeResponse, HttpOutputMessage httpOutputMessage) throws IOException, HttpMessageNotWritableException {
OutputStream outputStream = StreamUtils.nonClosing(httpOutputMessage.getBody());

try {
JsonGenerator generator = OBJECT_MAPPER.getFactory().createGenerator(outputStream, JsonEncoding.UTF8);
Throwable var10 = null;

try {
WelcomeResponse value = WelcomeResponse.builder().welcomeMessage("Welcome " + welcomeResponse.getWelcomeMessage()).build();

ObjectWriter objectWriter = OBJECT_MAPPER.writer();

objectWriter.writeValue(generator, value);

generator.flush();
} catch (Throwable var26) {
var10 = var26;
throw var26;
} finally {
if (generator != null) {
if (var10 != null) {
try {
generator.close();
} catch (Throwable var25) {
var10.addSuppressed(var25);
}
} else {
generator.close();
}
}

}
} catch (InvalidDefinitionException var28) {
throw new HttpMessageConversionException("Type definition error: " + var28.getType(), var28);
} catch (JsonProcessingException var29) {
throw new HttpMessageNotWritableException("Could not write JSON: " + var29.getOriginalMessage(), var29);
}
}
}

확인

요청시 메세지 컨버터를 통해 변환하려면 요청 바디에 실어 보내야 한다.

1
2
3
4
5
6
###
POST localhost:8081/welcome
Content-Type: welcome/request
Accept: welcome/response;q=0.8, application/json;q=1.0

song

응답은 예상대로 Welcome이 추가되서 내려온다.

1
2
3
4
5
6
7
8
9
10
11
12
POST http://localhost:8081/welcome

HTTP/1.1 200
Content-Type: welcome/response;charset=UTF-8
Transfer-Encoding: chunked
Date: Wed, 23 Jun 2021 12:18:40 GMT
Keep-Alive: timeout=60
Connection: keep-alive

{"welcomeMessage":"Welcome song"}

Response code: 200; Time: 107ms; Content length: 33 bytes

Reference

Source Repository

메세지 컨버터는 어떻게 동작할까 1

메세지 컨버터는 어떻게 동작할까 2

메세지 컨버터는 어떻게 동작할까 3

Author: Song Hayoung
Link: https://songhayoung.github.io/2021/06/23/Spring/spring-message-converter-4/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.