프로젝트를 진행하면서 다음과 같은 문제 상황에 직면했습니다.
일반 회원가입에서는 사용자의 전화번호를 한국 로컬 형식(예: 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;
}
국제 형식은 +82 다음 한칸의 공백이 존재합니다. (+82 10-1111-1111) 즉, +82 다음의 공백을 제거하는 작업을 진행했습니다.
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;
}
}
이렇게 카카오에서 사용자 정보를 받아올 때, 원하는 형식대로 저장을 시킬 수 있습니다.
