Skip to content

[Refactor] 완료된 A/B 테스트 실험 코드 제거 (7개 실험) #1440

Description

@kongwoojin

♻️ 완료된 A/B 테스트 실험 코드 제거 (7개 실험)

팀/모듈: koin, feature/banner, feature/dining, feature/club, core/analytics
우선순위: Medium


📋 리팩토링 설명

실험이 완료된 7개의 A/B 테스트에 대한 로깅, 패자군 UI, 조건 분기 코드를 모두 제거합니다.
승자군 코드는 기본 동작으로 통합하고, 패자군 코드 및 실험 분기 로직을 삭제합니다.

대상 실험 목록 및 승자/패자 매핑 (A/B 테스트 플랫폼 closed 결과 기반):

실험 이름 Experiment enum 엔트리 experimentTitle 승자 (유지) 패자 (제거)
dining2shop_1 DINING_STORE "dining_store" CONTROL VARIANT
CAMPUS_notice_1 MAIN_ARTICLE_KEYWORD_BANNER "c_keyword_ banner_v1" MAIN_BANNER_NEW MAIN_BANNER_ORIGINAL
CAMPUS_modal_1 MAIN_BANNER_UI "a_main_banner_ui" BOTTOM_BANNER (BannerA) CENTER_BANNER (BannerB)
CAMPUS_dining_1 MAIN_DINING_SEE_MORE "c_main_dining_v1" MAIN_DINING_NEW MAIN_DINING_ORIGINAL
CAMPUS_club_1 MAIN_CLUB_UI "a_main_club_ui" HOT CATEGORY
BUSINESS_call_1 BUSINESS_CALL "business_call" CALL_NUMBER CALL_FLOATING
BUSINESS_benefit_1 BENEFIT_STORE "Benefit" A B

주의: DINING_SHARE ("campus_share_v1") 실험은 winner=share_new이지만 본 리팩토링 대상 아님. A/B 테스트 인프라(ABTestUseCase, ABTest 모델, API, Room 등)와 함께 반드시 유지.


🎯 목표

  • 완료된 실험의 분기 코드를 제거하여 코드 복잡도를 낮춥니다.
  • 패자군 UI 컴포넌트를 삭제하고, 승자군 코드를 기본 동작으로 통합합니다.
  • 더 이상 사용되지 않는 A/B 테스트 로깅 유틸리티를 정리합니다.
  • DINING_SHARE 실험과 공유 인프라는 그대로 유지합니다.

⚠️ 주의사항

  • 동작 변경 없이 코드 구조만 개선합니다. 승자군의 기존 동작이 기본 동작이 됩니다.
  • DINING_SHARE 실험은 제거 대상이 아니므로 ABTestUseCase, ABTest 도메인 모델, UserAuthApi의 AB 테스트 엔드포인트, ABTestDao/ABTestEntity (Room), UserRepository의 AB 테스트 메서드 등 공유 인프라를 삭제하지 마세요.
  • feature/diningabTestExperimentGroup (DINING_SHARE용)과 DiningItemByABTest 컴포저블은 유지해야 합니다.

🔍 영향 범위 (패자군 제거 명세)

1. 공통 — Experiment 정의 (core)

  • core/src/main/java/in/koreatech/koin/core/abtest/Experiment.kt
    • Experiment enum: 7개 엔트리 제거 (BENEFIT_STORE, MAIN_DINING_SEE_MORE, MAIN_ARTICLE_KEYWORD_BANNER, BUSINESS_CALL, MAIN_BANNER_UI, MAIN_CLUB_UI, DINING_STORE), DINING_SHARE만 유지
    • ExperimentGroup object: SHARE_ORIGINAL, SHARE_NEW만 유지, 나머지 상수 제거 (A, B, MAIN_DINING_ORIGINAL, MAIN_DINING_NEW, MAIN_BANNER_ORIGINAL, MAIN_BANNER_NEW, CALL_NUMBER, CALL_FLOATING, BOTTOM_BANNER, CENTER_BANNER, CATEGORY, HOT, CONTROL, VARIANT)

2. 공통 — Analytics (core/analytics)

  • core/analytics/src/main/java/in/koreatech/koin/core/analytics/EventLogger.kt
    • logABTestEvent() 함수 (line 134-140) 제거 — 7개 실험 제거 후 호출처 없음
    • EventAction.ABTEST (line 310) 제거
    • EventCategory.DINING_AB_TEST_CATEGORY (line 319) 제거
  • core/analytics/src/main/java/in/koreatech/koin/core/analytics/AnalyticsConstant.kt
    • CLUB_AB_TEST_CATEGORY, CLUB_AB_TEST_DESIGN_A, CLUB_AB_TEST_DESIGN_B, CLUB_1 (line 148-152) 제거
    • DINING_AB_TEST_DESIGN_A, DINING_AB_TEST_DESIGN_B (line 181-182) 제거

3. dining2shop_1 (DINING_STORE) — 승자: CONTROL / 패자: VARIANT

플로팅 버튼(VARIANT) UI를 제거하고 CONTROL(플로팅 버튼 없음)을 기본 동작으로 통합.

영향 파일:

  • feature/dining/src/main/java/in/koreatech/koin/feature/dining/ui/diningdetail/DiningViewModel.kt
    • diningStoreAbTestExperimentGroup flow (line 97-108) 제거
    • _sessionId/sessionId StateFlow (line 82-83) 제거
    • getDiningSessionId() 함수 (line 211-218) 제거
  • feature/dining/src/main/java/in/koreatech/koin/feature/dining/ui/diningdetail/DiningDetailScreen.kt
    • diningStoreAbTestExperimentGroup 수집 (line 146-148 중 해당 부분) 제거
    • DiningAbTestFloatingButton 블록 (line 573-643) 제거 — 패자 변형(VARIANT)
  • feature/dining/src/main/java/in/koreatech/koin/feature/dining/component/abTeset/DiningAbTestFloatingButton.kt
    • 파일 전체 삭제 (패자 변형)
  • koin/src/main/java/in/koreatech/koin/ui/main/viewmodel/MainActivityViewModel.kt
    • diningStoreAbTestExperimentGroup flow (line 84-95) 제거
    • getDiningToShopSessionId() 함수 (line 206-214) 제거
  • koin/src/main/java/in/koreatech/koin/ui/main/activity/MainActivity.kt
    • diningStoreAbTestExperimentGroup 수집 및 세션 이벤트 로깅 블록 (line 267-290) 제거
    • DINING_AB_TEST_DESIGN_A/B import (line 32-33) 제거

4. CAMPUS_notice_1 (MAIN_ARTICLE_KEYWORD_BANNER) — 승자: MAIN_BANNER_NEW / 패자: MAIN_BANNER_ORIGINAL

MAIN_BANNER_NEW 동작을 기본으로 통합, MAIN_BANNER_ORIGINAL 분기 제거.

영향 파일:

  • koin/src/main/java/in/koreatech/koin/ui/main/viewmodel/MainActivityViewModel.kt
    • bannerABTestExperimentGroup flow (line 58-69) 제거
    • articleMain StateFlow의 combine에서 bannerABTestExperimentGroup 의존성 제거 (line 116-131)
  • 키워드 배너 UI 분기가 존재한다면 MAIN_BANNER_NEW 동작을 기본으로 통합

5. CAMPUS_modal_1 (MAIN_BANNER_UI) — 승자: BOTTOM_BANNER (BannerA) / 패자: CENTER_BANNER (BannerB)

BannerA(BOTTOM_BANNER 디자인)를 기본 동작으로 통합, BannerB 파일 삭제.

영향 파일:

  • feature/banner/src/main/java/in/koreatech/koin/feature/banner/ui/BannerViewModel.kt
    • abTestUseCase 주입 (line 31) 제거
    • mainBannerABTestExperimentGroup flow (line 41-52) 제거
  • feature/banner/src/main/java/in/koreatech/koin/feature/banner/ui/BannerActivity.kt
    • experimentGroup 수집 (line 40) 제거
    • when(experimentGroup) 분기 (line 63-101) → BannerA 호출만 남김
    • logABTestEvent 호출 제거
  • feature/banner/src/main/java/in/koreatech/koin/feature/banner/component/BannerB.kt
    • 파일 전체 삭제 (패자 변형)

6. CAMPUS_dining_1 (MAIN_DINING_SEE_MORE) — 승자: MAIN_DINING_NEW / 패자: MAIN_DINING_ORIGINAL

MAIN_DINING_NEW의 "더보기" 동작을 기본 동작으로 통합, MAIN_DINING_ORIGINAL 분기 제거.

영향 파일:

  • koin/src/main/java/in/koreatech/koin/ui/main/viewmodel/MainActivityViewModel.kt
    • diningABTestExperimentGroup flow (line 71-82) 제거
  • koin/src/main/java/in/koreatech/koin/ui/main/activity/MainActivity.kt
    • diningABTestExperimentGroup 수집 및 DiningWidget 전달 (line 252-258) 제거
  • koin/src/main/java/in/koreatech/koin/ui/main/widget/DiningWidget.kt
    • diningABTestExperimentGroup 파라미터 (line 63) 제거
    • "더보기" 버튼 조건 분기 (line 119-140) → MAIN_DINING_NEW 동작으로 통합
    • Preview의 ExperimentGroup.MAIN_DINING_NEW 참조 (line 325) 제거

7. CAMPUS_club_1 (MAIN_CLUB_UI) — 승자: HOT / 패자: CATEGORY

HOT 디자인을 기본 동작으로 통합, CATEGORY 분기 제거.

영향 파일:

  • core/analytics/src/main/java/in/koreatech/koin/core/analytics/AnalyticsConstant.kt
    • CLUB_AB_TEST_* 상수 제거 (위에서 언급)
  • core/src/main/java/in/koreatech/koin/core/abtest/Experiment.kt
    • MAIN_CLUB_UI enum 엔트리 제거 (위에서 언급)
  • 참고: feature/club 소스에서 A/B 테스트 분기 UI 직접 참조 없음 (상수 정의만 존재). 만약 분기가 존재한다면 HOT 동작을 기본으로 통합

8. BUSINESS_call_1 (BUSINESS_CALL) — 승자: CALL_NUMBER / 패자: CALL_FLOATING

CALL_NUMBER(전화하기 버튼) 동작을 기본 동작으로 통합, CALL_FLOATING 분기 제거.

영향 파일:

  • core/src/main/java/in/koreatech/koin/core/abtest/Experiment.kt
    • BUSINESS_CALL enum 엔트리 제거 (위에서 언급)
  • business/ 모듈 내 분기 코드(있다면) 제거 → CALL_NUMBER 동작을 기본으로 통합

9. BUSINESS_benefit_1 (BENEFIT_STORE) — 승자: A / 패자: B

코드상 UI 분기 없이 할당 로깅만 존재. A 변형이 기본 동작.

영향 파일:

  • koin/src/main/java/in/koreatech/koin/ui/main/viewmodel/MainActivityViewModel.kt
    • _variableName/variableName LiveData (line 55-56) 제거
    • postABTestAssign() 함수 (line 158-161) 제거
  • koin/src/main/java/in/koreatech/koin/ui/main/activity/MainActivity.kt
    • viewModel.postABTestAssign(Experiment.BENEFIT_STORE.experimentTitle) 호출 (line 152) 제거

10. 보존해야 할 인프라 (DINING_SHARE 용)

다음 파일들은 수정하지 마세요:

  • domain/src/main/java/in/koreatech/koin/domain/usecase/user/ABTestUseCase.kt
  • domain/src/main/java/in/koreatech/koin/domain/model/user/ABTest.kt
  • domain/src/main/java/in/koreatech/koin/domain/repository/UserRepository.kt (AB 테스트 관련 메서드)
  • data/src/main/java/in/koreatech/koin/data/api/auth/UserAuthApi.kt (AB 테스트 엔드포인트)
  • data/src/main/java/in/koreatech/koin/data/request/user/ABTestRequest.kt
  • data/src/main/java/in/koreatech/koin/data/response/user/ABTestResponse.kt
  • data/src/main/java/in/koreatech/koin/data/response/user/ABTestTokenResponse.kt
  • data/src/main/java/in/koreatech/koin/data/entity/ABTestEntity.kt
  • data/src/main/java/in/koreatech/koin/data/dao/ABTestDao.kt
  • data/src/main/java/in/koreatech/koin/data/mapper/UserMapper.kt
  • data/src/main/java/in/koreatech/koin/data/source/local/UserLocalDataSource.kt
  • data/src/main/java/in/koreatech/koin/data/source/remote/UserRemoteDataSource.kt
  • data/src/main/java/in/koreatech/koin/data/repository/UserRepositoryImpl.kt
  • feature/dining/src/main/java/in/koreatech/koin/feature/dining/ui/diningdetail/DiningViewModel.ktabTestExperimentGroup (DINING_SHARE) 유지
  • feature/dining/src/main/java/in/koreatech/koin/feature/dining/ui/diningdetail/DiningDetailScreen.ktDiningItemByABTest 유지
  • feature/dining/src/main/java/in/koreatech/koin/feature/dining/component/DiningItemOriginal.kt — DINING_SHARE 패자군 (유지)

✅ 완료 조건

  • Experiment enum에서 7개 엔트리 제거, DINING_SHARE만 남음
  • ExperimentGroup에서 불필요한 상수 제거, SHARE_ORIGINAL/SHARE_NEW만 남음
  • EventLogger.logABTestEvent(), EventAction.ABTEST, EventCategory.DINING_AB_TEST_CATEGORY 제거
  • AnalyticsConstant에서 CLUB_AB_TEST_*, DINING_AB_TEST_DESIGN_* 상수 제거
  • DiningAbTestFloatingButton.kt 파일 삭제 (DINING_STORE 패자 변형)
  • BannerB.kt 파일 삭제 (MAIN_BANNER_UI 패자 변형)
  • MainActivityViewModel에서 제거 대상 실험 관련 flow/LiveData/함수 제거
  • MainActivity에서 제거 대상 실험 관련 수집/호출 코드 제거
  • DiningWidget에서 A/B 테스트 파라미터 및 조건 분기 제거 (MAIN_DINING_NEW 동작으로 통합)
  • BannerViewModel, BannerActivity에서 A/B 테스트 분기 제거 (BannerA만 유지)
  • DiningViewModel, DiningDetailScreen에서 DINING_STORE 관련 코드 제거
  • DINING_SHARE 관련 코드 및 인프라가 정상 동작하는지 확인
  • ./gradlew assembleDebug 빌드 성공
  • ./gradlew ktlintCheck 통과

Metadata

Metadata

Assignees

Labels

refactorCode refactoring

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions