Skip to content

API URL namespace를 v1에서 v2로 이동#52

Merged
dennis0405 merged 5 commits into
developfrom
feat/api-v2-namespace
May 12, 2026
Merged

API URL namespace를 v1에서 v2로 이동#52
dennis0405 merged 5 commits into
developfrom
feat/api-v2-namespace

Conversation

@dennis0405

Copy link
Copy Markdown
Collaborator

기존 앱(v1) 호환을 위해 develop이 노출하는 API를 /api/v2/*로 옮긴다.
v1 폴더는 비어있는 상태가 되며, 이후 Step에서 main의 v1 코드를 이식한다.

  • pages/api/v1/ → pages/api/v2/ (47개 endpoint git mv로 이동)
  • middleware.ts matcher 28개 v2로 교체
  • src/lib/openapi/register-paths.ts 경로 51개 v2로 교체 (/api/health-check는 버전 prefix 없이 유지)
  • 클라이언트 fetch 6개소 v2로 갱신 (download/app, c/edit/[uuid], src/repositories/club.ts)

login native callback API도 변경 -> 마찬가지로 app에서 관리 필요 (web callback은 안 쓰는 중이라 상관 X)

기존 앱(v1) 호환을 위해 develop이 노출하는 API를 /api/v2/*로 옮긴다.
v1 폴더는 비어있는 상태가 되며, 이후 Step에서 main의 v1 코드를 이식한다.

- pages/api/v1/ → pages/api/v2/ (47개 endpoint git mv로 이동)
- middleware.ts matcher 28개 v2로 교체
- src/lib/openapi/register-paths.ts 경로 51개 v2로 교체
  (/api/health-check는 버전 prefix 없이 유지)
- 클라이언트 fetch 6개소 v2로 갱신
  (download/app, c/edit/[uuid], src/repositories/club.ts)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

외부 시스템이 직접 호출하는 콜백 URL은 앱 버전과 독립적이라서 버전 없이 관리하는것은 어떨까요?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

추가로 server/ENV.ts에서
REDIRECT_URI: ${SERVER_BASE_URL}/v1/auth/kakao/callback,
이 부분도 수정해야 할 것 같습니다

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Kakao Web Login callback은 현재 사용 중인 API가 아니고,
ENV.ts에 있는 REDIRECT_URI 변수도 따라서 사용 중이지 않은 것으로 알고 있습니다

실제 소셜 로그인 시 사용하는 API는 POST /v1/auth/kakao/native/callback (or apple) 로,
외부 시스템이 아니라 App에서 직접적으로 호출 중입니다

물론 로그인 API 같은 경우에는 따로 버저닝이 없어도 될 것 같은데,
하나의 디렉토리 아래에서 통일성 있게 관리하려고 저런 식으로 설정한 것 같아요

@dennis0405

Copy link
Copy Markdown
Collaborator Author

AI가 설명하는 소셜 로그인 흐름

현재 Kakao social login 흐름은 이렇게 되어 있습니다.

  1. 로그인 진입

    • 비로그인 상태에서 프로필 아이콘 클릭, 마이 탭 클릭, 동아리 상세의 로그인 CTA 클릭 시 로그인 BottomSheet가 열립니다.
    • BottomSheet 안에 카카오톡으로 계속하기 버튼이 있고, 이 버튼이 Kakao 로그인 시작점입니다.
    • 참고: LoginView.tsx, loginBottomSheetContext.tsx
  2. Kakao SDK 로그인

    • 버튼 클릭 시 @react-native-seoul/kakao-loginlogin()을 호출합니다.
    • 성공하면 SDK 결과의 result.accessToken을 얻습니다.
    • 이 토큰은 앱 자체 토큰이 아니라 Kakao access token입니다.
  3. 백엔드 콜백 호출

    • 앱은 Kakao access token을 authService.callback(AuthProvider.KAKAO, result.accessToken)로 넘깁니다.
    • usecase는 callbackKakaoAuth({ accessToken })를 호출합니다.
    • repository는 POST /v1/auth/kakao/native/callback{ accessToken }을 보냅니다.
    • 백엔드는 응답으로 앱에서 쓸 자체 token을 내려줍니다.
    • 참고: auth.ts, repositories/auth.ts
  4. 앱 토큰 저장 및 유저 상태 갱신

    • 백엔드가 준 tokenAsyncStorageLOGIN_TOKEN, 실제 key는 'token', 에 저장합니다.
    • 이후 userService.getUser()/v1/users/me를 호출해서 현재 유저 프로필을 가져오고 ProfileContextuser 상태를 세팅합니다.
    • BottomSheet를 닫고 manageClubs 쿼리를 invalidate합니다.
    • 참고: LoginView.tsx
  5. 이후 API 인증 방식

    • apiConnector가 매 요청마다 AsyncStorage.getItem('token')을 읽습니다.
    • 토큰이 있으면 Authorization: Bearer ${token}x-authorization: Bearer ${token}를 같이 붙입니다.
    • 참고: api.ts
  6. 네이티브 redirect 설정

    • Android는 kakao{KAKAO_APP_KEY}://oauth 스킴을 AuthCodeHandlerActivity에 연결합니다.
    • iOS는 CFBundleURLSchemes$(KAKAO_URL_SCHEME)을 등록하고, AppDelegate에서 Kakao URL이면 RNKakaoLogins.handleOpenUrl로 넘깁니다.
    • 참고: AndroidManifest.xml, AppDelegate.mm, Info.plist

주의할 점은 현재 앱은 Kakao 토큰을 장기 저장하지 않고, 백엔드가 내려준 자체 토큰만 저장합니다. 그리고 로그인 실패는 세부 에러 분기 없이 전부 “로그인에 실패했어요” Toast로 처리됩니다.

@yabsed yabsed left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

로직에 큰 수정이 없고 크게 보면 아직까지 URL 주소 변경이므로 Approve합니다

기존 앱(v1) 호환을 위해 main의 v1 endpoint와 의존 서비스를 develop에 옮겨 격리한다.
v2 코드는 건드리지 않고, v1은 통째로 폴더 단위 격리되어 향후 v2 일원화 시 일괄 삭제 가능하다.

- pages/api/v1/ 27개 endpoint를 main에서 복사
- server/service/v1/ 5개 서비스 복사 (Auth/Club/Review/Slack/User)
  - Provider DI cache key 충돌을 피하려 클래스명에 V1 접미사 부여
- server/infra/database/entities/v1/club-manager-register-request.entity.ts 추가
  - develop이 새 테이블 club_manager_request로 entity를 옮긴 반면,
    원래 club_manager_register_request 테이블은 그대로 남아있어 v1 전용 entity로 격리
- middleware.ts matcher에 v1 인증 보호 path 12개 append
- user.service.ts: develop이 nullable로 바꾼 college/major 컬럼에 ?? undefined 처리
develop의 Club 도메인은 main 대비 12개 신규 필드(shortDescription, affiliationType,
collegeMajorId, collegeMajor, isOfficialVerified, verifiedAt, dongbangLocation,
minActivityPeriod, activeMemberCount, sns, status, rejectReason)를 가진다.
또한 CollegeMajor는 college/major가 nullable로 바뀌었다.

v1 endpoint가 develop entity를 그대로 직렬화하면 main 응답과 shape이 어긋나
기존 앱 호환이 깨지므로 v1 service 안에 main과 동일한 shape의 mapper를 둔다.

- server/service/v1/club.service.ts: V1Club 타입 + toV1ClubDomain 함수 추가,
  develop의 toClubDomain 호출을 모두 toV1ClubDomain으로 교체
- server/service/v1/user.service.ts: V1CollegeMajor 타입 추가,
  getCollegeMajors의 nullable 컬럼을 ?? ''로 좁혀 main 계약 유지
- pages/api/v1/*: ResponseData 타입을 V1Club/V1CollegeMajor로 갱신

검증: dev DB(telepresence) 위에서 /api/v1/clubs/popular, /clubs/latest,
/clubs/categories, /users/majors 응답이 main의 필드 집합과 1:1 일치 확인.
@dennis0405 dennis0405 merged commit 601c269 into develop May 12, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants