공삼
article thumbnail


REST API란?

 

쉽게 설명하면 REST API는 인터넷에 연결되어 있는 애플리케이션 과 서버가 통신하기 위해 정해놓은 규칙이다.

 

형식에 맞춰 정보를 요청하면 그에 해당하는 정보를 받아올 수 있게 도와주는 통신을위한 아키텍처 스타일 중 하나이다.

 

Rest API는 Representational State Transfer API의 약어로, REST 아키텍처 스타일을 따른다. 

 

GET, POST, PUT, DELETE 등 표현의 개념을 사용하여 클라이언트와 서버간의 통신을 설계한다. 

 

 

비슷한 용어로 RESTful API가 있다. 

 

 

RESTful API란?

RESTful API는 쉽게말해 REST API를 더욱 엄격하게 지키는 API를 이야기 하며, 표현 뿐만 아니라 HTTP 상태 코드사용, 캐싱등의 RESTful한 설계원칙을 따른다. 

 

 

 

여기서 쉽게 REST API를 이해하고 넘어가면 좋을 것 같다. 

https://www.youtube.com/watch?v=iOueE9AXDQQ 

출처: 얄팍한 코딩사전님 영상

 

 

 


Retrofit API란? 

RESTful 웹서비스를 이용하는 라이브러리중 하나이다. 안드로이드 애플리케이션에서 이용 할 수 있고, OkHttp 라이브러리를 기반으로 한다.

 

쉽게말해 Retrofit API는 Android 애플리케이션 환경에서 RESTful API를 쉽게 사용할 수 있도록 만든 라이브러리로, JSON, XML 등 다양한 형식으로 데이터를 처리하는 라이브러리이다. 

 

 

Android Studio로 예를 들어 RetrofitAPI 통신하는 방법은 먼저 Gradle에 RetrofitAPI를 추가해준다. 

implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'

 

그후 retrofitapi 를 import 시켜 해당 형식에 맞춰서 작성하면 된다. 

import com.diary.bermuda.dto.DiaryDto;
import com.diary.bermuda.dto.CommonResult;

import retrofit2.Call;
import retrofit2.http.Body;
import retrofit2.http.POST;

public interface ApiService {

    @POST("/api/diary")
    Call<CommonResult> createDiary(@Body DiaryDto.DiaryCreateDto diaryCreateDto);
    
}

POST를 이용해 server의 /api/diary 위치로 찾아가는 형식이다. 

 

POST 형식을 이용했기 때문에 @Body를 이용해 바디안에 Dto 데이터들을 담고 간다. 

 

Call<CommonResult>는 응답이 오면 받는 곳으로 주로 응답받은 code, 성공여부, message 등을 받는다. 

 

 

 

import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class Main {
    public static void main(String[] args) {
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://example.com")
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        ApiService service = retrofit.create(ApiService.class);

        Call<User> call = service.getUser(1);
        call.enqueue(new Callback<User>() {
            @Override
            public void onResponse(Call<User> call, Response<User> response) {
                if (response.isSuccessful()) {
                    User user = response.body();
                    System.out.println(user.getName());
                } else {
                    System.out.println("Error: " + response.code());
                }
            }

            @Override
            public void onFailure(Call<User> call, Throwable t) {
                System.out.println("Error: " + t.getMessage());
            }
        });
    }
}

 

Retrofit 객체를 생성해주고 baseUrl 에 통신할 주소를 입력한다. 서버 IP주소 및 포트번호를 입력하기도 한다. 

 

 

ApiService service = retrofit.create(ApiService.class);

ApiService 인터페이스를 create 메소드를 사용하여 객체를 생성하면 내부적으로 HTTP요청을 생성하고 실행한다. 

 

 

예를들어

@(GET("/api/diary"} )  가 있으면 create메소드가 HTTP요청을 내부적으로 생성해 Call<CommonResult> 객체를 반환하여 원하는 값을 받아오게 된다. 

 

 


 

Call<T> 는 제네릭 타입으로 <T>는 서버로부터 받아온 데이터를 포함하는 모델 클래스를 의미한다. 

 

서버에서 응답해준 정보를 담고있는 것이다. 

 

Call<T> 객체는 execute()와 enqueue() 메소드를 제공하는데 

 

execute() 는 API 호출을 동기적으로 실행하고 결과를 반환하는 반면

 

enqueue() 는 비동기적으로 API 호출을 실행하고 결과를 콜백 형태로 처리한다. 

 

 

Retrofit은 자동으로 백그라운드 스레드에서 API 호출을 실행하므로 대부분의 경우 enqueue() 메소드를 사용하는 것이 좋다. 

 

 

 

'CS > Mobile' 카테고리의 다른 글

(Flutter) 일본 1위 배달앱 의 리팩토링  (1) 2023.03.12
Android fragment는 react의 SPA와 같을까?  (0) 2023.03.06
profile

공삼

@g_three

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!