반응형
Recent Posts
Recent Comments
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

Real Vectorism. 훨씬 더 입체적으로...

스프링 웹플럭스에서 데이터의 추가에 따른 즉각방출 예제소스 본문

Java (based by Spring Boot 2)

스프링 웹플럭스에서 데이터의 추가에 따른 즉각방출 예제소스

grast 2021. 7. 19. 11:28
반응형

원본 및 레퍼런스: https://lts0606.tistory.com/category/Spring%20Webflux

 

'Spring Webflux' 카테고리의 글 목록

Hello world!

lts0606.tistory.com

 

 

 

1. 먼저 메이븐에 WebFlux 계열 추가

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-webflux -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-webflux</artifactId>
</dependency>

2. 회원정보로 사용할 클래스정보 신규추가

class SeumUserDetails {
    private Integer idx;
    private String username;
    private String password;
    
    // 이하 getter, setter, toString
    // 개인적으로, 롬복 진짜 시름. 절대로 안씀
    // 람다식에서 메소드체이닝으로 map 함수를 쓸거라면 setter는 반드시 return this를 써야 제맛
}

3. 요청에 의해 작동하게 될 함수를 모아놓은 서비스클래스(핸들러) 신규추가

@Component
public class SeumUserHandler {
    // EmitterProcessor 클래스가 Deprecated가 떠버린 관계로 반드시 Sinks.many() 로 대체해야함
    private Many<SeumUserDetails> userMany;
    // 데이터가 신규로 삽입작성이 되는지를 확인하기 위한 Sequence 구현클래스. 
    // java.util 패키지계열로 별도로 만들 필요 없고 가져다 쓰는게 가능.
    private AtomicInteger idxCounter;
	
    @PostConstruct
    public void postConstruct() {
        // EmitterProcessor와 EmitterProcessor.sink() 모두 사용금지. Sinks.many()로 대체권장.
        this.userMany = Sinks
                .many()
                .multicast()
                .onBackpressureBuffer();
        this.idxCounter = new AtomicInteger(1);
    }
	
    public Mono<ServerResponse> signup(ServerRequest request) {
        // 요청에 의한 신규데이터 삽입은 emitNext와 tryEmitNext 메소드로 사용 가능.
        // 리턴타입과 아규먼트가 다르므로 반드시 자바독 필독.
        this.userMany
                .tryEmitNext(new SeumUserDetails(this.idxCounter.getAndIncrement()));
		
        // 함수형으로 데이터를 반환하기 위한 모노 서버리스폰스 메소드
        return ServerResponse
                .ok()
                .contentType(MediaType.TEXT_EVENT_STREAM)
                .body(BodyInserters.fromProducer(
                        this.userMany.asFlux(), 
                        Boolean.class
                ));
    }
}

정리 :::

Sinks.many().multicast().onBackpressurBuffer() :::

::: 새로고침 할 때마다 내 브라우저는 누적으로 보여지지만 타 브라우저는 올 클리어

 

Sinks.many().replay().latest() :::

::: 새로고침할 때마다 타 브라우저는 누적으로 보여지지만 내 브라우저는 올 클리어

 

Sinks.many().replay().all() :::

::: 모든 브라우저가 새로운 데이터가 처리될 때마다 항상 누적으로 보여짐

 

 

4. 요청을 잡아내기 위한 라우터펑션 신규추가

@Configuration
public class SeumUserRouter {
    // 불필요하면 제거 가능
    private final static Logger logger = LoggerFactory.getLogger(SeumUserRouter.class);
	
    // Bean 어노테이션 필수. 컨트롤러로 작용하는게 아니라 
    // 웹플럭스가 URL요청에 즉각 대응하려고 메소드만 따로 떼어가는 개념인듯.
    @Bean
    public RouterFunction<ServerResponse> test(SeumUserHandler handler) {
        return RouterFunctions.route(
                        RequestPredicates
                                .GET("/")
                                .and(RequestPredicates
                                        .accept(MediaType.ALL)
                                ), 
                        handler::signup
                );
    }
}

5. 테스트

브라우저 최초 진입 시 데이터가 1개만 나오지만 새로고침을 연발해보면

페이지가 새로고침되지 않고 F5를 연발하는동안 1회마다 1개씩 새로운 회원정보가 생성되어 삽입되는 것을 확인할 수 있다.


단, 어째서인지 다중 브라우저에서 접속 시 한 브라우저에서 데이터를 발생시키면 다른 브라우저에서는 그동안 쌓였던 모든 출력정보가 날아가버리고 새로운 정보로만 즉각 새로고침이 된다. 데이터가 스택이 쌓이는건 F5를 연발한 해당 브라우저에서만.

 

브라우저 결과가 아닌 REST API로써 대응결과는 현재 확인중.

 

 

 

p.s 001: 한번 방출된 데이터는 수정에 의한 재방출이 없음. 고로, 제목 한차례 수정. 데이터 수정에 따른 재방출은 웹플럭스 기능이 아닌듯

반응형

'Java (based by Spring Boot 2)' 카테고리의 다른 글

너무 늦은 R2DBC 학습  (0) 2022.08.10
스프링 웹플럭스에서 index.html 파일을 보여주기  (0) 2022.07.12
웹플럭스 미치겠다  (0) 2021.07.18
아니 잠깐  (0) 2021.07.10
Mono에 대한 궁금증  (0) 2021.06.28
Comments