12일차에 진행하던 것을 이어서 진행하려합니다.
서버끼리 통신하는 것을 작성하려던 중 RestTemplate와 FeignClient 중 고민을 했습니다. RestTemplate는 Spring에 내장되어있으며 크게 단점이라할 것이 없는 것 같았습니다. FeignClient는 이번에 찾다가 알게되었는데 Netflix에서 개발된 Http client binder라고 나옵니다. 찾다보니 MSA에 최적화되도록 설계되었다는 것같고 interface로 구현체 없이 만들어지는 것이 깔끔하고 보기 좋았습니다. 관심사 분리도 결정하게 된 큰 이유인 것같습니다.
RestTemplate라면 함수 내부에 요청 메세지들을 작성하고 이래야하는데 따로 분리하여 가져올 수있습니다. @EnableFeignClients를 해줌으로써 @FeignClient를 Bean화 시키는 것으로 보였습니다.
하지만 버전에 적용할 수 있나 없나 확인을 해보는 중 Spring Cloud 버전 영향을 받아서 3.3에 사용을 하지못하나했는데 마침 7월에 3.3을 지원하는 업데이트를 했어서 4.1.0로 시작을 하니 3.2.x로 마이그레이션이 필요하다해서 최신 버전인 4.1.3으로 수정하니 작동을 했습니다.
@FeignClient(value = "kakaoAuthApi", url = "https://kauth.kakao.com", configuration = {FeignConfiguration.class})
public interface KakaoAuthApi {
/**
* Access Token을 카카오 서버에 요청
* @param clientId REST API Key
* @param clientSecret Client Secret Key
* @param grantType authorization_code 으로 고정된 값
* @param redirectUri 프론트엔드에서 리다이렉트된 URI과 일치해야 됨
* @param code 프론트엔드에서 인가된 코드 값
* @return <a href="https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api#request-token-response-body">토큰 정보</a>
*/
@PostMapping("/oauth/token")
ResponseEntity<String> getAccessToken(@RequestParam("client_id") String clientId,
@RequestParam("client_secret") String clientSecret, @RequestParam("grant_type") String grantType,
@RequestParam("redirect_uri") String redirectUri, @RequestParam("code") String code);
}
요청된 값을 전달해서 accessToken을 전달받은 뒤 https://kapi.kakao.com/v2/user/me
에 유저 정보를 요청합니다.
이제 해당 정보들을 가지고 회원가입 된 유저가 없다면 회원가입을 자동으로 시킨 뒤, 소셜 계정 정보를 담는 entity를 하나 더 제작하려합니다.