0. 이 글을 작성하는 이유
slack webhook연동에 대한 글을 작성하다 discord에 대한 연동도 작성하면 재미있을 것 같아서 빠르게 메시지 한정으로 작성해 봅니다.
이 글을 읽기 전 이전 글을 읽고 오는 것을 추천합니다. 대부분의 구조를 동일하게 가져갑니다.
https://developer-youn.tistory.com/149
1. 웹훅 추가
슬랙과는 다르게 외부로 노출되지 않으므로 웹후크 URL 복사 버튼을 잘 눌러서 사용하시기 바랍니다.
이번엔 다시 설정하는 일 없도록 미리 이미지와 이름도 바꿔주었습니다.
2. 코드 작성
슬랙 웹훅에 대해서 json param으로 다양한 옵션을 제공하고 있습니다. 하지만 귀찮으니 저는 정말 메시지만 보낼 겁니다.
그래서 오로지 메시지(content)만을 위한 코드 작성입니다.
Slack과는 다르게 별도로 API를 제공해주지 않아서 직접 HTTP통신을 해야 합니다.
코드 구조는 심플하게 가져갑니다. 테스트 코드에서 끝낼 생각이며 Message를 담는 클래스 1개, 서비스 클래스 1개입니다.
public record Message(String content) {
}
애초에 content만 사용할 거라 jsonparam과 변수의 이름이 동일하여 @JsonProperty같은 어노테이션을 사용할 필요가 없습니다.
@Service
@Slf4j
public class MsgService {
@Value("${discord.webhook.alert.url}")
String webhookUrl;
public boolean sendMsg(String msg){
try {
HttpHeaders httpHeaders = new HttpHeaders();
httpHeaders.add("Content-Type", "application/json; utf-8");
HttpEntity<Message> messageEntity = new HttpEntity<>(new Message(msg), httpHeaders);
RestTemplate template = new RestTemplate();
ResponseEntity<String> response = template.exchange(
webhookUrl,
HttpMethod.POST,
messageEntity,
String.class
);
// response에 대한 처리
if(response.getStatusCode().value() != HttpStatus.NO_CONTENT.value()){
log.error("메시지 전송 이후 에러 발생");
return false;
}
} catch (Exception e) {
log.error("에러 발생 :: " + e);
return false;
}
return true;
}
}
여기서 한 가지 주의할 점은 디스코드에서는 요청 이후 204 No content가 발생하니 200이 아닌 204로 처리해야 합니다.
이제 테스트를 해봅시다.
@SpringBootTest
class MsgServiceTest {
@Autowired
private MsgService msgService;
@Test
public void 디스코드_메시지_테스트() throws Exception{
// given
boolean result = msgService.sendMsg("테스트 디스코드 알람입니다.");
// then
Assertions.assertEquals(result,true);
}
}
잘 나옵니다.
3. 마치며
Slack과 Discord에 대해 bean주입으로 컨트롤해도 괜찮겠지만 작성자의 귀찮음으로 인해 이렇게 마무리합니다.
코드 : https://github.com/0113bernoyoun/discordmsg
'JAVA > spring' 카테고리의 다른 글
Spring Security - CSRF를 disable?(간단, 요약) (0) | 2023.08.11 |
---|---|
테스트 진행하기(Entity 기본과 약간의 Repository를 곁들인) (0) | 2023.08.05 |
spring + slack webhook 연동하기 (0) | 2023.07.12 |
SpringBoot 3.x 버전에서 junit5 를 사용해서 테스트하는데 왜 RunWith가 먹히지 않고 필요가 없는가? (0) | 2023.07.07 |
스프링 데이터 jpa 공식 문서 읽으면서 끄적끄적 (0) | 2023.04.23 |