[java] JAX-RS 클라이언트 동기와 비동기 호출

JAX-RS는 Java에서 RESTful 웹 서비스를 개발하기 위한 API입니다. JAX-RS를 사용하여 클라이언트 측에서 서비스를 호출할 때, 동기 혹은 비동기 방식으로 호출할 수 있습니다. 이 블로그 포스트에서는 JAX-RS 클라이언트에서의 동기와 비동기 호출에 대해 알아보겠습니다.

동기 호출

동기 호출은 클라이언트가 요청을 보내고 서버로부터 응답을 기다리는 방식입니다. 클라이언트는 요청을 보낸 후 서버로부터의 응답을 받을 때까지 대기합니다. 다음은 JAX-RS 클라이언트에서 동기 호출을 수행하는 예제 코드입니다.

import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

public class SyncClientExample {

    public static void main(String[] args) {
        Client client = ClientBuilder.newClient();
        WebTarget target = client.target("http://example.com/api/resource");

        Response response = target.request(MediaType.APPLICATION_JSON).get();
        String responseBody = response.readEntity(String.class);

        System.out.println(responseBody);
    }
}

위의 예제 코드에서는 Client 인스턴스를 생성한 후, WebTarget을 사용하여 요청을 생성합니다. request(MediaType.APPLICATION_JSON).get()은 GET 요청을 보내는 동기 호출을 수행하고, 응답은 Response 객체로 받아옵니다. 마지막으로 response.readEntity(String.class)를 호출하여 응답 본문을 문자열로 변환합니다.

비동기 호출

비동기 호출은 클라이언트가 요청을 보낸 후 서버로부터의 응답을 기다리지 않고 다른 작업을 수행할 수 있는 방식입니다. 클라이언트는 요청을 보낸 후 응답을 기다리지 않고 다음 작업을 처리할 수 있습니다. 다음은 JAX-RS 클라이언트에서 비동기 호출을 수행하는 예제 코드입니다.

import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.InvocationCallback;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

public class AsyncClientExample {

    public static void main(String[] args) {
        Client client = ClientBuilder.newClient();
        WebTarget target = client.target("http://example.com/api/resource");

        target.request(MediaType.APPLICATION_JSON).async().get(new InvocationCallback<Response>() {
            @Override
            public void completed(Response response) {
                String responseBody = response.readEntity(String.class);
                System.out.println(responseBody);
            }

            @Override
            public void failed(Throwable throwable) {
                throwable.printStackTrace();
            }
        });

        // 다른 작업 수행
        // ...
    }
}

위의 예제 코드에서는 async().get()을 호출하여 비동기 호출을 수행합니다. 응답은 InvocationCallback을 통해 처리됩니다. completed() 메서드는 응답을 받았을 때 호출되며, failed() 메서드는 예외가 발생했을 때 호출됩니다.

결론

JAX-RS 클라이언트에서는 동기와 비동기 호출을 선택적으로 사용할 수 있습니다. 동기 호출은 응답이 도착할 때까지 클라이언트가 대기해야 하지만, 비동기 호출은 응답을 받지 않고도 다른 작업을 수행할 수 있습니다. 프로젝트의 요구사항에 맞게 적절한 방식을 선택하여 사용하면 됩니다.

참고 자료