Spring Boot에서 Reactive Streams 활용 및 OkHttp3 JSON 파싱

Spring Boot에서 Reactive Streams 활용 및 OkHttp3 JSON 파싱

1. Spring Boot에서 GET 요청 파라미터 처리 방법

Spring Boot에서 GET 요청을 받을 때 파라미터를 선택적으로 처리하는 것이 중요합니다. 특히, Java 8 이상에서는 Optional<String>을 활용하여 보다 안전한 처리를 할 수 있습니다.

아래는 컨트롤러에서 Optional을 활용하는 예제입니다.

@GetMapping("/api/data")
public ResponseEntity<String> getData(@RequestParam Optional<String> conversationId) {
    String convId = conversationId.orElse("default-value");
    return ResponseEntity.ok("Received: " + convId);
}

위 코드에서 orElse()를 사용하여 기본값을 설정할 수 있으며, 값이 존재할 경우 이를 사용하게 됩니다. 이를 통해 NullPointerException을 방지하고 보다 안정적인 API를 구현할 수 있습니다.


2. OkHttp3를 활용한 JSON 데이터 추출

OkHttp3는 간단하고 강력한 HTTP 클라이언트 라이브러리로, REST API 요청을 보내는 데 자주 사용됩니다. API 호출 후 JSON 응답에서 특정 데이터를 추출하는 방법을 알아보겠습니다.

2.1 OkHttp3 설정 및 요청 보내기

아래는 OkHttp3를 사용하여 GET 요청을 보내고 응답을 받는 코드입니다.

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

public class OkHttpExample {
    public static void main(String[] args) throws Exception {
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url("https://api.example.com/data")
                .build();

        try (Response response = client.newCall(request).execute()) {
            if (response.isSuccessful() && response.body() != null) {
                System.out.println("Response: " + response.body().string());
            }
        }
    }
}

2.2 JSON 응답에서 특정 필드 추출

API에서 다음과 같은 JSON을 반환한다고 가정해 보겠습니다.

{
    "responseCode": 20000000,
    "responseMsg": "Success",
    "conversationId": "dfdsfehgmdkle"
}

이 데이터를 파싱하여 conversationId 값을 추출하는 방법은 아래와 같습니다.

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonParsingExample {
    public static void main(String[] args) throws Exception {
        String jsonData = "{\"responseCode\": 20000000, \"responseMsg\": \"Success\", \"conversationId\": \"dfdsfehgmdkle\"}";
        ObjectMapper mapper = new ObjectMapper();
        JsonNode rootNode = mapper.readTree(jsonData);
        String conversationId = rootNode.get("conversationId").asText();
        System.out.println("Extracted conversationId: " + conversationId);
    }
}

위 코드에서는 Jackson의 ObjectMapper를 활용하여 JSON을 파싱하고 원하는 필드를 추출했습니다.


3. SubmissionPublisher를 활용한 Reactive Streams

Java 9에서 도입된 SubmissionPublisher를 활용하면 비동기 데이터 스트림을 쉽게 구현할 수 있습니다.

3.1 기본적인 SubmissionPublisher 사용법

아래는 기본적인 SubmissionPublisher의 사용 예제입니다.

import java.util.concurrent.SubmissionPublisher;

public class PublisherExample {
    public static void main(String[] args) {
        SubmissionPublisher<String> publisher = new SubmissionPublisher<>();
        publisher.subscribe(data -> System.out.println("Received: " + data));
        
        publisher.submit("Hello, Reactive Streams!");
        publisher.close();
    }
}

여기서 close()를 호출하지 않으면 스트림이 종료되지 않으므로 주의해야 합니다.

3.2 Spring Boot WebFlux에서 활용

Spring Boot WebFlux에서 SubmissionPublisher를 활용하면 클라이언트가 비동기적으로 데이터를 받을 수 있습니다.

@RestController
@RequestMapping("/api")
public class ReactiveController {
    @GetMapping("/stream")
    public SubmissionPublisher<String> streamData() {
        SubmissionPublisher<String> publisher = new SubmissionPublisher<>();
        publisher.submit("Streaming Data...");
        publisher.close();
        return publisher;
    }
}

위 방식은 기본적인 데이터 스트리밍 예제이며, 실제 서비스에서는 Flux를 사용하는 것이 더 일반적입니다.


끝으로

Spring Boot에서 GET 요청 파라미터를 효과적으로 처리하는 방법과 OkHttp3를 활용한 API 호출 및 JSON 파싱 기법을 다루었습니다. 또한, SubmissionPublisher를 활용하여 Reactive Streams를 구현하는 방법도 살펴보았습니다.

이러한 기법들은 실무에서 비동기 프로그래밍, REST API 연동, 실시간 데이터 처리 등에 유용하게 활용될 수 있습니다.

Comments