개발 하나둘셋/Java & Spring

SpringBoot 슬랙 Slack알림보내기 ChatPostMessageRequest

유리코딩 2022. 6. 15. 19:50
반응형

개발꿀팁

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을 통해 슬렉메세지를 만드는게 더 어려운듯하다...😅  

 

반응형