카테고리 없음

카카오워크 api 사용해보기

유정♡ 2025. 6. 17. 11:11

참고 문서 : https://docs.kakaoi.ai/kakao_work/

 

[ 봇(Bot) 설정 ]

1. test 용 워크스페이스 생성 -> 카카오워크 홈페이지 관리자로 로그인

 

2. 알림 메세지 보낼 봇(Bot) 관리할 개발자 등록

    봇(Bot) 관리 -> 봇(Bot) 개발자 관리 -> 개발자 추가 등록 -> 권한 부여할 멤버 이름 검색 후 추가

 

3. 알림 메세지 보낼 봇(Bot) 생성 

    봇(Bot) 관리 -> 봇(Bot) 개발 -> 봇(Bot) 생성하기 -> 이름 & 한 줄 설명 & 문의 설정 후 생성 

    생성한 봇 관리에 왼쪽 연필 아이콘 클릭(봇 수정가능) -> App Key 확인 

 이때, App Key를 하드코딩 하여 토큰이 외부에 노출되면 누구나 내 워크스페이스 사용자에게 메시지를 전송할 수 있음
          실수로 GitHub 등 외부 저장소에 올라가면 위험도가 매우 큼
          application.properties 또는 application.yml에 분리해서 관리 

 

4. https://docs.kakaoi.ai/kakao_work/webapireference/commonguide/#api-%EA%B3%B5%ED%86%B5-%EA%B0%80%EC%9D%B4%EB%93%9C 참고하여 개발 

 


[ 게시글 등록 완료 시 카카오워크 알림 자동 발송하기 (Java + Spring) ]

✅ DB에 저장된 이메일 주소와 카카오워크 워크스페이스 유저 이메일을 비교하여 해당 사용자에게 게시글 등록 완료 알림을 자동으로 보내는 기능을 구현

 

1. DB에 저장된 이메일 주소 조회 -> 카카오워크 API로 해당 유저 존재 여부 확인 -> 메시지 종류 선택 (예: BOARD_REGISTER) -> 메시지 전송

package com.example.service;

import org.springframework.http.*;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;

import java.util.HashMap;
import java.util.Map;

public class KakaoWorkService {

    private static final String API_SEND_URL = "https://api.kakaowork.com/v1/messages.send_by_email";
    private static final String API_FIND_USER_URL = "https://api.kakaowork.com/v1/users.find_by_email";
    private static final String KAKAOWORK_BOT_TOKEN = "봇_토큰"; // 실제 발급받은 토큰으로 대체

    private final RestTemplate restTemplate = new RestTemplate();

    // 메인 메서드: 이메일로 카카오워크 메시지 전송
    public void sendMessage(String email, String type) {
        if (email == null || !checkUserExists(email)) {
            System.out.println("[카카오워크] 유저를 찾을 수 없음: " + email);
            return;
        }

        KakaoMessageType messageType = KakaoMessageType.from(type);

        Map<String, Object> body = new HashMap<>();
        body.put("email", email);
        body.put("text", messageType.getMessage());

        HttpEntity<Map<String, Object>> request = new HttpEntity<>(body, createHeaders());

        try {
            ResponseEntity<String> response = restTemplate.postForEntity(API_SEND_URL, request, String.class);
            System.out.println("[카카오워크] 메시지 전송 결과: " + response.getBody());
        } catch (Exception e) {
            System.err.println("[카카오워크] 메시지 전송 실패: " + e.getMessage());
        }
    }

    // 유저 존재 여부 확인
    private boolean checkUserExists(String email) {
        try {
            String url = UriComponentsBuilder
                    .fromHttpUrl(API_FIND_USER_URL)
                    .queryParam("email", email)
                    .build()
                    .toUriString();

            HttpEntity<String> request = new HttpEntity<>(createHeaders());
            ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, request, String.class);
            String responseBody = response.getBody();

            return responseBody != null && responseBody.contains("\"success\":true");
        } catch (Exception e) {
            System.err.println("[카카오워크] 사용자 확인 실패: " + e.getMessage());
            return false;
        }
    }

    // 인증 헤더 생성
    private HttpHeaders createHeaders() {
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.set("Authorization", "Bearer " + KAKAOWORK_BOT_TOKEN);
        return headers;
    }

    // 메시지 종류 enum 정의
    public enum KakaoMessageType {
        BOARD_REGISTER("✅ 게시글 등록이 완료되었습니다."),
        INCOMING_CALL("📞 전화가 왔습니다."),
        DEFAULT("🔔 알림이 도착했습니다.");

        private final String message;

        KakaoMessageType(String message) {
            this.message = message;
        }

        public String getMessage() {
            return message;
        }

        public static KakaoMessageType from(String type) {
            for (KakaoMessageType t : values()) {
                if (t.name().equalsIgnoreCase(type)) {
                    return t;
                }
            }
            return DEFAULT;
        }
    }
}

 

// 1. DB에서 account_id로 이메일 조회
String email = accountMapper.selectEmailByAccountId(accountId);

// 2. 조회된 이메일로 메시지 전송
kakaoWorkService.sendMessage(email, "BOARD_REGISTER");

 

<select id="selectEmailByAccountId">
    SELECT email
    FROM account
    WHERE account_id = #{ACCOUNT_ID}
</select>

 

 

  • BOARD_REGISTER 같은 타입을 enum으로 관리하면 확장/유지보수가 쉬워지게 작성
  • checkUserExists()로 반드시 유저 존재를 확인하고 보내야 오류를 방지함

 

 

728x90