Retrofit2
- REST통신 라이브러리
- AsyncTask없이 백그라운드 스레드 실행 → 콜백을 통해 메인스레드 UI에서 업데이트
- HttpUrlConnection의 반복 작업 간소화
- Annotation사용으로 코드의 가독성이 뛰어남
구성요소
- DTO (POJO) : Json타입변화에 사용
- Interface : 사용할 http CRUD메소드들을 정의해놓은 메소드
- Retrofit.Builder클래스 : baseUrl(url) / Converter 설정할 인터페이스 인스턴스
HTTP 요청
CRUD방식 | HTTP요청메소드 | 설명 |
Create | @POST | 정보 생성, body에 전송할 데이터를 담아서 서버에 생성 |
Read | @GET | 정보 조회, url에 정보 포함해서 전달 |
Update | @PUT | 정보 변경/수정, POST처럼 body에 데이터를 담아서 전송 |
Delete | @DELETE | 정보 삭제 |
Request Type
- GET : 정보 조회 요청
- POST : 정보 추가 요청
- DELETE : 정보 삭제 요청
- PUT : 정보 수정 요청
- PATCH : 정보 일부 수정요청
(→ PUT의 경우, 자원 전체를 갱신하는 의미지만, PATCH는 해당 자원의 일부를 교체하는 의미로 사용)
POST
- 서버에 데이터를 생성/추가하는 메소드
- 반복된 동일한 요청에 매번 다른 데이터 응답
- GET : 데이터를 모두 URL에 담아서 요청 (데이터 길이 제한O)
- POST : 데이터를 @BODY에 담아서 요청 (데이터 길이 제한X)
자바 객체를 통째로 전송 가능(Converter가 직렬화 담당)
GET
- 서버 내 데이터 조회 용도
- URL에 데이터를 모두 담아서 전송
- URL의 길이 제한 존재
- 변경X, 단순 조회 용도 (반복되는 동일 요청에 동일한 데이터를 응답)
사용 방법
1. Gradle의존성 추가
dependencies{
//retrofit 라이브러리
implementation 'com.squareup.retrofit2:retrofit:2.6.4'
//gson변환기 라이브러리
implementation 'com.squareup.retrofit2:converter-gson:2.6.4'
// scalars변환기 라이브러리
implementation 'com.squareup.retrofit2:converter-scalars:2.6.4'
}
2. Manifest에 internet 허용 퍼미션 추가
<uses-permission android:name="android.permission.INTERNET"/>
3. DTO class 선언
- 서버의 변수명과 동일 or @SerializedName()으로 직접 매핑
public class user {
private String socialId;
private String name;
private String profileImage;
private String backImage;
public String getSocialId(){
return socialId;
}
public void setSocialId(String socialId){
this.socialId = socialId;
}
//그 외 생성자, setter, getter 필요한만큼 선언..
4. 사용 api를 선언해두는 Interface 생성
- Call객체를 통해 웹 서버에 요청을 보낼 수 있다.
- HTTP요청 작업을 어노테이션으로 명시해둠
- 객체는 @Body를 이용하여 json으로 전달함
public interface MyAPI{
@POST("/posts/")
Call<user> insertUser(@Body User user);
@GET
Call<List<User>> getUser();
@GET("/posts/{pk}/")
Call<User> getUserBypk(@Path("pk") int pk);
4. 레트로핏 통신을 수행할 액티비티 클래스에서 동작 구현
- Retrofit객체를 생성한 후, 이 객체를 이용하여 앞서 만든 MyAPI class를 연결한다.
//MainActivity 내부
private final String BASE_URL = "해당 서버의 base url";
priavet MyAPI m;
onCreate(){
createMyAPI(BASE_URL);
}
private void createMyAPI(String baseUrl){
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.creat())
.build();
m = retrofit.create(MyAPI.class);
}
5. 응답 주고 받기
//MainActivity 내부
public void onClick(View v){
if(v == GET통신 버튼){
Call<List<User>> getCall = m.getUser();
getCall.enqueue(new Callback<List<User>>()){
//통신 성공
@override
public void onResponse(Call<List<User>> call, Response<List<User>> response){
if(response.isSucessful())
//응답이 잘 넘어옴
else
//응답오류, status code확인
}
//통신 실패
@override
public void onFailure(Call<List<User>> call, Throwable t){
}
}
}
}
참고 링크
[안드로이드] Retrofit2 @Body @Field 차이
프로젝트에서 AWS와 노드로 서버를 구성하고 안드로이드 클라이언트 Retrofit2 통신에서 평소 @Field를 사용했는데, 계속 Json으로 서버에서 못받고 이상한 값이 넘어오는 현상이발생했다. 서버문제
youngest-programming.tistory.com
[안드로이드] Retrofit2 '레트로핏' - 기본 사용법
Retrofit2 - REST API 통신 라이브러리 'Retrofit' - REST통신 라이브러리 기본 개념 & 사용법 통신 라이브러리 중 가장 많이 사용되는 대표적인 라이브러리 ( Squareup 사의 라이브러리) Retrofit 이란? REST API..
jaejong.tistory.com
'Android > Project' 카테고리의 다른 글
[Cafe In] 기록 #4: 애뮬레이터에 테스트용 사진 넣기 (0) | 2022.06.27 |
---|---|
[Cafe In] 기록 #3: 자동 로그인 구현 (0) | 2022.06.27 |
[Cafe In] 기록 #1 (0) | 2022.02.17 |
ViewPager2의 Fragment 데이터 받기 (Bundle 이용) (0) | 2021.08.07 |
Spinner & DatePicker 사용해 시간/날짜 입력받기 (0) | 2021.08.05 |