RestTemplate을 통한 API 호출

크리링·2023년 6월 3일
0

오늘의 문제

목록 보기
5/9
post-thumbnail

이번주 간편 로그인을 구현하는데에 로그인한 유저의 정보와 유저가 체크한 약관 동의를 저장하는 데에 애를 먹었다. 그에 따른 문제 해결 과정을 적을 예정이다.






간편 로그인 과정

간편 로그인 처리 과정을 나열하자면 이렇다.

  1. 유저 간편 로그인
  2. 유저의 약관 동의
  3. 소셜 API에서 제공 받기로 약속한 유저 정보 받아 저장
  4. 유저의 약관 동의 정보 저장
  5. 기존 이메일 로그인과 동일한 페이지로 리다이렉트

내가 고전한 문제는 4번이었다.






소셜 로그인

기본적인 소셜 로그인 과정은 이러하다.

하지만 우리 서비스에는 기본적인 소셜 로그인에서 제공하는 이용약관 외에 선택 동의 여부를 묻는 이용약관이 따로 있다. 그래서 별도의 이용약관 조회가 필요하다.



소셜 로그인 이용약관

소셜 로그인의 이용약관 체크는 로그인시 유저의 정보와 같이 넘어오지 않고, 동의 여부를 확인하는 API로 로그인시 받은 AccessToken을 헤더에 담아 보내주어야 동의 여부 값을 받아올 수 있다.



문제 상황

여기서 문제는 내 얄팍한 지식으로는 유저의 소셜 정보와 동의 여부 정보를 두번의 API 조회를 할 수 없었다.



해결 과정

  • 소셜 AccessTokenrequest 헤더에 담아 리다이렉트를 동의 여부 API로 호출
    • 동의 여부 조회 저장 후 API를 우리 서버로 돌려놓는데 실패
  • AccessToken과 함께 프론트에 전달 후 프론트에서 이용약관 API 호출 후 값 저장
    • 자바스크립트 CORS 오류로 실패
  • RestTemplate 사용으로 우리 서비스에 리다이렉트 전에 이용약관 동의 호출 후 저장
    • 성공






RestTemplate

  • Spring에서 지원하는 객체로 간편하게 Rest 방식 API 방식 API를 호출할 수 있는 Spring 내장 클래스
  • Spring 3.0부터 지원, json, xml 응답 모두 가능
  • Rest API 서비스를 요청 후 응답 받을 수 있도록 설계



RestTemplate 동작 원리

  1. 애플리케이션 내부에서 REST API에 요청하기 위해 RestTemplate의 메서드를 호출
  2. RestTemplateMessageConverter를 이용해 Java objectrequest body에 담을 message(JSON etc.)로 변환 (메시지 형태는 상황에 따라 다름)
  3. ClientHttpRequestFactory에서 ClientHttpRequest를 받아와 요청을 전달
  4. ClientHttpRequestFactory가 HTTP 통신으로 요청을 수행
  5. RestTemplate이 에러 핸들링
  6. ClientHttpResponse에서 응답 데이터를 가져와 오류가 있으면 처리
  7. MessageConverter를 이용해 response body의 message를 java object로 변환
  8. 결과를 애플리케이션에 돌려준다.



RestTemplate 사용 방법

  1. 결과값을 담을 객체를 생성
  2. 타임아웃 설정시 HttpComponentsClientHttpRequestFactory 객체를 생성
  3. RestTemplate 객체를 생성
  4. header 설정을 위해 HttpHeader 클래스를 생성한 후 HttpEntity 객체 삽입
  5. 요청 URL을 정의
  6. exchange() 메소드로 api를 호출
  7. 요청한 결과를 HashMap에 추가






후기

이와 비슷해 보였던 상황 JWT Refresth 토큰을 통한 AccessToken 재발급 과정을 API 호출을 다시 못해 프론트에 도움을 받았었는데 RestTemplate를 사용하면 프론트의 도움 없이 AccessToken을 발급할 수 있을 것 같아 구현해보려고 한다.
아는게 힘이라는 생각이 또 드는 한주였다.



참고 및 출처

0개의 댓글