좋습니다.
아래는 WebFlux + Kafka + R2DBC 기반으로 설계된 대용량 게시판 백엔드 아키텍처 예시입니다.
[클라이언트 요청]
↓
┌────────────────────────┐
│ Spring WebFlux App │
└────────────────────────┘
│ │
│ └────▶ Redis (조회 캐시)
│
└────▶ Kafka Producer (INSERT 요청 발행)
↓
Kafka Topic (게시글)
↓
Kafka Consumer (Spring or Worker App)
↓
┌────────────────────┐
│ R2DBC + PostgreSQL │
└────────────────────┘
| 계층 | 기술 |
|---|---|
| 클라이언트 | React, Android 등 |
| 서버 | Spring WebFlux (@RestController, Flux, Mono) |
| 메시징 | Kafka (spring-kafka) |
| 캐시 | Redis (lettuce + ReactiveRedisTemplate) |
| DB | PostgreSQL + R2DBC (spring-data-r2dbc) |
POST /api/posts
Content-Type: application/json
{
"title": "WebFlux 게시판",
"content": "이건 WebFlux + Kafka + R2DBC 예시입니다.",
"authorId": 123
}
@PostMapping("/posts")
public Mono<Void> createPost(@RequestBody Mono<PostRequest> postMono) {
return postMono
.flatMap(post -> kafkaTemplate.send("post-topic", post))
.then(); // 즉시 응답
}
💡 WebFlux는 요청을 받아 Kafka에 넣고 바로 응답합니다 → 빠른 반응성
@KafkaListener(topics = "post-topic", groupId = "post-group")
public void consume(PostRequest post) {
PostEntity entity = new PostEntity(post.getTitle(), post.getContent(), post.getAuthorId());
postRepository.save(entity).subscribe();
}
💡 Kafka Consumer는 R2DBC를 이용해 비동기로 DB에 저장합니다.
post:{postId}public Mono<Post> getPost(Long id) {
return redisTemplate.opsForValue()
.get("post:" + id)
.switchIfEmpty(
postRepository.findById(id)
.flatMap(post -> redisTemplate.opsForValue()
.set("post:" + id, post)
.thenReturn(post)
)
);
}
@Table("posts")
public class PostEntity {
@Id private Long id;
private String title;
private String content;
private Long authorId;
private LocalDateTime createdAt;
}
public interface PostRepository extends ReactiveCrudRepository<PostEntity, Long> {
Flux<PostEntity> findAllByAuthorId(Long authorId);
}
| 항목 | 설명 |
|---|---|
| ✅ 빠른 응답 | 클라이언트는 Kafka 전송 직후 응답 받음 |
| ✅ 병렬 처리 | Kafka Consumer는 병렬로 DB Insert 가능 |
| ✅ 논블로킹 전체 구조 | WebFlux + R2DBC + Kafka 모두 논블로킹 |
| ✅ 확장성 우수 | Kafka + WebFlux 구조는 수평 확장 최적 |
acks=all, retries, DLQ)onErrorResume 등)| 기능 | 설명 |
|---|---|
| 🔄 Kafka에 댓글도 발행 | 댓글도 async 저장 |
| 🧵 WebSocket 알림 | 게시글 작성 시 알림 push |
| 📈 게시글 조회수도 Kafka로 적재 | 조회수 버퍼 처리 후 R2DBC 저장 |
| 🧭 ElasticSearch 연동 | 검색용 인덱싱 용이 |
필요하시면 이 구조로 실제 폴더 구조 + 코드 예제도 함께 구성해드릴 수 있습니다.
계속 진행해볼까요? (예: 게시글 등록 전체 코드 + config 등)