파란하늘의 지식창고
article thumbnail
반응형

Reactor 사이트에서는 Reactor를 아래와 같이 소개한다.

Reactor is a fourth-generation Reactive library for building non-blocking applications on the JVM based on the Reactive Streams Specification

1,2,3세대가 뭔지 궁금하긴 한데 관련 내용은 찾지 못했다. (RxJava 같은걸 얘기하는 거려나..)

spring webflux를 쓰기 위해서 우선 reactor를 공부해야 하는데 reactor를 먼저 공부하기 위해 순수하게 reactor에 대해서만 공부하기 위한 프로젝트 설정을 해보았다.

reactor homeapge : https://projectreactor.io/

홈페이지에서 문서를 확인할 수 있다.

https://projectreactor.io/docs

ReactorCore와 ReactorTest 문서를 보고 공부하면 될 것 같다.

ReactorCore Getting Started

프로젝트 만들기

maven 프로젝트 기준으로 아래처럼 pom.xml에 추가한다.

<dependencies>
	<dependency>
		<groupId>io.projectreactor</groupId>
		<artifactId>reactor-core</artifactId>
	</dependency>
	<dependency>
		<groupId>io.projectreactor</groupId>
		<artifactId>reactor-test</artifactId>
		<scope>test</scope>
	</dependency>

	<!-- (s) test -->
	<dependency>
		<groupId>org.junit.jupiter</groupId>
		<artifactId>junit-jupiter-api</artifactId>
		<version>5.5.2</version>
		<scope>test</scope>
	</dependency>
	<dependency>
		<groupId>org.junit.jupiter</groupId>
		<artifactId>junit-jupiter-engine</artifactId>
		<version>5.5.2</version>
		<scope>test</scope>
	</dependency>
	<!-- (e) test -->

	<!-- (s) log -->
	<dependency>
		<groupId>ch.qos.logback</groupId>
		<artifactId>logback-classic</artifactId>
		<version>1.2.3</version>
	</dependency>
	<dependency>
		<groupId>org.apache.logging.log4j</groupId>
		<artifactId>log4j-to-slf4j</artifactId>
		<version>2.13.0</version>
	</dependency>
	<dependency>
		<groupId>org.slf4j</groupId>
		<artifactId>jcl-over-slf4j</artifactId>
		<version>1.7.30</version>
	</dependency>
	<!-- (e) log -->

	<dependency>
		<groupId>org.projectlombok</groupId>
		<artifactId>lombok</artifactId>
		<version>1.18.10</version>
	</dependency>
</dependencies>

<dependencyManagement>
	<dependencies>
		<dependency>
			<groupId>io.projectreactor</groupId>
			<artifactId>reactor-bom</artifactId>
			<version>Dysprosium-SR2</version>
			<type>pom</type>
			<scope>import</scope>
		</dependency>
	</dependencies>
</dependencyManagement>

reactor는 라이브러리를 사용하기 위해 reactor-bom을 제공한다.

logback, lombok은 테스트를 편하게 하기 위해 추가하였다.

테스트 코드 만들기

@Slf4j
public class ReactorTest {
	
	@Test
	public void test() {
		Mono.just("test").log()
		.doOnNext(System.out::println)
		.subscribe();
	}
}

로그 출력을 확인할 수 있다.

20:55:42.936 [main] DEBUG reactor.util.Loggers$LoggerFactory - Using Slf4j logging framework
20:55:42.952 [main] INFO reactor.Mono.Just.1 - | onSubscribe([Synchronous Fuseable] Operators.ScalarSubscription)
20:55:42.955 [main] INFO reactor.Mono.Just.1 - | request(unbounded)
20:55:42.956 [main] INFO reactor.Mono.Just.1 - | onNext(test)
test
20:55:42.956 [main] INFO reactor.Mono.Just.1 - | onComplete()

여기까지 진행했으면 reactor를 공부할 수 있는 프로젝트 준비가 되었다.

 

공부한 방법 기록

결국 여기저기 귀동냥 눈동냥 구글링하면서 지식을 쌓아가게 되겠지만 그래도 처음에 어떻게 공부를 시작했다 정도는 남겨두려고 한다.

위에 공식 홈페이지 레퍼런스 문서를 링크해두긴 했지만 레퍼런스 문서는 처음부터 공부하기 위해 접근하기엔 좀 양이 많다.

아래와 같은 순서로 현재 진행중이고 이후 진행이 되는대로 계속 추가하려고한다.

  • 공식 홈페이지 인덱스 훝어보기
    • 전반적인 이해를 하는건 공식 홈페이지 인덱스를 보는게 먼저인 것 같다.
  • 공식 홈페이지 Learn 메뉴의 intro 소개 자료 보기
    • reactor의 경우 Learn 메뉴에서 공부할 수 있는 가이드를 하고 있다.
    • 이 중 intro 소개 자료가 잘 소개하고 있다.
  • 공식 홈페이지 Lean 메뉴의 Lite Rx API Hands On 공부
    • tech.io에 예제 중심으로 설명을 하고 있다.
    • 12장으로 구성되어 있고 실제 예제를 짜보면서 이해할 수 있어 좋다.
    • 예제 풀다 막히면 정답을 확인하기 위해 백기선 개발자님의 유튜브 영상을 참고하면서 진행했다.
    • 12장 중 9장 Adapt 는 기존 RxJava를 Reactor에서 쓰는 방법을 소개하기 때문에 넘어가도 무방하다
  • 공식 reference 문서 공부
    • 4.6 Handling Errors 까지 보면 됨
    • 다만 공식 문서 자체를 보고 실제 코드를 사용하기엔 애매하고 그냥 개념 이해를 도와주는 정도로 보는게 나을 듯 함. (많이 쓰는 코드 위주가 아닌 개념 소개 위주)
    • Appendix A: Which operator do I need? 에서 상황별 사용할 수 있는 operator를 소개하고 있어 계속 참고하게 될 듯 하다.

조금 먼저 이래저래 공부해보고 느낀 점은 아래와 같다.

  • 예전 RxJava처럼 병렬(비동기)로 수행하는 코드를 작성하기 위한 방식 제공
  • spring은 reactor 기반의 웹 서비스 개발을 위한 Spring WebFlux를 제공
  • RxJava는 비즈니스 로직 중 특정 부분에서 작성해서 일부 기능에 대해서만 병렬로 처리하도록 코드를 짜는데 편의성을 제공했지만 Spring WebFlux를 쓰기 위해서는 Spring MVC와 혼용할 수 없고 아예 별도로 새로 개발을 해야 함
  • Spring MVC에 사용하던 기능이 Spring WebFlux에선 아직 완전히 제공되고 있지 않고 계속 추가되고 있음.
    • 이로 인해 현재는 여러 기능들의 사용에 제한적인 부분이 있어 api 서버 정도로만 사용 가능할 듯함
    • thymeleaf도 아직은 WebFlux에선 실사용하기 어려운 점이 있음 (view 페이지 Publisher 호출 처리 관련 dialect가 아직 미제공
    • Spring WebFlux도 기존 RequestContext 기능 관련 제공이 springframework 5.2 이후 추가되는 등 MVC에 대응하는 기능들이 계속 추가되는 중
    • jdbc 비동기 처리를 위한 Spring Data R2DBC가 얼마 전 나왔지만 아직 갈길이 멀음 (2019/12/11 - [Study/Java] - Spring Data R2DBC 써보기)
    • 하지만 MVC/WebFlux를 선택해서 개발할 수 있도록 라이브러리 개발을 해야 하는 상황이 됨
  • Reactor가 제공하는 다양한 기능들은 좋긴 하다.. 성능을 신경 써서 개발해야 할 경우 쓰면 좋다.
    • 이에 반대로 기존 비즈니스 로직에 Reactor 코드의 비중이 너무 높고 전체 흐름을 Publisher로 감싸야한다는 전제 조건 자체가 맘에 들지 않기도 하다.

spring에서는 repository에 따라 쓰도록 안내하는 것처럼 소개에서 이미지를 보여주지만 MVC/WebFlux가 각각 모든 repository를 쓸 수 있게 지원하는 게 맞는 것 같다.

웹 개발을 위해 spring이 제공하는 두 개의 기둥 중 하나가 되었으니 공부는 해야겠다.

반응형
profile

파란하늘의 지식창고

@Bluesky_

도움이 되었다면 광고를 클릭해주세요