기본 설정 및 필드 정의

@Service
- 이 클래스가 서비스 컴포넌트임을 나타냄
- Spring에 의해 관리되는 빈(bean)으로 등록됨
- 서비스 계층에서 비즈니스 로직을 처리하는 역할을 함
@RequiredArgsConstructor
- Lombok 애노테이션으로, final 필드를 포함하는 생성자를 자동으로 생성
- 를 통해 의존성 주입을 쉽게 할 수 있음
private final String KAUTH_TOKEN_URL =
private final String KAPI_USER_INFO_URL =
- 카카오 API 요청을 위해 필요한 토큰 발급 URL과 사용자 정보 조회 URL을 상수로 선언
엑세스 토큰 발급 메서드

- 카카오 API를 사용, 인가 코드를 통해 엑세스 토큰을 발급받음
- KakaoTokenResponseDto 객체를 이용해 카카오 서버에서 받은 응답을 처리
- WebClient를 통해 비동기 HTTP POST 요청을 냄
public String getAccessTokenFromKakao(String code)
- 카오에서 발급받은 인가 코드(code)를 전달받음
- 이 코드는 클라이언트에서 카카오 로그인 후 리다이렉트되는 페이지에서 받을 수 있음
- 발급된 액세스 토큰을 문자열 형태로 반환
WebClient.create(KAUTH_TOKEN_URL).post()
- WebClient는 Spring WebFlux에서 제공하는 비동기 HTTP 요청을 처리하는 클라이언트
WebClient.create(KAUTH_TOKEN_URL)
- 카카오 인증 서버로 요청을 보내기 위해, KAUTH_TOKEN_URL에 대한 클라이언트를 생성
post()
uri(uriBuilder -> uriBuilder
- URI 빌더를 통해 요청할 경로와 쿼리 파라미터를 설정
.path("/oauth/token")
- 카카오 API 토큰 발급 엔드포인트
- 이 경로로 POST 요청을 보냄
ueryParam("grant_type", "authorization_code")
queryParam("client_id", clientId)
- 카오 API의 클라이언트 ID를 쿼리 파라미터로 추가.
이 값은 application.properties에서 주입된 clientId임
queryParam("redirect_uri", redirectUri)
queryParam("code", code)
retrieve()
- 설명: HTTP 요청을 보내고, 응답을 받아 처리하는 단계
- 카카오 서버로부터의 응답을 처리할 준비
bodyToMono(KakaoTokenResponseDto.class)
- 응답 본문을 KakaoTokenResponseDto 객체로 변환하는 작업
block()
- 비동기 흐름을 동기 방식으로 바꿔, 해당 작업이 완료될 때까지 대기
return kakaoTokenResponseDto.getAccessToken()
- 카카오 서버에서 받은 응답으로부터 액세스 토큰을 가져와 반환

public KakaoUserResponseDto getUserInfoFromKakao(String accessToken)
- 액세스 토큰을 이용해 카카오 API에서 유저 정보를 가져오는 기능
- accessToken : 로그인 후 발급받은 액세스 토큰
- 사용자 정보를 담은 KakaoUserResponseDto 객체를 반환
WebClient.create(KAPI_USER_INFO_URL).get()
- WebClient는 Spring WebFlux에서 제공하는 비동기 HTTP 요청 클라이언트
- 사용자 정보 조회 API 엔드포인트(KAPI_USER_INFO_URL)**를 사용해 WebClient 인스턴스를 생성
- get(): HTTP GET 요청 사용자 정보를 가져오는 카카오 API는 GET 요청을 사용
.headers(headers -> headers.setBearerAuth(accessToken))
- HTTP 헤더에 액세스 토큰을 인증 헤더로 설정
- setBearerAuth(accessToken): Bearer 토큰 방식으로 OAuth 2.0에서 사용됨
retrieve()
- HTTP 요청을 보낸 후 응답을 수신하는 메서드
bodyToMono(KakaoUserResponseDto.class)
- 응답 본문을 KakaoUserResponseDto 객체로 변환하는 작업
block()
- 비동기 요청을 동기적으로 처리하여 결과를 반환하는 메서드