Side - Project 점심이(1 / 3)

김종찬·2023년 2월 17일
0

프로젝트

목록 보기
1/2
post-thumbnail

점심이

1. 소개

매일매일 점심을 뭐먹지 고민하는게 귀찮아 slack bot을 이용해 점심을 자동으로 추천 받아보고자 만들어 보았습니다. 처음에는 그냥 무작위 추천을 생각하다, 그 날의 날씨에 따라 어울리는 음식을 접목시켜 추천을 받도록하면 재밌을것 같아 날씨를 접목시켜 만들게 되었습니다.

아래 코드는 https://github.com/bellCold/slack-lunch-commend 에서 모두 보실수 있습니다!

  • 학습 목표
    • spring boot 와 api의 연동
    • 어떻게 날씨와 음식을 접목시킬지 로직 고려
    • aws ec2의 배포를 통해 ec2학습

1. Slack bot을 이용하기 위해서 봇이 사용될 워크스페이스와, token생성

  • Slack - api를 검색하셔서 아래와 같은 창으로 들어와 봇이 위치할 앱을 생성합니다.

  • 앱의 이름과 워크스페이스 설정한후 create App 버튼을 눌러줍니다.

  • 아직 한가지 설정이 더 필요한데, 봇에게 권한을 설정해주어야합니다. 좌측 목차 목록을 보면 OAuth & permissions를 확인할 수 있습니다. 저는 여기서 총 세가지 권한을 주었습니다.

  • 추가가 완료된 후 install App을 누르면 정상적으로 토큰이 잘 생성된것을 볼 수 있습니다.


2. 프로젝트 생성및 필요한 dependency 추가

	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'
  • project에 필요한 기본적인것들과 slack관련 디펜던시를 추가합니다.

발급 받았던 토큰값과 봇이 위치한 채널의 이름을 셋팅해줍니다. 따로 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으로 추상화하여 상속을 강제하였습니다.

로직이 잘 동작하는지 간단한 컨트롤러와 메세지를 보낼 Dto를 생성해봅시다.

@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);
    }
}

정상적으로 잘 슬랙 채널에 메시지가 발송된것을 볼 수 있습니다. 다음시간에는 메시지를 내가 원하는 시간에 자동으로 발송하는것을 설정하고 점심메뉴를 어떤식으로 추천할지 구현해보도록하겠습니다.

profile
봄이 오길

0개의 댓글