안녕하세요 오늘은 Spring WebFlux에 대해 알아보겠습니다.
지금까지 Spring MVC 어플리케이션을 많이 사용해 왔는데
WebFlux는 이와 대비되는 리액티브 웹 어플리케이션으로써
비동기 통식 방식을 사용하여(Non-Blocking) 빠르고 유연한 처리가 장점입니다.
바로 예제를 통해 알아보겠습니다.
package com.wfhmarket.api.config;
import io.r2dbc.spi.ConnectionFactories;
import io.r2dbc.spi.ConnectionFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.r2dbc.config.AbstractR2dbcConfiguration;
import org.springframework.data.r2dbc.repository.config.EnableR2dbcRepositories;
@Configuration
@EnableR2dbcRepositories
public class PostgresDataSourceConfig extends AbstractR2dbcConfiguration {
@Bean
@Override
public ConnectionFactory connectionFactory() {
return ConnectionFactories.get("r2dbc:postgresql://localhost:5432/wfhdb?username=test&password=test");
}
}
간단한 데이터베이스 설정입니다.
-> 정정합니다. R2DBC 설정은 다시 찾아보겠습니다. 해당 코드는 일단 없어도 진행하는데 문제는 없습니다.
r2dbc:
url: r2dbc:postgresql://localhost:5432/wfhdb
username: test
password: test
properties:
schema: public
이렇게 yml만 작성되어있으면 연결됩니다.
추후에 좀더 공부 후 설정 부분에대해 작성하겠습니다.
Webflux에서는 기존의 JPA,JDBC를 사용하지 않고 Non-Blocking I/O를 지원하는 R2DBC라는 리액티브 데이터 액세스 계층을 사용하게 됩니다.
R2DBC는 Auto DDL을 지원하지 않아 수동으로 작업해줘야한다는 단점이 있지만 저는 JPA로 만들고 변환해주는 방식으로 해결하였습니다.
두가지 방법의 장점만 뽑아씁시다.
package com.wfhmarket.api.model;
import lombok.*;
import org.springframework.data.annotation.Id;
import org.springframework.data.relational.core.mapping.Column;
import org.springframework.data.relational.core.mapping.Table;
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Table("Contract")
public class Contract {
@Id
private Long contract_id;
@Column("project_id")
private Long project_id;
@Column("freelancer_id")
private Long freelancer_id;
@Column("client_id")
private Long client_id;
private int agreed_price;
private String start_date;
private String end_date;
private String status;
private String created_at;
private String updated_at;
}
JPA와 달리 연관관계에 따라 매핑을 해주지 않고 테이블내에 외래키를 그대로 써주면 됩니다.
마지막으로 Spring WebFlux에서 가장 중요한 Mono와 Flux에 대해 알아보겠습니다.
Spring WebFlux에서 Mono와 Flux는 Project Reactor 라이브러리의 일부로,
리액티브 프로그래밍 모델을 기반으로 동작합니다.
리액티브 프로그래밍은 데이터 스트림과 비동기 연산에 초점을 맞추며,
더 효율적인 동시성 처리를 지원합니다.
이를 통해 복잡한 작업이나 고성능 시스템에서 높은 처리량과 낮은 지연 시간을 제공할 수 있습니다.
Mono (모노)는 0 또는 1개의 결과만 발생하는 리액티브 스트림입니다.
Mono는 단일 비동기 연산을 나타냅니다.
이는 결과가 없거나 결과가 하나인 자료만 처리할 때 사용합니다.
예를 들어, 데이터베이스에서 단일 레코드를 조회하는 경우에 Mono를 사용할 수 있습니다.
Mono<Book> findBookById(Integer id);
Flux (플럭스)는 0개 이상의 결과를 다루는 리액티브 스트림입니다.
이는 여러 결과를 비동기로 처리할 때 사용합니다.
이는 순차적이거나 병렬적으로 처리될 수 있는 여러 개의 데이터를 다룰 때 유용합니다.
예를 들어, 데이터베이스에서 여러 레코드를 조회하는 경우에 Flux를 사용할 수 있습니다.
Flux<Book> findBooksByAuthor(String author);
Mono와 Flux는 조합 및 변환을 위한 다양한 연산자를 제공합니다.
이러한 연산자를 사용하여 리액티브 파이프라인을 구성할 수 있으며,
이를 통해 효율적인 동시성 처리를 구현할 수 있습니다.
감사합니다.
댓글