반응형
개발꿀팁
slack 알림보내기
프로젝트 중 문의사항을 받으면 slack알림이 오는 기능을 구현. slack연동을 위한 토큰 발급방법과 slck 메세지 작성 등을 정리해 보았다.
1. 준비
build.gradle
build.gradle에 dependencies를 아래와 같이 추가한다.
implementation("com.slack.api:bolt:1.18.0")
implementation("com.slack.api:bolt-servlet:1.18.0")
implementation("com.slack.api:bolt-jetty:1.18.0")
application.yml
yml에는 토큰을 발급받고 챗봇을 만들 채널명을 적으면 된다.
slack:
token: xoxb-발급받은 토큰
channel:
monitor: '#채널명'
< 토큰 발급 방법 >
1. slack봇 생성에 필요한 권한 부여 -> https://api.slack.com/apps/ 접속하기
2. Create New App 선택 -> From scratch 선택
3. App Name 설정, 워크스페이스 선택 -> Create App
4. Permissions를 클릭. 아래와 같은 화면으로 이동하지 않는다면 왼쪽 메뉴에서 Features의 OAuth & Permissions으로 이동
5. Permissions의 Scopes에서 봇의 권한을 메시지를 보낼 수 있도록 설정
6. 토큰발급 완료! copy해서 사용한다.
2. 코드 구현
InquiryRequestDto
질문을 받는 Dto 생성
@Data
public class InquiryRequestDto {
private String name;
private String title;
private String cont;
}
Controller
질문을 받는 Dto를 @RequestBody로 받는다.
@RestController
@RequiredArgsConstructor
@RequestMapping("/api")
public class InquiryController {
private final InquiryService inquiryService;
@PostMapping("/inquiry")
public void postInquiry (@RequestBody InquiryRequestDto inquiryRequestDto) throws IOException {
inquiryService.postInquiry(inquiryRequestDto);
}
}
Service
- @value를 통해서 yml정보(토큰, 채널)을 가져옴
- slack에 알림이 올때 특정 정보를 추가적으로 주기 위해 마크다운 언어를 사용. TextObject를 사용.
- MethodsClient 객체를 이용해 발급받은 슬랙 token을 지정해주고 ChatPostMessageRequest 객체를 이용해서 보내고자 하는 채널과 메시지를 지정.
- 단순한 한줄의 메세지가 아닌 특정 양식을 가지고 있기 때문에 .blocks를 사용하여 헤더 메세지와 tectObjects를 넣어 줌.
- try - catch를 활용해 예외처리
@Service
@RequiredArgsConstructor
public class InquiryService {
// yml정보 가져오기
@Value(value = "${slack.token}")
private String token;
@Value(value = "${slack.channel.monitor}")
private String channel;
private final InquiryRepository inquiryRepository;
public void postInquiry(InquiryRequestDto.userInquiryDto inquiryRequestDto) throws IOException {
// Slack 메세지 보내기
try{
List<TextObject> textObjects = new ArrayList<>();
textObjects.add(markdownText("*이름:*\n" + inquiryRequestDto.getName()));
textObjects.add(markdownText("*문의 남긴 날짜:*\n" + inquiry.getCreatedAt()));
textObjects.add(markdownText("*문의 제목:*\n" + inquiryRequestDto.getTitle()));
textObjects.add(markdownText("*문의내용:*\n" + inquiryRequestDto.getCont()));
MethodsClient methods = Slack.getInstance().methods(token);
ChatPostMessageRequest request = ChatPostMessageRequest.builder()
.channel(channel)
.blocks(asBlocks(
header(header -> header.text(plainText( inquiryRequestDto.getName() + "님이 문의를 남겨주셨습니다!"))),
divider(),
section(section -> section.fields(textObjects)
))).build();
methods.chatPostMessage(request);
} catch (SlackApiException | IOException e) {
new ApiException(ErrorCode.INTERNAL_SERVER_ERROR, "Can't send Slack Message.");
}
}
}
3. 테스트
포스트맨 테스트
slack 테스트 결과
slack 알림 기능을 처음으로 구현해봤는데 구현자체는 어렵지 않았다. TextObject클래스를 활용해 ArrayList로 마크다운 언어를 작성하고ChatPostMessageRequest클래스의 block을 통해 슬렉메세지를 만드는게 더 어려운듯하다...😅
반응형
'개발 하나둘셋 > Java & Spring' 카테고리의 다른 글
TeamCity로 CI/CD 적용하기 (0) | 2022.11.10 |
---|---|
Docker 알아보기! Dockerfile 만들기, 이미지와 컨테이너 빌드하기 (1) | 2022.09.16 |
SpringBoot SMTP서버를 활용한 메일 보내기 (0) | 2022.06.07 |
spring 게시판 기간조회 동적으로 처리하기 querydsl (0) | 2022.05.18 |
spring 게시판 기간조회 방법! String -> LocalDateTime 변환 (0) | 2022.04.25 |