티스토리 뷰

* 목표: 최근 본 상품을 기반으로 생성된 메시지를 카카오 알림톡으로 자동 전송해보자.

* 방법: 카카오 알림톡은 사업자 등록증이 필요한 비즈니스 인증만을 허용하므로 카카오 메시지 API로 대체해서 구현해보자.

 

1. 카카오 개발자 센터에서 https://developers.kakao.com/

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

새로운 애플리케이션 생성하고 로그인 ON으로 변경.

 

2. 카카오 로그인 (OAuth 연동)

redirect URI 설정: http://localhost:8080/login/oauth2/code/kakao

- 카카오 인증이 완료된 후 카카오에서 보내주는 code 값을 처리하는 리다이렉트 엔드포인트

 

SpringBoot에서 카카오 OAuth를 처리하는 컨트롤러 추가

package com.example.messaging_service.messaging.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.*;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.servlet.view.RedirectView;

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

@RestController
@RequestMapping("/auth")
public class KakaoOAuthController {

    @Value("${kakao.client-id}")
    private String clientId;

    @Value("${kakao.redirect-uri}")
    private String redirectUri;

    @Value("${kakao.client-secret}")
    private String clientSecret;

    private final RestTemplate restTemplate;

    public KakaoOAuthController(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    // ✅ 1. 카카오 로그인 URL 생성 (사용자가 이 URL을 호출하면 카카오 로그인 페이지로 이동)
    @GetMapping("/login/kakao")
    public RedirectView loginWithKakao() {
        String kakaoAuthUrl = "https://kauth.kakao.com/oauth/authorize" +
                "?client_id=" + clientId +
                "&redirect_uri=" + redirectUri +
                "&response_type=code";
        return new RedirectView(kakaoAuthUrl);
    }

    // ✅ 2. 카카오에서 리다이렉트된 후, 액세스 토큰 요청
    @GetMapping("/callback/kakao")
    public ResponseEntity<String> handleKakaoCallback(@RequestParam("code") String code) {
        String tokenUrl = "https://kauth.kakao.com/oauth/token";

        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);

        // 요청 바디 생성
        Map<String, String> requestBody = new HashMap<>();
        requestBody.put("grant_type", "authorization_code");
        requestBody.put("client_id", clientId);
        requestBody.put("redirect_uri", redirectUri);
        requestBody.put("code", code);
        requestBody.put("client_secret", clientSecret);

        HttpEntity<Map<String, String>> request = new HttpEntity<>(requestBody, headers);

        // 액세스 토큰 요청
        ResponseEntity<Map> response = restTemplate.exchange(tokenUrl, HttpMethod.POST, request, Map.class);

        // 응답 확인
        if (response.getStatusCode() == HttpStatus.OK) {
            String accessToken = (String) response.getBody().get("access_token");
            return ResponseEntity.ok("✅ 카카오 로그인 성공! 액세스 토큰: " + accessToken);
        } else {
            return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("❌ 카카오 로그인 실패");
        }
    }
}

http://localhost:8080/auth/login/kakao에 접속하면 카카오 로그인 페이지로 이동하고 로그인하면 http://localhost:8080/auth/callback/kakao로 이동하면서 액세스 토큰을 받을 수 있다. 그 전에 application.yml에 발급받은 rest_api_key와 secret을 설정해준다. OAuth 2.0 인증 완료!

 

3. 카카오 사용자 정보 가져오기

카카오 계정 사용자 정보를 DB에 저장

사용자의 프로필 사진, 닉네임, 이메일 등 정보 활용 가능

🤔 계속 { "msg": "this access token does not exist", "code": -401 } 이 에러가 났던 이유**

- 사용자 항목에 대한 정보 설정을 변경한 뒤 연결을 끊고 다시 로그인을 해야 엑세스 토큰을 새롭게 올바로 받을 수 있었다.

이렇게 해당 주소로 post 요청을 보내서 연결을 한 번 끊고 다시 로그인을 하여서 발급받은 엑세스 토큰으로 아래와 같이 get 요청을 날려주면

권한이 제한되어있어 닉네임만 허용했던 정보가 올바로 조회된다!

{
    "id": 3946848742,
    "connected_at": "2025-03-04T03:15:30Z",
    "properties": {
        "nickname": "송지호"
    },
    "kakao_account": {
        "profile_nickname_needs_agreement": false,
        "profile": {
            "nickname": "송지호",
            "is_default_nickname": false
        }
    }
}

 

4. 카카오 메시지 api를 이용해 내 카카오톡으로 메시지 전송

------------------------------ ------------------------------ ------------------------------ ------------------------------

5. 특정 조건 충족 시 자동 메시지 전송

일반적인 서비스에서 처리하는 방식을 생각해봤을 때 대개 사용자의 수신 동의 여부, 마케팅 메시지 수신 허용 여부도 함께 고려하므로 로그인 + 알림 수신 동의한 사용자에게만 메시지를 보낼 수 있도록 하자. 이는 로그인 한 사용자 중에서도 메시지를 받기 원하지 않는 사람(알림 수신 동의 X) 설정한 경우에도 메시지가 갈 수 있다.

ex) 사용자가 상품을 조회하고 나서 5분 후 "관심 있는 상품이 있나요?" 메시지 전송

 

 

 

 

'TIL(Today I Learned)' 카테고리의 다른 글

대규모 메시징 시스템 - 1) 최근 본 상품 추천 기능  (0) 2025.03.04
24.04.05,08  (0) 2024.04.09
24.04.04  (0) 2024.04.05
24.04.03  (0) 2024.04.03
24.04.02  (0) 2024.04.03
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함