OkHttp 와 Retrofit의 차이점과 적용

이수찬·2023년 5월 4일
0

1. OkHttp

  • Restful, HTTP통신을 간편하게 구현할 수 있도록 도와주는 java 오픈소스 라이브러리
  • 여러 옵션이 다수 존재하여 Http통신에 여러 옵션을 부여할 수 있다.
    (ex. 헤더 추가, 커넥션 타임아웃 추가...)

2. Retrofit

  • type safe한 HttpClient 라이브러리
    (type safe : 네트워크로 부터 전달받은 데이터를 자신이 필요한 형태의 객체로 받을 수 있다는 의미)
  • Retrofit은 OkHttp에 의존하고 있다.(내부적으로 OkHttp사용)
  1. OkHttp3 적용

<적용 순서>
3-1. KaKao Oauth를 통해 accessToken 얻기
3-2. 회원가입이 되어있으면, OkHttp를 통해 자동 회원가입을 하는 로직 수행
3-3. 회원이 아니면, OkHttp를 통해 Jwt를 부여하여, 자동로그인하는 로직 수행

  • gradle 설정
// okhttp3
	implementation group: 'com.squareup.okhttp3', name: 'okhttp', version: '4.10.0'
  • OkHttp3 소스 코드

3-1. KaKao Oauth를 통해 accessToken 얻기

String kakaoToken = getKakaoToken(code);
Member member = getMemberByKaKaoToken(kakaoToken);

3-2. 회원가입이 되어있으면, OkHttp를 통해 자동 회원가입을 하는 로직 수행

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();
  • jsonParser로 map을 jsonObject형태로 만듬.
  • RequestBody에 값을 넣기 위해 ObjectMapper를 통해 jsonObject를 String형태로 변환.
  • Request.Builer로 request를 보낼 url를 매핑하고, post방식으로 보낼 데이터 저장
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();
            }
  • OkHttpClient를 통해 request를 실행(execute를 해야 실행된다.)

3-3. 회원이 아니면, OkHttp를 통해 Jwt를 부여하여, 자동로그인하는 로직 수행

// 로그인
    JwtTokenDto jwtTokenDto = jwtTokenFactory.generateJwtToken(member);

    Map<String, Object> params = new HashMap<>();

    params.put("token", jwtTokenDto.getToken());
    params.put("expiredDateTime", jwtTokenDto.getExpiredDateTime());
  • 회원이므로 member객체를 통해 jwtTokenDto생성
  • map에 token의 정보를 담아 로그인을 위한 객체 생성
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();
  • 위와 동일하게 Request에 필요한 requestBody를 String형태로 변환한 후 통신할 url를 매핑해 Request객체 생성
       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();
        }
  • OkHttpClient를 통해 request객체를 매핑한 url에 보내 response객체를 받아온다.
  • Http통신이 정상적으로 수행되었다면, 로그인이 정상적으로 수행되었기에, jwtTokenDto를 반환한다.

0개의 댓글