프로젝트에서 슬랙 메시지를 전송하는 요건이 있어 알아보게 되었음
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate slackRestTemplate(){
return new RestTemplate();
}
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class SlackIncomingHookDto {
private String channel;
private String text;
}
@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();
}
}
@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;
}
public interface SlackRepository extends JpaRepository<Slack, Long> {
}
@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);
}
}
}