대머리개발자

리액티브 Block 하기!!! 본문

개발이야기/개념

리액티브 Block 하기!!!

대머리개발자 2023. 11. 30. 23:18
728x90

안되는 것은 안 되는데.. 될 수도 있지 않을까?? 하는 희망으로 오늘도 삽질을 시작한다.

 

현재 만들어 놓은 oauth 서버에서 유일하게 블로킹 코드가 존재한다.

 

전체 Flow를 보자면.

1.네이버에게 인증을 하고 콜백으로 돌아온 code 값을를 가지고 네이버 동의된 개인정보를 가지고 와서

2.자체적인 토큰을 만들고

3.우리 내 프론트 페이지에게 전달하면 된다.

 

token을 가져오는데 JDBC로 연결해서 쿼리의 결과를 받아 오는 블락킹 코드이다...가즈아!!

public HttpResponse redirect(ServiceRequestContext ctx){
    //.. 생략 .. //
    // 1~2 - 네이버 콜백을 처리 하고 토큰
    Oauth2Token oauth2Token = ServiceUtil.getNaverOauth2Service().getToken(ctx.queryParams(), target);

    //.. 생략 .. //
    
    // 3. - 우리내 페이지로 리다이렉트
    return HttpResponse.of(ResponseHeaders.builder(HttpStatus.TEMPORARY_REDIRECT)
            .addObject(HttpHeaderNames.SET_COOKIE,
                    Cookie.secureBuilder(OAuth2Constants.ACCESS_TOKEN, oauth2Token.getAccess_token())
                            .httpOnly(false).domain(domain).maxAge(oauth2Token.getExpires_in()).path("/").build().toSetCookieHeader())
            .addObject(HttpHeaderNames.SET_COOKIE,
                    Cookie.secureBuilder(OAuth2Constants.REFRESH_TOKEN, oauth2Token.getRefresh_token())
                            .httpOnly(false).domain(domain).maxAge(oauth2Token.getRefresh_expires_in()).path("/").build().toSetCookieHeader())
            .set(HttpHeaderNames.LOCATION, oauth2Token.getRedirect_uri())
            .build());

}

 

논블록킹 형태의 프로세스이다 보니 Oauth2Token을 가져오기 전에 null 값으로 return을 해버린다. ★ 이슈

아놔!!. 도오온나 얻어 걸리기 위해서 테스트 진행했다.

 

허우적...허우적...

 

진심 잘 몰라서 하는 소리이다. "실제 환경"에서 사용하면 안 되는 메서드를 왜 만들어겠뇨?

본인 지식만 경험만.. 맞다고 생각하는 행위는 당연하다.그러나 그에 합당한 근거가 있어야 하지 않겠니..?

 

물론 RxJava를 사용하는 이유에 반하기는 하지만 "지양"하자는 말이지 잘못되었다고 보는 것은 맞지 않다.!!

물론 아르메리아 친구도 블로킹 코드를 탐지해서 예외처리를  쓰고 싶어도 못쓴다.

 

어째거나 난 데이터 스트림을 block해서 스트림 밖으로 외부로 꺼내야 한다.ㅠ

 

일단 토큰을 가져오는 부분을 Mono로 변경했고.....

Mono 데이터를...어떻게..아.. 오... subscribe()에서  변수에 주입해보자.!!.. 띠용.. 얻어 걸려야.. 수 많은 테스트..ㅋ

 

주입을 하더라도 Flow가 슈우웅 지나간다.  ★ 이게 문제지...

그렇기 때문에.. 설정될때까지.. 구독이 완료되기 까지.. busy-waiting을 한다( atomic 널 체크)

야호!!!.. 일단 동작은 정상동작이 된다잉..흑흑 고생끝 행복시작이다.

AtomicReference<Oauth2Token> atOauth2Token = new AtomicReference<>();
ServiceUtil.getNaverOauth2Service().getToken(ctx.queryParams(), target)
                                    .subscribeOn(Schedulers.immediate())
                                    .subscribe(atOauth2Token::set);

while(atOauth2Token.get() == null){
    Thread.sleep(60);
}

But 여러가지 예기치 못한 이유로 무한 루프에 빠질수 있는 구조이다.

바로 관련 DB를 셧다운 하고 테스트 해보니.. 무한 뺑글뺑글..

 

설정값에 대한 널 체크가 아닌 구독자체의 완료여부를 체크한다.(쳇GPT 고맙데이!!)

Disposable disposable = ServiceUtil.getNaverOauth2Service().getToken(ctx.queryParams(), target)
                                    .subscribeOn(Schedulers.boundedElastic())
                                    .subscribe(atOauth2Token::set);
                                    
while(!disposable.isDisposed()){
    Thread.sleep(60);
}

 

 

왜 데이터 스트림을 block하고 외부에 저장하려고 했냐면 

근본적으로 스트림데이터를 Body에 바인딩 하는 것이 아니라 헤더 값(쿠키와 리다이렉트 주소)으로 설정해야 했다. 

 

전체Flow에서 3번의 과정을 하기 위한 것이였다.

사실 아키텍쳐에서 쿠키가 아닌 포스트방식으로 관련 데이터를 넘겨주어도 되나....이미 만들어진 레거시를 이기기 힘들었다. 

 

더 좋은 방안이 있다면...추후 연구좀 해봐야겠다.

 

일단 JDBC코드를 클린했다는 것에 만족하자. ㅠㅠ 

난블록킹을 지향하는데!!? JDBC 코드가 말이 되니??

 

 

 

 

 

728x90

'개발이야기 > 개념' 카테고리의 다른 글

SPA..  (0) 2023.12.13
게시판에서 공지 기능 만들기  (2) 2023.12.07
리액티브 프로그래밍  (0) 2023.11.29
인증...아..애자일  (0) 2023.11.04
URI 컨벤션...  (0) 2023.10.25