대머리개발자

flatMap vs Map 본문

개발이야기/자봐

flatMap vs Map

대머리개발자 2023. 9. 15. 16:48
728x90

하면 할 수록 더더더 어렵지나

 

간편 로그인 후 전달 받은 사용자 정보를 존재하는지 확인하고 JWT를 리턴해 주는 심플한 코드다.

 

public Mono<Oauth2Token> getToken(QueryParams queryParams){        
        var userInfo = execute(queryParams, clientId, clientSecret, redirectUrl, authUrl, infoDomain, infoPath);
        UserGrpc.User loginInfo = UserGrpc.User.newBuilder()
                .setId(userInfo.get(Constants.ID) + "")
                .setEmail(String.valueOf(userInfo.get(Constants.EMAIL)))
                .setName(String.valueOf(userInfo.get(Constants.NAME)))
                .setType(CommonGrpc.UserType.valueOf("GOOGLE"))
                .build();

        return  ServiceUtil.getUserService().create(User.builder().build().toDto(loginInfo))
                .map(ServiceUtil.getJwtService()::createInnerAccessToken);

 

1. 구글 Oauth를 통해 userInfo 받아온다.

2. userInfo를 proto 객체로 바인딩한다.

3. create()하고 JWT를 넘긴다.    // create 할 때 이미 있으면 있는 사용정보 리턴

serverBuilder.service( "/v2/{provider}/{clientId}", new RedirectService(ctx -> {
    Mono<Oauth2Token> token = switch (Objects.requireNonNull(ctx.pathParam("provider"))) {
        case "g" -> ServiceUtil.getGoogleOauth2Service().getToken(ctx.queryParams());
        case "n" -> ServiceUtil.getNaverOauth2Service().getToken(ctx.queryParams());
        case "k" -> ServiceUtil.getKakaoOauth2Service().getToken(ctx.queryParams());
        default -> Mono.empty();
    };

    Oauth2Token transfer = Oauth2Token.builder().build();
    token.subscribe(oauth2Token -> {
        System.out.println( "subscribe !!");
        transfer.setAccess_token(oauth2Token.getAccess_token());
        transfer.setRefresh_token(oauth2Token.getRefresh_token());
    });

    System.out.println( "return !!");
    return host + "/login" +
            "?access_token=" + transfer.getAccess_token() +
            "&refresh_token=" + transfer.getRefresh_token();

}, false));

 

return이 먼저 텨 나온다. ㅋㅋ .......비통기가 어렵구만.

구독 먼저 처리 해줘잉...

 

☆ 제목에서 map이랑 flatMap을 언급해서 느낌 왔겠지만 동작 방식이 다르다.

☆ 동기 : map

☆ 비동기 : flatmap

 

Map으로 처리 할 때 잘 되는 것처럼 보이지만 지연되는 무거운 서비스가 돌아가면... 결국은 결국이다... 이유는 동기는 

하나의 스트림에서만... 실행순서를 보장하기 때문이다.

 

위에 코드의 근본적인 문제는 중간 스트림 형태의 로직이 들어가지만 최종 리턴 형태는 단순 문자열이다. 따라서 애초부터 동기식코드로 진행했어야 맞는거다. 

 

** 리다이렉트 서비스의 리턴이 Mono였다면..... 아쉽구만....(Mono.just() -> String   :  안 되는거다...아키텍쳐의 문제다. ㅎ)

 

동기식 처리를 위한 JPA.설정..........R2DBC랑 뭔가 충돌이 있는듯.... 잘 되지 않았다.  -->  나중에 다시 해보자.

일단 mybatis로 스삭...

 

여러 프로세스가 하나의 순서가 보장되면 물 흘러가듯이 진행되고 리턴까지 스삭되면 나이스 하지만

 

 

** 쓰레드.슬리피(1000)를 주면 되긴 하는데 뭔가 찝찝s

 

 

728x90