JAVA

[Spring Boot] 슬랙 웹후크 연동

생활개발 2025. 4. 29. 14:23
728x90

회사 메신저를 슬랙으로 바꾸면서 홈페이지서 문의 들어오는거 슬랙에 전송되도록 추가 작입 필요.

 

1. 채널에 앱 추가

https://w1745892406-kad670159.slack.com/marketplace/A0F7XDUAZ--

 

수신 웹후크

> _Please note, this is a legacy custom integration - an outdated way for teams to integrate with Slack. These integrations lack newer features and they will be deprecated and possibly removed in the

slack.com

해당 사이트 들어가서

Slack에 추가 클릭
하단 채널에 포스트에서 메세지 받아야 하는 채널 선택
웹후크 URL 복사해두기

 

이렇게하면 채널에 슬랙 수신 웹후크 추가 완료!

 

2. 자바 코드 작성

build.gradle 추가

implementation 'com.slack.api:slack-api-client:1.30.0' // 슬랙 API

application.yml에 추가 (추가안하고 하드코딩으로 넣어도 되긴함)

#슬랙
webhook:
  slack:
    url: 웹후크 URL

 

웹후크 클래스 생성

import com.slack.api.Slack;
import com.slack.api.model.Attachment;
import com.slack.api.model.Field;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;

import static com.slack.api.webhook.WebhookPayloads.payload;

@Service
public class slackWebHooks {
    @Value("${webhook.slack.url}")
    private String SLACK_WEBHOOK_URL;

    private final Slack slackClient = Slack.getInstance();

    /**
     * 슬랙 메시지 전송
     **/
    public void sendMessage(String title, HashMap<String, String> data) {
        try {
            slackClient.send(SLACK_WEBHOOK_URL, payload(p -> p
                .text(title) // 메시지 제목
                .attachments(List.of(
                    Attachment.builder()
                        .fields( // 메시지 본문 내용
                            data.keySet().stream().map(key -> generateSlackField(key, data.get(key))).collect(Collectors.toList())
                        )
                    .build())))
            );
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * Slack Field 생성
     **/
    private Field generateSlackField(String title, String value) {
        return Field.builder()
            .title(title)
            .value(value)
            .valueShortEnough(false)
            .build();
    }
}

 

테스트 코드

HashMap<String, String> slackMap = new HashMap<>();
slackMap.put("테스트1", "테스트1 내용");
slackMap.put("테스트2", "테스트2 내용");

slackWebHooks.sendMessage(title, slackMap);

이렇게하면 완료!

이긴 한데 나는 map에 있는 데이터들 넘겨줘야되서 수정함

클래스 호출할때

String title = "Slack 메시지 전송 테스트";

slackWebHooks.sendMessage(title, req);

수정된 클래스

import com.slack.api.Slack;
import com.slack.api.model.Attachment;
import com.slack.api.model.Field;
import musign_2023.classes.Utils;
import musign_2023.front.model.ContactDAO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;

import static com.slack.api.webhook.WebhookPayloads.payload;

@Service
public class slackWebHooks {
    @Value("${webhook.slack.url}")
    private String SLACK_WEBHOOK_URL;

    private final Slack slackClient = Slack.getInstance();
    @Autowired
    private ContactDAO contactDao;

    /**
     * 슬랙 메시지 전송
     **/
    public void sendMessage(String title, HashMap<String, Object> data) {
        try {
            slackClient.send(SLACK_WEBHOOK_URL, payload(p -> p
                    .text(title) // 메시지 제목
                    .attachments(List.of(
                            Attachment.builder()
                                    .fields(generateCustomFields(data))
                                    .build())))
            );
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * Slack Field 생성
     **/
    private List<Field> generateCustomFields(HashMap<String, Object> data) {
        List<Field> fields = new ArrayList<>();

        HashMap<String, Object> map = data;

        String user_company = Utils.checkNullString(map.get("user_company"));
        String user_manager = Utils.checkNullString(map.get("user_manager"));
        String user_phone = Utils.checkNullString(map.get("user_phone"));

        fields.add(Field.builder()
                .title("문의 회사")
                .value(user_company)
                .build());

        fields.add(Field.builder()
                .title("담당자")
                .value(user_manager)
                .build());

        fields.add(Field.builder()
                .title("연락처")
                .value(user_phone)
                .build());


        return fields;
    }
}

 

뒤에 내용은 생략

 

728x90