- Spring Batch에서 오류가 났을 때, 알림이 오도록 설정을 하려고 한다.
- 여기에서는 Slack Incoming WebHook 기능을 사용하였다.
채널
> View channel details
Integrations
> Apps
> Add an App
webook
검색 > Incoming WebHooks
설치Webhook URL
가져오기의존성 추가
<dependency>
<groupId>com.slack.api</groupId>
<artifactId>slack-api-client</artifactId>
<version>1.30.0</version>
</dependency>
implementation group: 'com.slack.api', name: 'slack-api-client', version: '1.30.0'
slack Url
slack:
url: https://hooks.slack.com/services/토큰/정보/들
구현
Slack Send Utils
@Slf4j
public class SlackUtils {
private final String SLACK_URL;
private final Slack slackClient = Slack.getInstance();
public SlackUtils(String slackUrl) {
this.SLACK_URL = slackUrl;
}
/**
* Slack 알림 전송
* @param title
* @param data
* @param color
*/
public void sendMessage(String title, HashMap<String, String> data, SlackColor color) {
log.info("Slack Send Message!");
try {
slackClient.send(SLACK_URL, payload(p -> p
.text(title)
.attachments(List.of(
Attachment.builder()
.color(color.getColorCode())
.fields(data.keySet().stream().map(key -> generateSlackField(key, data.get(key))).collect(Collectors.toList()))
.build()
))
));
} catch (IOException e) {
log.error("Slack Send Message Failed", e);
}
}
/**
* Slack Field 생성
* @param title
* @param value
* @return
*/
private Field generateSlackField(String title, String value) {
return Field.builder()
.title(title)
.value(value)
.valueShortEnough(false)
.build();
}
}
Color Enum
@Getter
public enum SlackColor {
RED("#ff0000"),
GREEN("#008000");
private final String colorCode;
SlackColor(String colorCode) {
this.colorCode = colorCode;
}
}
Bean 등록
: slack hook url을 가져와서 Bean 등록@Bean
public SlackUtils slackUtils(@Value("${slack.url}") String url) {
return new SlackUtils(url);
}
테스트 실행
@Autowired
SlackUtils slackUtils;
@Test
void slack() {
String title = "타이틀";
HashMap<String, String> data = new HashMap<>();
data.put("내용1", "내용1이 들어감");
data.put("내용2", "내용2이 들어감");
slackUtils.sendMessage(title, data, SlackColor.RED);
}
구현중인 프로젝트에서
Spring Boot 2.5.0
버전을 사용하고 있었는데 아래와 같은 오류 발생
일반Java 프로젝트
/curl
을 통한 테스트에서는 정상 동작!
okhttp3
관련 부분에서 오류가 발생!okhttp3
의 RequestBody.create()
부분에서 문제가 발생.public Response postJsonBody(String url, Object obj) throws IOException {
RequestBody body = RequestBody.create(toSnakeCaseJsonString(obj), MEDIA_TYPE_APPLICATION_JSON);
Request request = new Request.Builder().url(url).post(body).build();
return okHttpClient.newCall(request).execute();
}
okhttp3
의 버전이 3.14.9
로 되어있으나, 해당 버전에서는 동작하지 않음.
- Spring Boot 2.5.0에서는
3.14.9
버전의okhttp3
라이브러리를 가져온다.
https://docs.spring.io/spring-boot/docs/2.5.0/reference/html/dependency-versions.html#appendix.dependency-versions
이상.