Files
spring-boot-examples/docs/webflux/06_리액티브 데이터베이스 연동.md
2025-04-08 19:56:24 +09:00

194 lines
6.7 KiB
Markdown

아래는 **"스프링부트 웹플럭스 시리즈"**의 **6장: 리액티브 데이터베이스 연동"**에 대한 초안입니다. MariaDB를 예시로 사용하며, R2DBC를 통해 리액티브 방식으로 연동합니다. 설정은 `application.yaml`을 사용하고, 간단한 실습 코드를 포함했습니다. 초보자도 따라 할 수 있도록 단계별로 설명하며 친근한 문체를 유지했습니다.
---
## 6. 리액티브 데이터베이스 연동
이제 웹플럭스의 리액티브 특성을 데이터베이스와 연결해볼 시간입니다. 이번 장에서는 MariaDB를 리액티브하게 다루는 방법을 배워보겠습니다. 전통적인 JDBC 대신 R2DBC(Reactive Relational Database Connectivity)를 사용하며, 설정은 `application.yaml`로 깔끔하게 정리하겠습니다. 데이터 조회와 저장 예제도 함께 해보며 실습을 진행할게요. 준비되셨죠?
### R2DBC와 리액티브 리포지토리 설정
R2DBC는 관계형 데이터베이스를 비동기/논블로킹 방식으로 접근하게 해주는 드라이버입니다. 웹플럭스와 찰떡궁합이죠. 먼저, MariaDB와 R2DBC를 사용하기 위해 Gradle에 의존성을 추가합니다. `build.gradle`에 아래를 추가하세요:
```gradle
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-r2dbc'
implementation 'io.r2dbc:r2dbc-mariadb:1.1.3'
runtimeOnly 'org.mariadb.jdbc:mariadb-java-client'
}
```
- `spring-boot-starter-data-r2dbc`: R2DBC와 스프링 데이터 통합을 위한 스타터.
- `r2dbc-mariadb`: MariaDB용 R2DBC 드라이버.
의존성을 추가한 뒤, `./gradlew build`로 빌드해줍니다.
다음으로, `application.yaml`을 설정합니다. `src/main/resources``application.yaml` 파일을 만들고 아래 내용을 입력하세요:
```yaml
spring:
r2dbc:
url: r2dbc:mariadb://localhost:3306/webflux_db
username: root
password: yourpassword
data:
r2dbc:
repositories:
enabled: true
```
- `url`: MariaDB 데이터베이스 연결 정보 (예: `webflux_db`라는 데이터베이스 사용).
- `username`, `password`: MariaDB 접속 계정 정보 (환경에 맞게 수정하세요).
MariaDB에 `webflux_db` 데이터베이스를 미리 만들어야 합니다. MariaDB 클라이언트에서 다음 명령어를 실행하세요:
```sql
CREATE DATABASE webflux_db;
```
### MariaDB와의 연동 예제
이제 간단한 사용자(User) 데이터를 저장하고 조회하는 예제를 만들어보겠습니다. 먼저, 테이블을 생성합니다. MariaDB에서 아래 SQL을 실행하세요:
```sql
USE webflux_db;
CREATE TABLE users (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL
);
```
#### 엔티티 클래스 작성
`src/main/java/com/example/demo``User` 클래스를 추가합니다:
```java
package com.example.demo;
import lombok.Data;
import org.springframework.data.annotation.Id;
@Data
public class User {
@Id
private Long id;
private String name;
private String email;
}
```
- `@Id`: 기본 키를 나타냅니다.
- `@Data`: Lombok으로 getter/setter 등을 자동 생성.
#### 리포지토리 인터페이스 생성
`src/main/java/com/example/demo``UserRepository` 인터페이스를 만듭니다:
```java
package com.example.demo;
import org.springframework.data.r2dbc.repository.R2dbcRepository;
import reactor.core.publisher.Mono;
public interface UserRepository extends R2dbcRepository<User, Long> {
Mono<User> findByEmail(String email);
}
```
- `R2dbcRepository`: 리액티브 CRUD 작업을 지원.
- `findByEmail`: 이메일로 사용자 조회 메서드 추가.
#### 데이터 저장 및 조회 실습
컨트롤러를 만들어 데이터를 다뤄봅시다. `src/main/java/com/example/demo``UserController`를 추가합니다:
```java
package com.example.demo;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
@RestController
@RequestMapping("/users")
public class UserController {
private final UserRepository userRepository;
public UserController(UserRepository userRepository) {
this.userRepository = userRepository;
}
@PostMapping
public Mono<User> createUser(@RequestBody User user) {
return userRepository.save(user);
}
@GetMapping("/{id}")
public Mono<User> getUserById(@PathVariable Long id) {
return userRepository.findById(id);
}
@GetMapping("/email/{email}")
public Mono<User> getUserByEmail(@PathVariable String email) {
return userRepository.findByEmail(email);
}
@GetMapping
public Flux<User> getAllUsers() {
return userRepository.findAll();
}
}
```
- `createUser`: 새 사용자를 저장.
- `getUserById`: ID로 사용자 조회.
- `getUserByEmail`: 이메일로 사용자 조회.
- `getAllUsers`: 모든 사용자 목록 반환.
#### 테스트해보기
애플리케이션을 실행한 뒤, Postman이나 curl로 테스트해봅시다.
1. **사용자 추가**:
```
POST http://localhost:8080/users
Content-Type: application/json
{"name": "Alice", "email": "alice@example.com"}
```
응답으로 저장된 사용자 객체가 반환됩니다.
2. **사용자 조회 (ID)**:
```
GET http://localhost:8080/users/1
```
ID가 1인 사용자가 반환됩니다.
3. **사용자 조회 (이메일)**:
```
GET http://localhost:8080/users/email/alice@example.com
```
이메일로 조회한 결과가 나옵니다.
4. **모든 사용자 조회**:
```
GET http://localhost:8080/users
```
저장된 모든 사용자가 리스트로 표시됩니다.
### 잠깐 정리
- **R2DBC**: MariaDB를 리액티브하게 연결.
- **`application.yaml`**: 간단한 설정으로 데이터베이스 연결 완료.
- **리포지토리**: 비동기 CRUD 작업을 쉽게 처리.
이 과정에서 `Mono`와 `Flux`가 데이터베이스 작업에 자연스럽게 녹아든 걸 느끼셨을 겁니다. 전통적인 JDBC와 달리 스레드가 블록되지 않아 더 많은 요청을 효율적으로 처리할 수 있죠.
### 마무리
MariaDB와의 리액티브 연동을 성공적으로 해냈습니다! 데이터베이스 작업이 웹플럭스의 비동기 흐름과 어떻게 맞물리는지 실감 나셨나요? 다음 장에서는 이 데이터를 기반으로 REST API를 설계하며, 실무에서 더 유용한 기능을 추가해보겠습니다. 이번 실습이 재미있으셨길 바랍니다!
---
이 장은 MariaDB와 R2DBC를 활용한 실습 중심으로 구성했으며, `application.yaml` 설정과 간단한 코드를 포함했습니다. 추가 예제나 수정이 필요하면 말씀해주세요!