<적용 순서>
3-1. KaKao Oauth를 통해 accessToken 얻기
3-2. 회원가입이 되어있으면, OkHttp를 통해 자동 회원가입을 하는 로직 수행
3-3. 회원이 아니면, OkHttp를 통해 Jwt를 부여하여, 자동로그인하는 로직 수행
// okhttp3
implementation group: 'com.squareup.okhttp3', name: 'okhttp', version: '4.10.0'
String kakaoToken = getKakaoToken(code);
Member member = getMemberByKaKaoToken(kakaoToken);
Optional<Member> findMember = memberRepository.findByName(member.getName());
OkHttpClient client = new OkHttpClient();
// 회원가입
if (findMember.isEmpty()) {
Map<String, Object> params = new HashMap<>();
params.put("username", member.getName());
params.put("email", member.getEmail());
@Getter
public class SignUpRq {
private String username;
private String email;
}
회원이 아니라면, 회원가입에 필요한 username과 email정보(회원가입시 @RequestBody에 SignUpRq 사용)를 Map에 저장
참고) Map을 사용하지 않고, 아래와 같이 String 형태로 json형태를 만들어 사용해도 된다. 이 경우 ObjectMapper를 사용하지 않아도 된다.
String json = "{\r\n" +
" \"username\" : \""+member.getName()+"\",\r\n" +
" \"email\" : \""+member.getEmail()+"\",\r\n" +
"}";
JSONObject jsonObject = new JSONObject(params);
ObjectMapper objectMapper = new ObjectMapper();
String postBody;
try {
postBody = objectMapper.writeValueAsString(jsonObject);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
RequestBody requestBody = RequestBody.create(
okhttp3.MediaType.parse(APPLICATION_JSON),postBody);
Request.Builder builder = new Request.Builder().url(SIGN_UP_URL)
.post(requestBody);
Request request = builder.build();
Response response = null;
try {
response = client.newCall(request).execute();
} catch (IOException e) {
throw new RuntimeException(e);
}
if (response.isSuccessful()) {
log.info("회원가입 성공!");
return null;
} else {
throw new SignUpFailException();
}
// 로그인
JwtTokenDto jwtTokenDto = jwtTokenFactory.generateJwtToken(member);
Map<String, Object> params = new HashMap<>();
params.put("token", jwtTokenDto.getToken());
params.put("expiredDateTime", jwtTokenDto.getExpiredDateTime());
JSONObject jsonObject = new JSONObject(params);
ObjectMapper objectMapper = new ObjectMapper();
String postBody;
try {
postBody = objectMapper.writeValueAsString(jsonObject);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
RequestBody requestBody = RequestBody.create(
okhttp3.MediaType.parse(APPLICATION_JSON),
postBody);
Request.Builder builder = new Request.Builder().url(SIGN_IN_URL)
.post(requestBody);
Request request = builder.build();
Response response;
try {
response = client.newCall(request).execute();
} catch (IOException e) {
throw new RuntimeException(e);
}
if (response.isSuccessful()) {
log.info("로그인 성공");
return jwtTokenDto;
} else {
throw new SignInFailException();
}