ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring] Spring + Slack 연동해서 알림받기(2)
    카테고리 없음 2023. 9. 18. 20:02

    저번에 Slack bot을 설정하고 추가하는 단계까지 진행했다!

    2023.09.05 - [Spring] - [Spring] Spring + Slack 연동해서 알림받기(1)

     

    [Spring] Spring + Slack 연동해서 알림받기(1)

    사용자가 불편신고를 등록하면 슬랙으로 불편신고 알림을 받는 기능을 구현해야 한다. 스프링부트와 슬랙을 연동하는 법을 알아보자! 크게 두 단계로 나눠지는데 1. SlackAPI 설정 2.스프링부트 Sla

    yellog03.tistory.com

     

    이제 스프링부트 설정하고 개발해보자

     

    1. Gradle 설정

    슬랙 api를 사용하기 위해 dependency를 추가해주자

    코드는 하단 링크를 참고했다. 

    https://slack.dev/java-slack-sdk/guides/getting-started-with-bolt#gradle

     

    Getting Started with Bolt | Slack SDK for Java

    SLACK_SIGNING_SECRET The secret value shared only with the Slack Platform. It is used for verifying incoming requests from Slack. Request verification is crucial for security as Slack apps have internet-facing endpoints. To know the value, visit the Slack

    slack.dev

     

    [build.gradle]

    dependencies {
            implementation("com.slack.api:bolt:1.31.0")
            implementation("com.slack.api:bolt-servlet:1.31.0")
            implementation("com.slack.api:bolt-jetty:1.31.0")
            implementation("org.slf4j:slf4j-simple:1.7.36")
    }

     

    2. .yml 파일 설정

    위에서 발급받았던 토큰을 yml이 관리하도록 하자!

    일단 코드를 추가한다. 

    slack:
      bot-token: ${SLACK_BOT_TOKEN}
      postMessageUrl : "https://slack.com/api/chat.postMessage"
      channel:
        monitor: "#불편신고"

    * postMessageUrl : slack api의 chat.postMessage메서드를 호출하기 위한 endpoint를 나타낸다.

                                     상기 url은 slack공식 API endpoint이다.

     

    * monitor : slack의 특정 채널 이름 

                                     

    환경변수를 설정해주자

    상단바의 [Run] > [Edit Configurations] 

    저 버튼을 클릭한 다음

     

    [+] 버튼을 눌러서 발급 받은 token을 저장한다.

     

    3. DTO 생성하기 

     

     슬랙에게 보낼 dto를 작성한다.

    package com.tago.api.infra.slack.dto;
    
    import lombok.Builder;
    import lombok.Data;
    import lombok.Getter;
    
    @Data
    @Getter
    @Builder
    public class SlackMessageDto {
        private String type;
        private String detail;
    }

    나는 불편신고의 유형, 그리고 세부사항을 전달해야 하므로 저렇게 2개를 넣었다.

     

     

    4. 서비스 메서드 작성하기

    package com.tago.api.infra.slack.application;
    
    @Service
    @RequiredArgsConstructor
    public class SlackService{
    
        private final MemberService memberService;
    
        @Value(value = "${slack.bot-token}")
        private String token;
    
        @Value(value="${slack.channel.monitor}")
        private String channel;
    
        public void sendMessageToSlack(Long memberId,IssueDto issueDto){
    
            MemberGetResponse member = memberService.get(memberId);
            String issueDescription = IssueType.getDescriptionByType(issueDto.getType());
    
            List<TextObject> textObjects = new ArrayList<>();
            textObjects.add(markdownText("*문의자 전화번호:*\n" + member.getNumber()));
            textObjects.add(markdownText("*문의 제목:*\n"+ issueDescription));
            textObjects.add(markdownText("*문의 내용:*\n" + issueDto.getDetail()));
            MethodsClient methods = Slack.getInstance().methods(token);
            ChatPostMessageRequest request = ChatPostMessageRequest.builder()
                    .channel(channel)
                    .blocks(asBlocks(
                            header(header -> header.text(plainText(member.getName()+ "님이 문의를 남겨주셨습니다!"))),
                            divider(),
                            section(section -> section.fields(textObjects)
                            ))).build();
    
            try {
                methods.chatPostMessage(request);
            } catch (Exception e) {
                throw new RuntimeException("Failed to send message to Slack", e);
            }
        }
    }

    나는 textObjects라는 텍스트 객체들의 리스트를 생성해서 메세지로 보냈다.

    memberId를 이용해 전화번호를 가져오고, 문의 제목, 문의 내용 등을 가져온다.

     

    5. 불편신고 서비스 메서드에 슬랙기능 추가하기 

    @Service
    @RequiredArgsConstructor
    public class IssueReportService {
    
        private final IssueCommandService issueCommandService;
        private final IssueCreateService issueCreateService;
        private final SlackService slackService;
    
        @Transactional
        public Issue reportIssue(Long memberId, IssueDto issueDto){
            Issue issue = issueCreateService.createIssue(memberId, issueDto);
            slackService.sendMessageToSlack(memberId, issueDto);
    
            return issueCommandService.save(issue);
        }
    }

     내 기존 불편신고 등록 메서드에 만든 sendMessageToSlack을 추가하였다.

    실행해보면 

     

    슬랙 알림이 정상적으로 오는 것을 확인할 수 있다 ! 

Designed by Tistory.