Skip to content

dev -> prod#687

Merged
seaniiio merged 27 commits into
release-befrom
develop
Jun 18, 2026
Merged

dev -> prod#687
seaniiio merged 27 commits into
release-befrom
develop

Conversation

@seaniiio

@seaniiio seaniiio commented Jun 18, 2026

Copy link
Copy Markdown
Member

Issues

  • closed #이슈번호

✔️ Check-list

  • : Label을 지정해 주세요.
  • : Merge할 브랜치를 확인해 주세요.

🗒️ Work Description

📷 Screenshot

📚 Reference

Summary by CodeRabbit

Release Notes

  • New Features

    • Apple 로그인 기능 추가
    • 관리자가 자신에게 배정된 검수 요청 조회 가능 (내 검수 요청)
    • Google iOS 클라이언트 지원 추가
  • Improvements

    • 소셜 로그인 API 통합 (Google/Apple 공통 처리)
    • Kakao 로그인에서 Apple 로그인으로 변경
    • Gradle Convention Plugins 추가로 빌드 설정 표준화

jerry8282 and others added 27 commits April 20, 2026 03:18
[feat] Build-Logic 모듈 생성 및 설정
iOS 기기에서 Google 로그인이 실패하는 문제를 해결하기 위해 iOS 클라이언트 ID를 audience에 추가

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
[feat] 어드민 검수 요청 페이지 개선
@github-actions github-actions Bot requested a review from yrsel June 18, 2026 12:49
@seaniiio seaniiio merged commit 31bcd62 into release-be Jun 18, 2026
9 of 10 checks passed
@coderabbitai

coderabbitai Bot commented Jun 18, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 98a44dcf-e6ae-442d-a7ae-3cf580e22e9e

📥 Commits

Reviewing files that changed from the base of the PR and between 3c35d6b and 8b5a5bc.

📒 Files selected for processing (64)
  • .github/workflows/backend-dev-admin-deploy.yml
  • .github/workflows/backend-dev-app-deploy.yml
  • .github/workflows/backend-prod-admin-deploy.yml
  • .github/workflows/backend-prod-app-deploy.yml
  • backend/turip-admin/src/main/java/turip/controller/AdminPendingContentController.java
  • backend/turip-admin/src/main/java/turip/controller/dto/response/PendingListResponse.java
  • backend/turip-admin/src/main/java/turip/service/AdminContentPendingService.java
  • backend/turip-admin/src/main/resources/application.yml
  • backend/turip-admin/src/main/resources/templates/admin/home.html
  • backend/turip-admin/src/main/resources/templates/admin/pending-list.html
  • backend/turip-admin/src/test/java/turip/controller/AdminPendingContentApiTest.java
  • backend/turip-admin/src/test/java/turip/service/AdminContentPendingServiceTest.java
  • backend/turip-admin/src/test/resources/application-test-mysql.yml
  • backend/turip-admin/src/test/resources/application-test.yml
  • backend/turip-app/build.gradle
  • backend/turip-app/src/main/java/turip/account/domain/Provider.java
  • backend/turip-app/src/main/java/turip/account/service/SocialMemberService.java
  • backend/turip-app/src/main/java/turip/auth/controller/AuthController.java
  • backend/turip-app/src/main/java/turip/auth/controller/dto/request/GoogleLoginRequest.java
  • backend/turip-app/src/main/java/turip/auth/controller/dto/request/SocialLoginRequest.java
  • backend/turip-app/src/main/java/turip/auth/service/AuthService.java
  • backend/turip-app/src/main/java/turip/auth/token/AppleTokenParser.java
  • backend/turip-app/src/main/java/turip/auth/token/GoogleTokenParser.java
  • backend/turip-app/src/main/java/turip/auth/token/IdTokenParserResolver.java
  • backend/turip-app/src/main/java/turip/content/repository/ContentPendingRepository.java
  • backend/turip-app/src/main/resources/application.yml
  • backend/turip-app/src/test/java/turip/auth/api/AuthApiTest.java
  • backend/turip-app/src/test/java/turip/auth/service/AuthServiceTest.java
  • backend/turip-app/src/test/java/turip/auth/token/IdTokenParserResolverTest.java
  • backend/turip-app/src/test/resources/application-test-mysql.yml
  • backend/turip-app/src/test/resources/application-test.yml
  • mobile/.editorconfig
  • mobile/build-logic/convention/.gitignore
  • mobile/build-logic/convention/build.gradle.kts
  • mobile/build-logic/convention/src/main/java/com/on/buildlogic/convention/KmpApplicationConventionPlugin.kt
  • mobile/build-logic/convention/src/main/java/com/on/buildlogic/convention/KmpComposeConventionPlugin.kt
  • mobile/build-logic/convention/src/main/java/com/on/buildlogic/convention/KmpFeatureApiConventionPlugin.kt
  • mobile/build-logic/convention/src/main/java/com/on/buildlogic/convention/KmpFeatureImplConventionPlugin.kt
  • mobile/build-logic/convention/src/main/java/com/on/buildlogic/convention/KmpLibraryConventionPlugin.kt
  • mobile/build-logic/convention/src/main/java/com/on/buildlogic/convention/KotlinSerializationConventionPlugin.kt
  • mobile/build-logic/convention/src/main/java/com/on/buildlogic/convention/extension/ComposeGradleDsl.kt
  • mobile/build-logic/convention/src/main/java/com/on/buildlogic/convention/extension/KmpTargets.kt
  • mobile/build-logic/convention/src/main/java/com/on/buildlogic/convention/extension/PluginIds.kt
  • mobile/build-logic/convention/src/main/java/com/on/buildlogic/convention/extension/VersionCatalogExt.kt
  • mobile/build-logic/gradle.properties
  • mobile/build-logic/settings.gradle.kts
  • mobile/build.gradle.kts
  • mobile/composeApp/build.gradle.kts
  • mobile/composeApp/src/androidMain/kotlin/com/jetbrains/kmpapp/MainActivity.kt
  • mobile/composeApp/src/androidMain/kotlin/com/jetbrains/kmpapp/MuseumApp.kt
  • mobile/composeApp/src/commonMain/kotlin/com/jetbrains/kmpapp/App.kt
  • mobile/composeApp/src/commonMain/kotlin/com/jetbrains/kmpapp/data/MuseumApi.kt
  • mobile/composeApp/src/commonMain/kotlin/com/jetbrains/kmpapp/data/MuseumObject.kt
  • mobile/composeApp/src/commonMain/kotlin/com/jetbrains/kmpapp/data/MuseumRepository.kt
  • mobile/composeApp/src/commonMain/kotlin/com/jetbrains/kmpapp/data/MuseumStorage.kt
  • mobile/composeApp/src/commonMain/kotlin/com/jetbrains/kmpapp/di/Koin.kt
  • mobile/composeApp/src/commonMain/kotlin/com/jetbrains/kmpapp/screens/EmptyScreenContent.kt
  • mobile/composeApp/src/commonMain/kotlin/com/jetbrains/kmpapp/screens/detail/DetailScreen.kt
  • mobile/composeApp/src/commonMain/kotlin/com/jetbrains/kmpapp/screens/detail/DetailViewModel.kt
  • mobile/composeApp/src/commonMain/kotlin/com/jetbrains/kmpapp/screens/list/ListScreen.kt
  • mobile/composeApp/src/commonMain/kotlin/com/jetbrains/kmpapp/screens/list/ListViewModel.kt
  • mobile/composeApp/src/iosMain/kotlin/com/jetbrains/kmpapp/MainViewController.kt
  • mobile/gradle/libs.versions.toml
  • mobile/settings.gradle.kts

Walkthrough

Apple 소셜 로그인 기능이 추가되어 AppleTokenParser와 범용 IdTokenParserResolver로 소셜 로그인 흐름이 일반화되었다. 관리자 전용 "내 검수 요청" 목록/카운트 API와 UI가 추가되었다. 모바일 KMP 빌드가 6개의 convention 플러그인 기반으로 재구성되고 패키지가 com.on.turip으로 마이그레이션되었다.

Changes

Apple 소셜 로그인 및 범용 토큰 파서

Layer / File(s) Summary
Provider enum 및 요청 DTO 통합
backend/turip-app/src/main/java/turip/account/domain/Provider.java, backend/turip-app/src/main/java/turip/auth/controller/dto/request/SocialLoginRequest.java, backend/turip-app/build.gradle
Provider enum에서 KAKAOAPPLE로 교체하고, GoogleLoginRequest를 삭제하며 SocialLoginRequest 단일 DTO로 통합하였다. nimbus-jose-jwt:9.40 의존성이 추가되었다.
AppleTokenParser 및 IdTokenParserResolver 구현
backend/turip-app/src/main/java/turip/auth/token/AppleTokenParser.java, backend/turip-app/src/main/java/turip/auth/token/GoogleTokenParser.java, backend/turip-app/src/main/java/turip/auth/token/IdTokenParserResolver.java
AppleTokenParser가 Apple JWKS 기반 RS256 검증 및 클레임 검증을 수행하도록 구현되었다. GoogleTokenParser가 iOS 클라이언트 ID를 추가 audience로 허용하도록 확장되었다. IdTokenParserResolverProvider 키로 파서를 동적으로 선택한다.
AuthService 일반화 및 AuthController Apple 엔드포인트 추가
backend/turip-app/src/main/java/turip/auth/service/AuthService.java, backend/turip-app/src/main/java/turip/account/service/SocialMemberService.java, backend/turip-app/src/main/java/turip/auth/controller/AuthController.java
AuthService.loginWithSocialIdTokenParserResolver로 파서를 동적 선택하도록 변경되었다. SocialMemberService.findOrCreateOptional<String> email을 받아 빈 경우 예외를 던진다. POST /api/v1/auth/login/apple 엔드포인트가 추가되었다.
turip-app 설정 및 리포지토리 메서드 추가
backend/turip-app/src/main/resources/application.yml, backend/turip-app/src/main/java/turip/content/repository/ContentPendingRepository.java
application.ymlgoogle.ios-client-idapple.client-id가 추가되었다. ContentPendingRepositorycountByStatusAndValidatorAccount 메서드가 추가되었다.
AuthApiTest/AuthServiceTest/IdTokenParserResolverTest 업데이트
backend/turip-app/src/test/java/turip/auth/api/AuthApiTest.java, backend/turip-app/src/test/java/turip/auth/service/AuthServiceTest.java, backend/turip-app/src/test/java/turip/auth/token/IdTokenParserResolverTest.java, backend/turip-app/src/test/resources/application-test*.yml
AuthApiTest@TestConfiguration 기반 mock bean으로 전환되었다. AuthServiceTestIdTokenParserResolver 기반 스텁으로 교체되었다. IdTokenParserResolverTest가 새로 추가되었다.
CI/CD 배포 스크립트에 시크릿 주입
.github/workflows/backend-*-deploy.yml
dev/prod 4개 워크플로우의 .env.tmp heredoc에 GOOGLE_IOS_CLIENT_IDAPPLE_CLIENT_ID 환경 변수가 추가되었다.

관리자 '내 검수 요청' 기능

Layer / File(s) Summary
PendingListResponse DTO 확장 및 서비스/리포지토리
backend/turip-admin/src/main/java/turip/controller/dto/response/PendingListResponse.java, backend/turip-admin/src/main/java/turip/service/AdminContentPendingService.java, backend/turip-admin/src/main/resources/application.yml
PendingListResponsevalidatorNickname 필드가 추가되었다. AdminContentPendingServicefindByValidatorAccount/countMyPending이 추가되었다. turip-admin application.yml에 Google iOS 및 Apple 설정이 추가되었다.
AdminPendingContentController 엔드포인트 및 관리자 UI
backend/turip-admin/src/main/java/turip/controller/AdminPendingContentController.java, backend/turip-admin/src/main/resources/templates/admin/home.html, backend/turip-admin/src/main/resources/templates/admin/pending-list.html
GET /my-list/my-count 엔드포인트가 추가되었다. home.html의 알림 드롭다운이 my-list/my-count API로 전환되었다. pending-list.html에 탭 UI, 검수자 컬럼, 탭별 API 분기 로직이 추가되었다.
관리자 API/서비스 테스트 추가
backend/turip-admin/src/test/java/turip/controller/AdminPendingContentApiTest.java, backend/turip-admin/src/test/java/turip/service/AdminContentPendingServiceTest.java, backend/turip-admin/src/test/resources/application-test*.yml
FindMyPendingTest/CountMyPendingTest 중첩 클래스가 추가되어 200, 빈 목록, 상태 필터, 403 케이스를 검증한다. FindByValidatorAccount 서비스 테스트 클래스가 추가되었다.

모바일 KMP 빌드 시스템 재구성

Layer / File(s) Summary
build-logic 설정 및 버전 카탈로그/유틸리티
mobile/build-logic/settings.gradle.kts, mobile/build-logic/gradle.properties, mobile/gradle/libs.versions.toml, mobile/build-logic/convention/src/.../extension/*
build-logic/settings.gradle.ktsgradle.properties가 구성되었다. libs.versions.toml이 전면 갱신되어 버전/라이브러리/플러그인 alias가 재구성되었다. VersionCatalogExt, PluginIds, KmpTargets, ComposeGradleDsl 유틸리티가 추가되었다.
Convention 플러그인 6종 및 루트 build.gradle.kts 등록
mobile/build-logic/convention/build.gradle.kts, mobile/build-logic/convention/src/.../KmpLibraryConventionPlugin.kt, KmpComposeConventionPlugin.kt, KmpApplicationConventionPlugin.kt, KmpFeatureApiConventionPlugin.kt, KmpFeatureImplConventionPlugin.kt, KotlinSerializationConventionPlugin.kt, mobile/build.gradle.kts
6개의 convention 플러그인이 구현 및 등록되었다. 루트 build.gradle.kts의 플러그인 alias가 갱신되고 KSP-ktlint 태스크 의존성 로직이 추가되었다.
composeApp 빌드 전환 및 소스 패키지 마이그레이션
mobile/composeApp/build.gradle.kts, mobile/composeApp/src/**, mobile/settings.gradle.kts, mobile/.editorconfig
composeApp/build.gradle.ktsturip.convention.kmp.application 기반으로 단순화되고 buildkonfig/buildTypes 설정이 추가되었다. 모든 소스의 패키지가 com.on.turip으로 마이그레이션되었다. KtorMuseumApiHttpClient 의존성이 제거되었다.

Sequence Diagram(s)

sequenceDiagram
  participant Client
  participant AuthController
  participant AuthService
  participant IdTokenParserResolver
  participant AppleTokenParser
  participant SocialMemberService

  Client->>AuthController: POST /api/v1/auth/login/apple (SocialLoginRequest)
  AuthController->>AuthService: loginWithSocial(request, Provider.APPLE, deviceFid)
  AuthService->>IdTokenParserResolver: resolve(Provider.APPLE)
  IdTokenParserResolver-->>AuthService: AppleTokenParser
  AuthService->>AppleTokenParser: getProviderId(idToken)
  AppleTokenParser-->>AuthService: sub (providerId)
  AuthService->>AppleTokenParser: getEmail(idToken)
  AppleTokenParser-->>AuthService: Optional<email>
  AuthService->>SocialMemberService: findOrCreate(APPLE, providerId, Optional<email>)
  SocialMemberService-->>AuthService: SocialMember
  AuthService-->>AuthController: SocialLoginResult
  AuthController-->>Client: 200 SocialLoginResponseV2
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • woowacourse-teams/2025-Turip#676: 동일한 KmpApplicationConventionPlugin/KmpComposeConventionPlugin 등 convention 플러그인 구성 및 .editorconfig 변경이 코드 수준에서 겹친다.
  • woowacourse-teams/2025-Turip#686: 관리자 "내 검수 요청" 기능의 /my-list, /my-count 엔드포인트 및 validatorNickname 매핑/UI 변경이 동일하게 구현되어 있다.

Suggested labels

💻 BackEnd, 🤖 Android, 📝 feat

Suggested reviewers

  • eunseongu
  • yrsel
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch develop

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

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.

2 participants