본문 바로가기
Network

Retrofit POST, GET 을 사용해보자.

by RyanGomdoriPooh 2016. 11. 14.

일단 Retrofit이 무엇인가 에 대해서 이야기를 해보겠습니다.




Retrofit은 Android/JAVA용으로 개발된 오픈 소스 Request 라이브러리입니다.


주로 API Server에 원하는 RESTful API에 맞는 요청을 할 때, 사용이 됩니다.


주된 기능은 RDBMS에서 대표적으로 요청이 오면 처리하는 CRUD 기능 요청을 할 수 있게 제공해줍니다.


1) Create

- POST Request를 통해서 이용 가능.

- 주로 새로운 데이터를 생성을 하는 경우 사용합니다.


2) Update

- PUT Request를 통해서 이용 가능.

- 주로 데이터를 수정하는 경우 사용합니다.


3) Read

- GET Request를 통해서 이용 가능.

- 주로 데이터를 읽는 경우 사용합니다.


4) Delete

- DELETE Request를 통해서 이용 가능.

- 주로 생성되어있는 데이터를 삭제하는 경우 사용합니다.



* Retrofit은 RESTful API에서 많이 사용하는 Format인 JSON/XML을 사용하기 위한 라이브러리를 지원합니다.

지원하는 라이브러리는 Gson, Jackson, Moshi, Wire, Simple XML, Scalars 등이 있습니다.


Retrofit은 좋은 퍼포먼스를 내기위해서 최적화되어있고, Gson을 사용합니다.


저같은 경우에 이 retrofit을 모를 때는 직접 안드로이드에서 사용할 수 있는 라이브러리은 HttpUrlConnection을 사용했습니다.


모듈을 만들어서 사용했지만, 일관된 디자인 패턴이 없었기 때문에 모듈 별로 다 다른 소스 코드로 재사용이 힘들었습니다.


HttpUrlConnection이 Low한 라이브러리라서 물론 잘 활용해서 원하는 모듈을 만들면 좋은 퍼포먼스를 낼 수 있지만,


대부분의 사용자들은 저처럼 좋은 모듈을 만들어 사용할 수 없는 분들이 많으실 겁니다.


그래서 좋은 라이브러리를 찾으려고 노력한 결과 Retrofit을 찾게되었습니다.



* Retrofit의 장점

1) 서버를 향해서 네트워크 통신 연결/해제에 대해서 체계적으로 다뤄줘야하는데, 이러한 관리를 해줍니다.

2) 서버로 연결이 된 후에는, 요청을 데이터 Format에 맞춰서 요청해 주고, 데이터를 parsing하여 응답을 받을 수 있습니다.

3) 데이터를 가져와서 각종 parsing 라이브러리를 통해서 원하는 요구에 맞게 사용이 가능합니다.

4) 각종 에러처리를 원활하고 쉽게 해줍니다.



지금 까지 Retrofit에 대한 설명과 장점에 대해서 이야기를 끝냈기 때문에,


실제 안드로이드에서 사용하는 방법에 대해서 설명하겠습니다.


아주 간단합니다. 일단 사용하는 방법에 대한 순서를 알려드리겠습니다.


일단 왼쪽 Project의 Android를 들어갑니다.


1) manifests에 INTERNET 퍼미션을 허락해줍니다.

2) Gbuild.gradle(Module:app) 안으로 들어가서 dependencies 안에 라이브러리를 넣어줍니다.

3) Android Studio 탭 중에서 Build로 들어가서 "Rebuild Project"를 해주면 이제 Retrofit을 사용할 준비는 마쳤습니다.


4) 지금 부터는 사용을 하면 됩니다. Retrofit은 어노테이션을 사용합니다. 쉽게 여기서는 지능형 주석을 이용해서 파라미터를 관리하는 방식으로 사용합니다.


5) 저 같은 경우에는 interface를 사용해서 API 요청부분과 URL은 따로 관리하겠습니다. 다음과 같은 ApiService interface를 만들었습니다.

- 이거 저거 형식없이 만들어 놓았지만 설명해야할 예는 다 있습니다.


- 일단 Resource Path와 Query의 구분은 "?"로 합니다. 또한 "{ }" 안에 들어가는 값은 변수라고 보시면 됩니다. 바뀔 수 있습니다.


- Path는 "[프로토콜]://[URL]/[Resource Path]" 로 구성되고, Query는 "[key]=[value]&[key]=[value]&..." 형식으로 사용됩니다.


- Path와 Query를 합쳐서 사용하는데 다음과 같습니다.

" [프로토콜]://[URL]/[Resource Path]?[key]=[value]&[key]=[value]&... "


- 이제 번호 별로 설명을 시작하겠습니다.


- 1번은 "https://www.naver.com/api/dogs?name=파라미터" 에 GET형식 Request를 하는데, "name" query에 int name 파라미터로 전달하여 요청합니다.


- 2번은 "https://www.naver.com/api/dogs" Path에 POST형식으로 Request를 하는데, 아무 요청 값 없이 요청을 하는 부분이구요.


- 3번은 "https://www.naver.com/api/dogs/name2?testquery=[testquery 파라미터]" Path에 1번과 마찬가지로 GET 요청합니다.


- 4번은 "https://www.naver.com/api/dogs/[testpath 파라미터]?query=[testquery 파라미터]" 로 GET 요청하고, {name}부분의 name은 변수로써 바뀔 수 있습니다.


- 5번은 "https://www.naver.com/api/dogs/[testpath 파라미터]" 로 PUT 요청을 합니다. 마찬가지로 {name}부분은 변수로 바뀔 수 있습니다.



6) 이제 interface를 다만들었으니까 실제 값을 넣어서 사용하는 방법에 대해서 알아보겠습니다.

- Global Variable로 Retrofit Class, ApiService Class의 object를 생성합니다.


7) onCreate 메서드 안에 retrofit의 객체에 Request를 전달할 URL을 넣어서 생성합니다. 그리고 GET,POST와 같은 service를 사용하기 위해서 생성을 합니다.


8) 그리고 위에서 만들었던 interface의 1번 메서드를 이용해서 호출합니다.

- 바로 위에서 만들었던 apiService object를 이용해서 getComment 메서드에 정수 1을 파라미터로 전달해서 호출합니다.

- 그리고 enqueue해서 onResponse 메서드를 이용해서 response object로 응답을 전달받아서 Request에 대한 결과를 돌려 받을 수 있습니다.


9) 이런식으로 호출을 하고 저같은 경우에는 개발해야하는 아키텍쳐에 따라서 함수를 만들어서 클래스를 구성해서 사용하는 것을 추천합니다.



이상으로 Retrofit POST, GET 사용에 대한 설명을 마치겠습니다.


'Network' 카테고리의 다른 글

쿠키와 세션 개념  (108) 2021.10.11
OAuth의 개념과 원리  (8) 2016.11.23
Retrofit POST, GET 을 사용해보자.  (5) 2016.11.14
네트워크 전송 GET, POST 비교  (11) 2016.11.11

댓글5

  • 2018.03.14 02:31

    비밀댓글입니다
    답글

    • 안녕하세요.
      URL에 리소스 path 뒤에 붙여서 보내고 싶으신건가요?
      예를 들면, http://도메인/bbs/login_check.php?mb_id="11"&mb_password="3829"
      이런 방식을 원하시는 건가요? 이 방식은 추천 안드리구요.
      사실 위 두 중요한 정보는 header에 담아 보내시는 게 좋을 거에요.
      다음과 같은 방식으로 key, value를 보내시는게 좋다고 생각합니다.
      다음은 예시입니다.
      @GET("/user")
      Call<User> getUser(@Header("Authorization") String authorization)

      ref) http://devflow.github.io/retrofit-kr/

  • 2018.10.11 16:16

    비밀댓글입니다
    답글

  • 박채윤 2019.03.13 11:11

    안녕하세요 문의드리려고 글남깁니다. 혹시, get이든 post든 어떠한 여러가지 값(ex.feild)를 주거나 클래스 (ex.User)를 API로 전달하고
    완료되는 확인만을 원하는데,
    저러한 값들은 따로 주고 String으로 한가지 값만 콜백 받는것도 가능한건지요?
    제가 알고있는건 주는 클래스가 EX.User가 ID,비번,토큰 이렇다면 받는것도 똑같이 저렇게 받아올수 밖에 없는것 같은데
    DB와 비교하여 성공이면1, 실패이면 0을 던지는 API를 만들었다 하면 받아오는 방법을 알려주실수있나요
    답글

    • 안녕하세요.
      일단 Retrofit API는 Restful API Design으로 구현된 API를 호출하는데에 도와주는 라이브러리라고 보면됩니다.

      말씀하신게 어쨌든 API를 호출하고 나서 성공여부를 True, False로 받는 것을 말씀하시는 것으로 제가 이해했는데.

      일단 가능한 부분이구요.
      모든 Requst는 결과를 Response에 Body로 받게됩니다. 내용이 있는 경우도 있고 없는 경우도 있지만 항상 Body라는 것은 존재합니다.

      Body로 성공 유무만 원하신다면 서버에서 요청에 대한 결과물로 JSON형식으로 { "isSuccess": true } 와 같은 방식으로 보내시고 Client에서 Call<ResponseBody> 부분의 ReponseBody Class에 isSuccess라는 프로퍼티를 만드셔서 파싱하셔서 쓰시면 될 것으로 보이네요.
      다른 방법으로는 Header에서 Status code를 받아서 쓰시는 방법이 있는데 그건 구글링 해보시길 권합니다 ㅎㅎ