Kakao API 연동 시 전화번호 +82를 한국 로컬 번호로 포맷팅

Yu Seong Kim·2024년 11월 19일

개요

프로젝트를 진행하면서 다음과 같은 문제 상황에 직면했습니다.
일반 회원가입에서는 사용자의 전화번호를 한국 로컬 형식(예: 010-1111-1111)으로 입력받습니다.
그러나 카카오 로그인을 사용하는 경우, 카카오에서 제공하는 전화번호는 국제 형식(예: +82 10-1111-1111)으로 전달됩니다.
이로 인해 데이터베이스에 저장된 전화번호 형식이 일관되지 않아, 사용자 정보를 처리하거나 조회할 때 예상치 못한 오류가 발생할 가능성이 있다고 판단했습니다. 즉, 데이터베이스 데이터 정규화를 위해 카카오 로그인 시 넘어오는 사용자의 전화번호를 한국 로컬 번호로 포맷팅 한 다음 저장되게 메서드를 만들었습니다.

기존 저장 데이터

카카오 로그인 시 저장되는 전화번호 형식입니다. 국제 형식으로 저장됩니다. (+82 10-전화번호)

국제 형식 -> 국내 로컬 형식 메서드

    // 전화번호 변환 유틸리티 메서드 추가
    private String formatPhoneNumber(String rawPhoneNumber) {
        if (rawPhoneNumber == null || !rawPhoneNumber.startsWith("+82")) {
            return rawPhoneNumber; // 변환이 필요 없는 경우 원본 반환
        }
        rawPhoneNumber = rawPhoneNumber.replaceAll("\\s+", "");
        // +82 -> 0
        String localPhoneNumber = rawPhoneNumber.replace("+82", "0");

        return localPhoneNumber;
    }
  1. 입력값 검증
  • rawPhoneNumber가 null인 경우 → 변환 작업이 불필요하므로 그대로 반환.
  • rawPhoneNumber가 +82로 시작하지 않는 경우 → 이미 로컬 형식이거나 변환이 필요하지 않은 데이터로 간주하고 그대로 반환.
  1. 공백 제거

    국제 형식은 +82 다음 한칸의 공백이 존재합니다. (+82 10-1111-1111) 즉, +82 다음의 공백을 제거하는 작업을 진행했습니다.

  • 전화번호에 포함된 모든 공백(예: "+"와 숫자 사이의 공백, "010-1111-1111" 형식에서의 공백")을 제거.
  • 정규식을 사용하여 문자열에서 모든 공백(\s+)을 찾아 제거.
  1. +82 -> 0
  • 전화번호에서 국제 코드 +82를 한국 로컬 코드 0으로 대체.
  • 예: "+82 10-1111-1111" → "010-1111-1111"

getKakaoInfo메서드에 적용

    private KakaoResponseDto getKakaoInfo(String accessToken) {
        RestTemplate restTemplate = new RestTemplate();
        ObjectMapper objectMapper = new ObjectMapper();
        HttpHeaders headers = new HttpHeaders();

        headers.add("Authorization", "Bearer " + accessToken);
        headers.add("Content-type", "application/x-www-form-urlencoded;charset=utf-8");

        MultiValueMap<String, String> requestBody = new LinkedMultiValueMap<>();
        HttpEntity<?> entity = new HttpEntity<>(requestBody, headers);
        ResponseEntity<String> response = restTemplate.exchange(kakaoUserInfoUrl, HttpMethod.POST, entity, String.class);

        try {
            Map<String, Object> responseMap = objectMapper.readValue(response.getBody(), new TypeReference<Map<String, Object>>() {});
            Map<String, Object> kakaoAccount = (Map<String, Object>) responseMap.get("kakao_account");
            Map<String, Object> profile = (Map<String, Object>) kakaoAccount.get("profile");

            // 전화번호 변환
            String rawPhoneNumber = (String) kakaoAccount.get("phone_number");
            String formattedPhoneNumber = formatPhoneNumber(rawPhoneNumber);

            KakaoResponseDto responseDto = KakaoResponseDto.builder()
                    .name((String) kakaoAccount.get("name"))
                    .email((String) kakaoAccount.get("email"))
                    .phoneNum(formattedPhoneNumber)
                    .build();

            return responseDto;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

결과 확인

이렇게 카카오에서 사용자 정보를 받아올 때, 원하는 형식대로 저장을 시킬 수 있습니다.

profile
Development Record Page

0개의 댓글