일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- Armeria
- R2DBC Paging
- pinpoint
- ㅉ때
- jar 배포
- 노드간 통신
- intellij
- 플루터
- UnsupportedOperationException
- Ingress Controller Fake
- pinpoint 2.5.3
- Loki 로그
- jsonMarshaller
- RedirectService
- 애자일 싫타
- reids
- 티스토리챌린지
- OIDC
- fake jwt
- 개발 어렵당.ㅠ
- save/update
- 월급루팡 일지
- 오블완
- 핀포인트
- LPOS
- nGinder
- formik
- 7879
- hbase 저장공간 설정
- 논블록킹 성능
- Today
- Total
대머리개발자
flatMap vs Map 본문
하면 할 수록 더더더 어렵지나
간편 로그인 후 전달 받은 사용자 정보를 존재하는지 확인하고 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
'개발이야기 > 자봐' 카테고리의 다른 글
Armeria 프레임워크 - Authorizer<HttpRequest> (0) | 2023.10.12 |
---|---|
Armeria 프레임워크 - 리다이렉트(2) (1) | 2023.10.06 |
reactive 리팩토리.. (0) | 2023.08.04 |
jib 이용한 컨테이너 배포 (0) | 2023.07.25 |
로또플줵 - 끝이(?) (0) | 2023.06.19 |