본문 바로가기
Android/Project

[Cafe In] 기록 #2: Retrofit2

by YOONAYEON 2022. 3. 2.
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