Spring Boot - Slack Message 전송 API 구현

송형근·2024년 9월 12일
0

TIL

목록 보기
36/43
post-thumbnail

프로젝트에서 슬랙 메시지를 전송하는 요건이 있어 알아보게 되었음

Slack Incoming WebHooks 설정

  • 더보기 - 자동화 - 앱 - Incoming WebHooks 추가
  • App 설정 이동
  • 구성 편집
  • 웹후크 URL 복사

RestTemplate 설정

  • RestTemplate을 이용해 메시지를 전송할 예정이므로 RestTemplateConfig 설정
    @Configuration
    public class RestTemplateConfig {
        @Bean
        public RestTemplate slackRestTemplate(){
            return new RestTemplate();
        }
    }

서비스 로직 구현

  • ReqDto
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class SlackIncomingHookDto {
        private String channel;
        private String text;
    }
  • ResDto
    @Getter
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    public class SlackMessageResDto {
        Long id;
        String receiverId;
        String message;
        LocalDateTime sendTime;
    
        public static SlackMessageResDto from (Slack slack){
            return SlackMessageResDto.builder()
                    .id(slack.getId())
                    .receiverId(slack.getReceiverId())
                    .message(slack.getMessage())
                    .sendTime(slack.getSendTime())
                    .build();
        }
    }
  • Slack Entity
    @Getter
    @Builder
    @NoArgsConstructor
    @AllArgsConstructor
    @Entity(name = "p_slacks")
    public class Slack {
    
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        Long id;
    
        String receiverId;
    
        @Column(length = 1000)
        String message;
    
        LocalDateTime sendTime;
    }
  • SlackRepository
    public interface SlackRepository extends JpaRepository<Slack, Long> {
    }
  • SlackService
    @Service
    @RequiredArgsConstructor
    @Slf4j(topic = "SlackService")
    @Transactional(readOnly = true)
    public class SlackService {
    
        private final SlackRepository slackRepository;
        private final RestTemplate slackRestTemplate;
    
        @Value("${slack.incoming-hook.url}")
        String slackURL;
    
        @Transactional
        public SlackMessageResDto sendSlackMessage(SlackMessageReqDto slackMessageReqDto) {
            try{
                SlackIncomingHookDto request = new SlackIncomingHookDto("@"+slackMessageReqDto.getReceiverId(), slackMessageReqDto.getMessage());
                log.info(slackRestTemplate.postForObject(slackURL, request, String.class));
                return SlackMessageResDto.from(slackRepository.save(slackMessageReqDto.toEntity(LocalDateTime.now())));
            }catch (Exception e){
                log.error("Internal Server Error");
                throw new CoreApiException(ErrorType.DEFAULT_ERROR);
            }
        }
    }
    • slackURL에 복사해둔 IncomingWebHook의 URL 입력 ( 외부에 노출되지 않도록 주의!! )
    • “@”의 경우 DM을 보내기위해 덧붙인 부분이므로 채널에 전송을 원하면 “@”을 제외하고 채널 명 입력하면 됨
profile
기록을 남겨보자

0개의 댓글