재미삼아 Slack Bot을 활용한 API를 개발하면서 작성하는 글이다.
아래의 Controller Method 는 Slack Bot의 Event Receive Endpoint로 만든 메소드이다.
간단하게는 Post 요청을 받아 @RequestBody 어노테이션으로 form data를 EventReceiveMessage로 받는다.
@RestController
@RequestMapping(value = "/event")
public class EventController {
@PostMapping(value = "/receive")
public void receive(
@RequestBody EventReceiveMessage message) {
}
}
해당 메소드에 다음과 같은 Json 형태의 form data가 전달된다.
{
"token": "...",
"team_id": "...",
"api_app_id": "...",
"event": {
"client_msg_id": "...",
"type": "app_mention",
"text": "...",
"user": "...",
"ts": "...",
"team": "...",
"blocks": [
...
],
"channel": "...",
"event_ts": "..."
}
}
위 Json data를 Entity로 매핑하기 위하여 아래와 같은 EventReceiveMessage 클래스를 만들었다.
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class EventReceiveMessage {
@JsonProperty("token")
private String token;
@JsonProperty("team_id")
private String teamId;
@JsonProperty("api_app_id")
private String apiAppId;
@JsonProperty("event")
private EventDetail event;
...
}
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class EventDetail {
@JsonProperty("client_msg_id")
private String clientMsgId;
@JsonProperty("type")
private EventType type;
@JsonProperty("text")
private String text;
...
}
public enum EventType {
APP_MENTION
}
그리고 String 형태의 type 파라미터를 enum 으로 변환하기 위하여
아래와 같은 방법으로 String Type의 데이터를 Enum Type으로 변환해주는 Converter를 만들었는데 효과가 없었다.
@Component
public class EventTypeConverter implements Converter<String, EventType> {
@Override
public EventType convert(String s) {
return EventType.valueOf(s.toUpperCase());
}
}
레퍼런스를 찾아본 결과 아래와같이 매핑을 하고자하는 Enum 클래스에 @JsonCreator 어노테이션을 사용하여 Converter와 같은 방법으로 Enum을 변환해주는 메소드를 만들어주면 된다.
public enum EventType {
APP_MENTION;
@JsonCreator
public static EventType from(String s) {
return EventType.valueOf(s.toUpperCase());
}
}
'Spring' 카테고리의 다른 글
[Spring] @Retryable를 활용하여 깔끔하게 API 및 메소드 재호출하기 (0) | 2022.02.15 |
---|
댓글