Categories: Java

Java에서 REST API 호출하는 방법 (Retrofit, OkHttp 활용)

안녕하세요, 여러분! 요즘 REST API 많이들 사용하시죠? 🙋‍♀️ 저도 개발하면서 정말 자주 사용하는데요, Java에서 REST API를 호출하는 효율적인 방법들을 함께 알아보면 좋을 것 같아서 이렇게 글을 쓰게 됐어요! 😄

특히 `Retrofit``OkHttp`는 Java에서 REST API를 다룰 때 정말 유용한 라이브러리들이에요. REST API를 처음 접하시는 분들은 어떤 라이브러리를 써야 할지 고민되실 수도 있을 거예요. 🤔 걱정 마세요! 제가 여러분의 궁금증을 해결해 드릴게요. Retrofit과 OkHttp를 사용하는 방법부터 각각의 장단점, 그리고 실제로 API를 호출하는 예제까지 차근차근 설명해 드리겠습니다. 자, 그럼 Java 세계에서 REST API를 마스터하는 여정을 함께 시작해 볼까요? 🚀

 

 

Retrofit 시작하기

자, 이제 드디어!! 두근두근 Retrofit을 시작해 볼까요? Retrofit은 마치 멋진 레스토랑 셰프처럼, 복잡한 REST API 호출 과정을 깔끔하고 우아하게 만들어주는 마법 같은 라이브러리예요. 마치 마법의 지팡이를 휘두르듯, 몇 줄의 코드만으로 API 서버와 데이터를 주고받을 수 있답니다! ✨

Retrofit 라이브러리 추가

Retrofit을 사용하려면 먼저 프로젝트에 추가해야겠죠? Gradle을 사용한다면 build.gradle 파일의 dependencies 블록에 다음과 같이 추가해 주세요. 버전은 항상 최신 버전을 확인하는 센스! 잊지 마세요~?

dependencies {
implementation 'com.squareup.retrofit2:retrofit:2.9.0' // Retrofit 기본 라이브러리!
implementation 'com.squareup.retrofit2:converter-gson:2.9.0' // JSON 변환을 위한 Gson 컨버터!
}

Gson 컨버터는 JSON 형태의 데이터를 Java 객체로, 또는 그 반대로 변환해주는 역할을 해요. 마치 통역사처럼 말이죠! 🗣️ 물론 다른 컨버터들도 있지만, Gson이 널리 사용되고 성능도 좋으니 Gson을 사용하는 것을 추천드려요! 👍 (Jackson이나 Moshi도 훌륭한 선택이랍니다!)

Retrofit 객체 생성

자, 이제 라이브러리를 추가했으니, Retrofit 객체를 생성해 봅시다. 마치 레스토랑에 주문을 넣기 전에 메뉴판을 펼치는 것과 같아요. 😋

Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.example.com/") // API 서버의 기본 URL! 잊지 마세요!
.addConverterFactory(GsonConverterFactory.create()) // Gson 컨버터를 사용할 거예요!
.build();

baseUrl에는 API 서버의 기본 URL을 지정해요. 예를 들어, 모든 API 엔드포인트가 https://api.example.com/로 시작한다면, 이 부분에 https://api.example.com/를 넣어주면 돼요. 마치 레스토랑의 주소를 적어두는 것과 같죠! 📍 그리고 addConverterFactory 메서드를 사용하여 Gson 컨버터를 추가했어요. 이제 Retrofit은 Gson을 사용하여 JSON 데이터를 처리할 수 있게 되었답니다.

API 인터페이스 정의

이제 API 인터페이스를 정의해야 해요. 이 인터페이스는 마치 레스토랑의 메뉴판과 같아요. 어떤 메뉴(API 엔드포인트)를 주문할 수 있는지 알려주는 역할을 하죠. 📖 예를 들어, /users 엔드포인트에서 사용자 목록을 가져오는 API를 호출하려면 다음과 같이 인터페이스를 정의할 수 있어요.

interface UserService {
@GET("/users") // GET 요청을 보낼 엔드포인트!
Call<List<User>> getUsers(); // User 객체의 리스트를 반환하는 Call 객체!
}

@GET 어노테이션은 HTTP GET 요청을 사용한다는 것을 나타내고, /users는 API 엔드포인트를 지정해요. Call<List<User>>는 비동기적으로 API를 호출하고 결과를 List<User> 형태로 받아온다는 것을 의미해요. 마치 메뉴판에서 “사용자 목록” 메뉴를 고르는 것과 같죠! 🍕

API 인터페이스 구현체 생성

이제 Retrofit 객체를 사용하여 API 인터페이스의 구현체를 생성할 수 있어요.

UserService userService = retrofit.create(UserService.class);

이렇게 하면 userService 객체를 통해 API를 호출할 수 있게 돼요! 마치 레스토랑에서 주문을 하는 것과 같죠! 🛎️ 다음 소제목에서는 OkHttp의 기본 사용법에 대해 알아볼 거예요! 기대해 주세요! 😉 (Retrofit과 OkHttp는 환상의 짝꿍이랍니다!)

 

OkHttp 기본 사용법

Retrofit과 함께 Java에서 REST API를 호출하는 강력한 도구, OkHttp! 드디어 OkHttp에 대해 알아볼 시간이에요~! Retrofit을 멋지게 활용하려면 OkHttp에 대한 이해가 필수거든요. 마치 맛있는 케이크를 만들려면 좋은 오븐이 필요한 것처럼 말이죠! OkHttp는 HTTP 클라이언트로, 네트워크 요청을 보내고 응답을 받는 모든 과정을 담당해요. Retrofit은 이 OkHttp를 기반으로 만들어졌기 때문에, OkHttp를 잘 이해하면 Retrofit을 더욱 효과적으로 사용할 수 있답니다.

OkHttpClient 객체 생성

자, 그럼 OkHttp의 기본적인 사용법을 살펴볼까요? 먼저, OkHttpClient 객체를 생성해야 해요. 이 객체는 HTTP 요청을 처리하는 핵심 역할을 하죠. 마치 우리 몸의 심장처럼 중요한 역할을 한다고 생각하면 돼요! OkHttpClient 객체는 싱글톤 패턴으로 생성하는 것이 좋습니다. 왜냐하면 여러 개의 객체를 생성하면 리소스 낭비가 발생할 수 있거든요. 마치 한 집에 여러 개의 냉장고가 있는 것과 같은 낭비죠!

OkHttpClient client = new OkHttpClient.Builder()
        .connectTimeout(10, TimeUnit.SECONDS) // 연결 시간 제한 설정 (10초)
        .readTimeout(30, TimeUnit.SECONDS) // 읽기 시간 제한 설정 (30초)
        .writeTimeout(15, TimeUnit.SECONDS) // 쓰기 시간 제한 설정 (15초)
        .build();

위 코드에서 connectTimeout(), readTimeout(), writeTimeout() 메서드를 사용해서 연결, 읽기, 쓰기 시간 제한을 설정했어요. 시간 제한 설정은 네트워크 문제 발생 시 애플리케이션이 무한정 대기하는 것을 방지하는 아주 중요한 역할을 해요. 마치 시한폭탄의 폭발 시간을 설정하는 것처럼 중요하죠! TimeUnit은 시간 단위를 설정하는 데 사용되며, SECONDS는 초 단위를 나타내요. 밀리초(MILLISECONDS), 분(MINUTES) 등 다양한 단위를 사용할 수 있으니 상황에 맞게 적절히 사용하면 돼요.

Request 객체 생성

이제 Request 객체를 생성해야 해요. Request 객체는 HTTP 요청에 대한 정보를 담고 있어요. URL, 헤더, 요청 메서드(GET, POST, PUT, DELETE 등)와 같은 정보들이 여기에 포함되죠. 마치 편지를 보낼 때 주소, 제목, 내용을 적는 것과 같아요!

Request request = new Request.Builder()
        .url("https://www.example.com/api/users") // 요청 URL 설정
        .header("Authorization", "Bearer your_token") // 헤더 추가
        .get() // GET 요청 메서드 설정
        .build();

위 코드에서는 url() 메서드를 사용하여 요청 URL을 설정하고, header() 메서드를 사용하여 헤더를 추가했어요. get() 메서드는 GET 요청 메서드를 설정하는 역할을 해요. POST, PUT, DELETE 등 다른 요청 메서드를 사용하려면 post(), put(), delete() 메서드를 사용하면 돼요. 참 쉽죠?!

요청 보내기

이제 드디어 요청을 보낼 차례예요! OkHttpClientnewCall() 메서드에 Request 객체를 전달하고, execute() 메서드를 호출하면 요청을 보낼 수 있어요. 마치 우체통에 편지를 넣는 것과 같아요!

try (Response response = client.newCall(request).execute()) {
    if (response.isSuccessful()) {
        String responseBody = response.body().string();
        // 응답 처리
        System.out.println(responseBody);
    } else {
        // 오류 처리
        System.out.println("Error: " + response.code());
    }
} catch (IOException e) {
    // 예외 처리
    e.printStackTrace();
}

execute() 메서드는 Response 객체를 반환해요. 이 객체에는 응답 코드, 응답 헤더, 응답 본문과 같은 정보들이 담겨 있죠. 마치 답장을 받은 것과 같아요! isSuccessful() 메서드를 사용하여 응답이 성공적인지 확인할 수 있어요. 응답 코드가 200 ~ 299 사이이면 성공적인 응답으로 간주해요. 응답 본문은 body().string() 메서드를 사용하여 문자열로 읽어올 수 있어요. 만약 요청이 실패하면 response.code()를 통해 오류 코드를 확인할 수 있답니다! try-with-resources 문을 사용하여 Response 객체를 자동으로 닫아주는 것도 잊지 마세요! 자원 누수를 방지하는 좋은 습관이랍니다.

자, 이제 OkHttp의 기본적인 사용법을 모두 알아봤어요! 어때요, 생각보다 간단하죠? 다음에는 Retrofit과 OkHttp의 장단점을 비교해보면서, 각각의 라이브러리가 어떤 상황에 더 적합한지 알아볼게요! 기대해주세요~!

 

두 라이브러리의 장단점 비교

RetrofitOkHttp, 둘 다 Java에서 REST API를 호출하는 데 널리 쓰이는 강력한 라이브러리들이죠? 각자의 매력이 뚜렷해서 어떤 걸 선택해야 할지 고민될 때가 많아요. 마치 짬뽕과 짜장면 사이에서 갈등하는 것처럼 말이에요! 그래서! 지금부터 각 라이브러리의 장단점을 꼼꼼히 비교해 드릴게요. 어떤 상황에서 어떤 라이브러리가 더 적합한지, 콕 집어 알려드릴 테니 잘 따라와 주세요!

Retrofit: 우아함과 편리함의 대명사

Retrofit은 마치 잘 재단된 맞춤 양복처럼, API 인터페이스를 정의하고 사용하는 데 있어서 정말 우아하고 편리해요. Annotation을 사용해서 API 엔드포인트를 깔끔하게 표현할 수 있고, POJO(Plain Old Java Object)를 활용해서 데이터 매핑도 자동으로 처리해주니 얼마나 편한지 몰라요! 마치 마법같죠?! 게다가 RxJava, Coroutine 같은 비동기 처리 라이브러리와의 통합도 정말 매끄러워서 복잡한 네트워크 작업을 간편하게 처리할 수 있답니다.

Retrofit의 장점

  • 간결하고 직관적인 코드: Annotation 기반의 인터페이스 정의로 코드가 깔끔하고 읽기 쉬워 유지보수가 용이해요. 마치 잘 정리된 서랍장 같달까요?
  • 자동화된 데이터 매핑: Converter를 사용해서 JSON, XML 등 다양한 데이터 형식을 POJO로 자동 변환해주니 개발 시간을 확 줄일 수 있어요! 시간은 금이잖아요~?
  • 다양한 HTTP 클라이언트 지원: OkHttp, Apache HttpClient 등 다양한 HTTP 클라이언트와 호환되어 유연성이 뛰어나답니다!
  • 비동기 처리 지원: RxJava, Coroutine 등과의 찰떡궁합으로 복잡한 비동기 작업도 쉽게 처리할 수 있어요.

Retrofit의 단점

  • 추상화 레이어: Retrofit은 OkHttp 위에 추상화 레이어를 추가하기 때문에, 저수준 네트워크 제어가 필요한 경우에는 다소 제약이 있을 수 있어요. 마치 두꺼운 장갑을 끼고 정밀 작업을 하는 느낌이랄까요?
  • 학습 곡선: Annotation, Converter 등 Retrofit의 기능을 완전히 활용하려면 초기 학습 시간이 필요해요. 하지만 걱정 마세요! 한 번 익숙해지면 개발 속도가 훨씬 빨라질 거예요!

OkHttp: 네트워크 제어의 달인

OkHttp는 네트워크 제어에 있어서 진정한 달인이에요. HTTP 요청/응답의 모든 과정을 세밀하게 제어할 수 있고, 연결 풀링, 캐싱, 인터셉터 등 다양한 기능을 제공해서 네트워크 성능을 최적화할 수 있답니다! Retrofit이 자동차의 자동 변속기라면, OkHttp는 수동 변속기라고 할 수 있겠네요!

OkHttp의 장점

  • 강력한 네트워크 제어: HTTP 요청/응답의 모든 과정을 세밀하게 제어할 수 있어 네트워크 성능 최적화에 유리해요. 마치 튜닝된 엔진 같죠?!
  • 다양한 기능: 연결 풀링, 캐싱, 인터셉터 등 풍부한 기능으로 네트워크 성능을 향상시킬 수 있답니다.
  • Retrofit의 기반: Retrofit은 내부적으로 OkHttp를 사용하기 때문에, OkHttp를 이해하면 Retrofit을 더욱 효과적으로 사용할 수 있어요. 마치 건물의 기초 공사와 같다고 할까요?

OkHttp의 단점

  • 상대적으로 복잡한 코드: Retrofit에 비해 코드가 다소 복잡하고 길어질 수 있어요. 물론, 그만큼 세밀한 제어가 가능하다는 장점이 있지만요!
  • 수동 데이터 처리: JSON, XML 등의 데이터를 직접 파싱하고 처리해야 하기 때문에 개발 시간이 다소 늘어날 수 있어요. 하지만 직접 데이터를 다루는 만큼 자유도도 높아진답니다!

그래서, 뭘 선택해야 할까요?

결론적으로, Retrofit과 OkHttp 중 어떤 라이브러리를 선택해야 할지는 프로젝트의 요구사항과 개발자의 취향에 따라 달라져요. 만약 빠른 개발 속도와 간결한 코드를 원한다면 Retrofit이 좋은 선택이 될 수 있고, 네트워크 성능 최적화와 세밀한 제어가 중요하다면 OkHttp가 더 적합할 수 있답니다.

Retrofit 추천

  • 빠른 개발 속도가 중요한 프로젝트
  • 간결하고 유지보수하기 쉬운 코드를 선호하는 경우
  • 복잡한 비동기 처리가 필요한 경우

OkHttp 추천

  • 네트워크 성능 최적화가 중요한 프로젝트
  • 저수준 네트워크 제어가 필요한 경우
  • HTTP 요청/응답 과정을 세밀하게 다루고 싶은 경우

두 라이브러리는 서로 경쟁하는 관계라기보다는 상호 보완적인 관계에 가까워요. 실제로 Retrofit은 내부적으로 OkHttp를 사용하고 있죠! 마치 찰떡궁합 파트너 같아요! 두 라이브러리의 특징을 잘 이해하고 적재적소에 활용한다면, 더욱 효율적이고 강력한 네트워크 애플리케이션을 개발할 수 있을 거예요! 이제 여러분은 어떤 라이브러리를 선택하시겠어요? 선택은 여러분의 몫이랍니다!

 

실제 REST API 호출 예제

자, 이제 드디어! RetrofitOkHttp를 활용해서 실제로 REST API를 호출하는 예제를 살펴볼 시간이에요! 두근두근~? 지금까지 잘 따라오셨다면 이 부분은 식은 죽 먹기일 거예요! (아닌가요…? ㅎㅎ 그래도 최대한 쉽게 설명해 드릴게요!)

먼저, 외부 API를 하나 정해야겠죠? 이 예제에서는 공공 데이터 포털에서 제공하는 “전국 도서관 정보” API를 사용해볼게요. 이 API는 JSON 형태로 데이터를 반환하며, 도서관 이름, 주소, 전화번호 등 유용한 정보들을 담고 있어요. 실제 서비스에서 사용할 만큼 풍부한 데이터는 아니지만, 연습용으로는 딱!이랍니다. ^^

1. Retrofit을 사용한 예제

Retrofit을 사용하면 API 호출이 얼마나 간편해지는지 직접 확인해 보세요! 먼저, API의 엔드포인트를 인터페이스로 정의해야 합니다. 마치 계약서를 작성하는 것처럼 말이죠!

public interface LibraryService {
    @GET("/openapi/service/rest/KorService/searchLib") // API 엔드포인트
    Call<LibraryResponse> getLibraries(@Query("serviceKey") String apiKey, @Query("numOfRows") int numOfRows);
}

@GET 어노테이션은 HTTP GET 메서드를 사용함을 나타내고, /openapi/service/rest/KorService/searchLib는 API의 엔드포인트 경로입니다. @Query 어노테이션은 쿼리 파라미터를 추가하는 역할을 해요. 여기서는 API 키와 가져올 데이터의 개수를 지정했어요.

이제 Retrofit 객체를 생성하고 API 서비스를 초기화해야 합니다. BaseUrl은 API 서버의 기본 주소를 의미해요.

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("http://api.data.go.kr") // 공공 데이터 포털 API 기본 주소
    .addConverterFactory(GsonConverterFactory.create()) // JSON 데이터를 파싱하기 위한 컨버터 추가!
    .build();

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

GsonConverterFactory를 사용해서 JSON 데이터를 Java 객체로 변환하도록 설정했어요. 다른 컨버터를 사용할 수도 있지만, Gson이 널리 사용되고 성능도 좋으니 추천드려요!

마지막으로, API를 호출하고 응답을 처리하는 코드입니다.

Call<LibraryResponse> call = service.getLibraries("YOUR_API_KEY", 10); // API 키와 가져올 데이터 개수 설정
call.enqueue(new Callback<LibraryResponse>() {
    @Override
    public void onResponse(Call<LibraryResponse> call, Response<LibraryResponse> response) {
        if (response.isSuccessful()) {
            LibraryResponse result = response.body();
            // API 호출 성공! 결과 처리
            List<Library> libraries = result.getBody().getItems();
            for (Library library : libraries) {
                Log.d("Library", library.getLibName());
            }

        } else {
            // API 호출 실패! 오류 처리
            Log.e("API Error", response.message());
        }
    }

    @Override
    public void onFailure(Call<LibraryResponse> call, Throwable t) {
        // 네트워크 오류 등 처리
        Log.e("Network Error", t.getMessage());
    }
});

enqueue() 메서드를 사용해서 비동기적으로 API를 호출했어요. 비동기 호출은 UI 스레드를 블록하지 않아서 앱의 성능을 향상시키는 데 중요한 역할을 합니다. onResponse() 메서드에서 API 호출 성공 시 결과를 처리하고, onFailure() 메서드에서 네트워크 오류 등을 처리합니다.

2. OkHttp를 사용한 예제

OkHttp를 사용한 예제도 살펴볼까요? Retrofit보다 조금 더 복잡하지만, 더 세밀한 제어가 가능하다는 장점이 있어요.

OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()
    .url("http://api.data.go.kr/openapi/service/rest/KorService/searchLib?serviceKey=YOUR_API_KEY&numOfRows=10")
    .build(); // 요청 객체 생성

client.newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(@NonNull Call call, @NonNull IOException e) {
        // 네트워크 오류 등 처리
        Log.e("Network Error", e.getMessage());
    }

    @Override
    public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
        if (response.isSuccessful()) {
            String responseData = response.body().string();
            // JSON 데이터 파싱 및 처리 (예: Gson 사용)
            // ...

        } else {
            // API 호출 실패! 오류 처리
            Log.e("API Error", response.message());
        }
    }
});

OkHttp에서는 Request 객체를 직접 생성해서 API 요청을 구성해야 해요. URL, 헤더, 바디 등을 설정할 수 있죠. Retrofit과 마찬가지로 enqueue() 메서드를 사용해서 비동기적으로 API를 호출합니다. 응답은 response.body().string() 메서드를 사용해서 문자열로 가져올 수 있고, Gson과 같은 라이브러리를 사용해서 JSON 데이터를 파싱할 수 있어요.

자, 이제 실제로 API를 호출하고 데이터를 가져오는 방법을 알아봤어요! 어때요, 생각보다 어렵지 않죠? 물론, 이 예제는 아주 기본적인 내용만 다루고 있지만, 이를 바탕으로 더 복잡한 API 호출도 충분히 구현할 수 있을 거예요! 다음에는 더욱 흥미로운 주제로 찾아올게요! 기대해 주세요~!

 

자, 이제 RetrofitOkHttp를 이용해서 Java로 REST API 호출하는 방법에 대해 알아봤어요! 어때요, 생각보다 어렵지 않았죠? 처음엔 조금 낯설 수도 있지만, 몇 번 연습하다 보면 금방 익숙해질 거예요. 마치 새로운 친구를 사귀는 것처럼 말이죠. 각 라이브러리의 특징과 장단점을 잘 이해하고 상황에 맞게 사용하는 것이 중요해요. 간단한 API 호출에는 OkHttp가, 복잡한 API 호출에는 Retrofit이 더 적합할 수 있겠죠? 이제 여러분도 멋진 앱을 만들어 세상에 선보일 준비가 되었어요! 직접 코드를 작성하고 실행하면서 REST API의 세계를 탐험해 보세요. 분명 흥미진진한 경험이 될 거예요. 앞으로도 더 재미있고 유익한 정보로 찾아올게요!

 

Itlearner

Share
Published by
Itlearner

Recent Posts

UDP란? TCP와의 차이점

안녕하세요! 오늘은 컴퓨터 네트워크에서 중요한 역할을 하는 UDP에 대해 함께 알아보는 시간을 가져보려고 해요. 마치…

26분 ago

TCP/IP 프로토콜 완벽 가이드

안녕하세요! 오늘은 인터넷 세상의 핵심, 바로 TCP/IP 프로토콜에 대해 함께 알아보는 시간을 가져보려고 해요. 마치…

5시간 ago

라우팅이란? 초보자 가이드

안녕하세요! 혹시 인터넷 서핑을 하다가, 갑자기 궁금해진 적 없으세요? 내가 보내는 이 메시지, 어떻게 정확히…

9시간 ago

게이트웨이란? 초보자 설명

안녕하세요! 혹시 "게이트웨이"라는 말, 들어보셨나요? 뭔가 멋있어 보이지만 막상 설명하려면 어려운 그 단어! 오늘은 마치…

13시간 ago

서브넷 마스크 쉽게 이해하기

안녕하세요, 여러분! 오늘은 네트워크의 핵심 개념 중 하나인 서브넷 마스크에 대해 함께 알아보는 시간을 가져보려고…

17시간 ago

공인 IP와 사설 IP의 차이

안녕하세요! 오늘은 우리 주변에서 늘 사용되지만, 정확히 알고 넘어가기엔 조금 어려운 개념인 'IP 주소'에 대해…

21시간 ago

This website uses cookies.