가게 상세 페이지에서는 크게 두가지 분기처리가 되어있다.

  1. 로그인한 유저
  2. 비로그인 상태의 유저

토리는 앱 실행 후 첫 화면에서 로그인을 강제하지 않는다.

그러다 보니 게스트와 유저 모두 접근이 가능하면서 유저일 때에는 추가 데이터를 제공하는 가게 상세 정보 API에서 문제가 생겼다.

가게 상세 정보에선 가게정보, 화장실 시설 정보, 메뉴,내 리뷰, 5개의 리뷰정도를 반환하고있다.

이 중 유저가 로그인을 해야만 나오는 정보는 내 리뷰, 리뷰에서 도움이 된 리뷰(좋아요 기록 같은 개념.)이다.

  @ApiPlace.GetPlace({
    summary: '가게 상세 조회',
  })
  @Get(':placeId')
  @UseGuards(AllowGuestGuard)
  async getPlace(
    @GetAuthorizedUser() authorizedUser: IAuthorizedUser,
    @Param('placeId', ParseIntPipe) placeId: number,
  ): Promise<PlaceDetailDto> {
    return await this.placeService.getPlaceByPlaceId(
      placeId,
      authorizedUser?.userId,
    );
  }

현재 가게 상세 정보를 조회하는 api는 AllowGuestGuard를 통해 로그인 한 유저와 게스트 상태를 확인한다(토큰의 유무로 회원 비회원 판단 후 처리). 만약 로그인 한 유저의 RT(RefreshToken)가 만료되면 회원이 아닌 비회원으로 인식해야하지만, PassportStrategy 에 의해 JWTExpired로 처리되어 비회원이 아닌 예외를 반환한다.

지금까지 생각나는 방법은

  1. PassportStrategy 오버라이드 하여 리프레시 토큰 전략에서 만료일때 패싱하는 Strategy 구현
  2. 회원 전용 url 비회원 url 두개로 api를 분리하여 구성
  3. 앱 영역에서 조기 처리 할 수 있도록 구성

두 가지 정도인 것 같다.

1번은 너무 투머치고 PassportStrategy의 존재 의의를 거스른다 생각하여 바로 패스했다.