아래는 **"스프링부트 웹플럭스 시리즈"**의 **3장: 스프링부트 웹플럭스 시작하기"**에 대한 초안입니다. Gradle을 사용한 설정 예시와 간략한 코드를 포함하여 실습 중심으로 작성했습니다. 초보자도 따라 할 수 있도록 단계별로 설명하며, 자연스럽고 친근한 문체를 유지했습니다.

---

## 3. 스프링부트 웹플럭스 시작하기

이제 이론을 넘어 직접 손을 움직여볼 시간입니다. 이 장에서는 스프링부트 웹플럭스를 사용해 간단한 애플리케이션을 만들어보며, 환경 설정부터 기본 라우팅까지 경험해보겠습니다. Gradle을 빌드 도구로 사용하며, 코드도 최대한 간결하게 유지하겠습니다. 자, 시작해볼까요?

### 개발 환경 설정 (Gradle 의존성 추가)

먼저, 스프링부트 웹플럭스 프로젝트를 만들려면 필요한 의존성을 추가해야 합니다. 스프링 이니셜라이저(Spring Initializr)를 사용하거나, 기존 프로젝트에 설정을 추가할 수 있습니다. 여기서는 Gradle 기반으로 진행합니다.

`build.gradle` 파일을 열고 아래 내용을 추가하세요:

```gradle
plugins {
    id 'org.springframework.boot' version '3.2.4'
    id 'io.spring.dependency-management' version '1.1.4'
    id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-webflux'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    testImplementation 'io.projectreactor:reactor-test'
}

test {
    useJUnitPlatform()
}
```

- `spring-boot-starter-webflux`: 웹플럭스 기본 의존성으로, Netty 서버와 리액터 라이브러리를 포함합니다.
- `spring-boot-starter-test`와 `reactor-test`: 테스트를 위한 의존성입니다.

의존성을 추가한 뒤, 터미널에서 `./gradlew build`를 실행해 의존성이 잘 다운로드되는지 확인하세요.

### 첫 번째 웹플럭스 애플리케이션 만들기

스프링부트는 기본적으로 실행 가능한 애플리케이션을 빠르게 만들 수 있도록 도와줍니다. 프로젝트 루트 패키지에 `Application` 클래스를 생성하고, 아래처럼 설정합니다:

```java
package com.example.demo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
```

이제 애플리케이션을 실행해보세요. `./gradlew bootRun` 명령어를 입력하면 기본 포트(8080)에서 서버가 시작됩니다. 아직 아무 기능은 없지만, 웹플럭스 기반 애플리케이션이 구동된 겁니다!

### 기본적인 라우팅과 컨트롤러 설정

이제 간단한 엔드포인트를 추가해보겠습니다. 웹플럭스에서는 두 가지 방식으로 라우팅을 처리할 수 있는데, 여기서는 어노테이션 기반 컨트롤러를 먼저 사용해보겠습니다. 함수형 라우팅은 나중에 다룰게요.

`src/main/java/com/example/demo` 경로에 `HelloController` 클래스를 생성하고, 아래 코드를 추가하세요:

```java
package com.example.demo;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Mono;

@RestController
public class HelloController {

    @GetMapping("/hello")
    public Mono<String> sayHello() {
        return Mono.just("Hello, WebFlux!");
    }
}
```

- `@RestController`: REST API를 처리하는 컨트롤러임을 나타냅니다.
- `Mono<String>`: 단일 문자열을 비동기적으로 반환합니다.

애플리케이션을 다시 실행한 뒤, 브라우저나 Postman에서 `http://localhost:8080/hello`로 접속해보세요. "Hello, WebFlux!"라는 응답이 나타날 겁니다. 이렇게 간단한 코드로 비동기 엔드포인트를 만들어보았습니다!

혹시 더 실험해보고 싶다면, 아래처럼 약간의 지연을 추가해볼 수도 있습니다:

```java
@GetMapping("/hello-delay")
public Mono<String> sayHelloWithDelay() {
    return Mono.just("Hello with delay!")
               .delayElement(Duration.ofSeconds(2));
}
```

`/hello-delay`로 접속하면 2초 뒤에 응답이 오는 걸 확인할 수 있습니다. 이건 웹플럭스가 비동기적으로 동작한다는 걸 느끼게 해주는 작은 예제입니다.

### 잠깐 확인하기

지금까지 한 걸 정리해보면:
1. Gradle로 웹플럭스 의존성을 설정했습니다.
2. 기본 애플리케이션을 실행해봤고,
3. 간단한 컨트롤러로 첫 번째 엔드포인트를 만들었습니다.

별로 어렵지 않죠? 스프링부트가 복잡한 설정을 대신 처리해주기 때문에, 우리는 핵심 로직에 집중할 수 있습니다. 웹플럭스는 처음엔 낯설 수 있지만, 이런 작은 성공 경험을 쌓다 보면 금방 익숙해질 겁니다.

### 마무리

이 장에서는 웹플럭스 애플리케이션의 기본 틀을 만들어보며 첫발을 내디뎠습니다. 다음 장에서는 `Mono`와 `Flux`를 더 깊이 파고들며, 리액티브 스트림의 매력을 본격적으로 탐구해보겠습니다. 직접 코드를 작성해본 느낌이 어떠신가요? 다음 단계로 넘어갈 준비가 되셨길 바랍니다!

---

이 글은 실습 위주로 간결하게 작성했으며, 초보자가 따라 하기 쉽도록 Gradle 설정과 코드 예제를 최소화했습니다. 추가 설명이나 다른 예제가 필요하면 말씀해주세요!