매일매일 점심을 뭐먹지 고민하는게 귀찮아 slack bot을 이용해 점심을 자동으로 추천 받아보고자 만들어 보았습니다. 처음에는 그냥 무작위 추천을 생각하다, 그 날의 날씨에 따라 어울리는 음식을 접목시켜 추천을 받도록하면 재밌을것 같아 날씨를 접목시켜 만들게 되었습니다.
아래 코드는 https://github.com/bellCold/slack-lunch-commend 에서 모두 보실수 있습니다!
Slack - api를 검색하셔서 아래와 같은 창으로 들어와 봇이 위치할 앱을 생성합니다.
앱의 이름과 워크스페이스 설정한후 create App 버튼을 눌러줍니다.
아직 한가지 설정이 더 필요한데, 봇에게 권한을 설정해주어야합니다. 좌측 목차 목록을 보면 OAuth & permissions를 확인할 수 있습니다. 저는 여기서 총 세가지 권한을 주었습니다.
![]() |
![]() |
추가가 완료된 후 install App을 누르면 정상적으로 토큰이 잘 생성된것을 볼 수 있습니다.
implementation 'org.springframework.boot:spring-boot-starter'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'com.squareup.okhttp3:okhttp:4.10.0'
implementation 'com.slack.api:bolt-servlet:1.27.2'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
발급 받았던 토큰값과 봇이 위치한 채널의 이름을 셋팅해줍니다. 따로 properties에 저장하는 이유는 @Value
를 이용해 키값을 가져와 관리의 편의성과 값을 노출되어서는 안되는 값이므로 따로 관리하기 위함입니다.
@Service
@Slf4j
abstract class SlackService {
@Value(value = "${slack.token}")
String token;
@Value(value = "${slack.channel.monitor}")
String channel;
protected void postSlackMessage(String message) {
try {
MethodsClient methods = Slack.getInstance().methods(token);
ChatPostMessageRequest request = ChatPostMessageRequest.builder()
.channel(channel)
.text(message)
.build();
methods.chatPostMessage(request);
log.info("전송 완료");
} catch (SlackApiException | IOException e) {
log.error("발송 실패" + e.getMessage());
}
}
}
SlackService layer입니다. 슬렉 api를 통해 보내고자하는 메시지의 전송과 확장성의 관리를 편하게 위해 abstact class으로 추상화하여 상속을 강제하였습니다.
@Getter
public class SlackMessageDto {
private String message;
private String emoji;
@Override
public String toString() {
return this.message + " " + this.emoji;
}
}
SlackMessage Controller에서는 SlackMessageService에 의존하는것을 볼 수 있습니다.
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/v1")
public class SlackMessageController {
private final SlackMessageService slackMessageService;
@PostMapping("/slack")
public void sendMessage(@RequestBody SlackMessageDto slackMessage) {
slackMessageService.postSlackMessage(slackMessage.toString());
}
}
SlackMessageService의 구성을 본다면 SlackService를 상속받아 postSlackMessage를 통해 메시지를 보내는것을 볼 수 있습니다.
@Service
public class SlackMessageService extends SlackService {
@Override
public void postSlackMessage(String message) {
super.postSlackMessage(message);
}
}
정상적으로 잘 슬랙 채널에 메시지가 발송된것을 볼 수 있습니다. 다음시간에는 메시지를 내가 원하는 시간에 자동으로 발송하는것을 설정하고 점심메뉴를 어떤식으로 추천할지 구현해보도록하겠습니다.