♻️ 완료된 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/dining의 abTestExperimentGroup (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.kt — abTestExperimentGroup (DINING_SHARE) 유지
feature/dining/src/main/java/in/koreatech/koin/feature/dining/ui/diningdetail/DiningDetailScreen.kt — DiningItemByABTest 유지
feature/dining/src/main/java/in/koreatech/koin/feature/dining/component/DiningItemOriginal.kt — DINING_SHARE 패자군 (유지)
✅ 완료 조건
♻️ 완료된 A/B 테스트 실험 코드 제거 (7개 실험)
팀/모듈: koin, feature/banner, feature/dining, feature/club, core/analytics
우선순위: Medium
📋 리팩토링 설명
실험이 완료된 7개의 A/B 테스트에 대한 로깅, 패자군 UI, 조건 분기 코드를 모두 제거합니다.
승자군 코드는 기본 동작으로 통합하고, 패자군 코드 및 실험 분기 로직을 삭제합니다.
대상 실험 목록 및 승자/패자 매핑 (A/B 테스트 플랫폼 closed 결과 기반):
dining2shop_1DINING_STORE"dining_store"CAMPUS_notice_1MAIN_ARTICLE_KEYWORD_BANNER"c_keyword_ banner_v1"CAMPUS_modal_1MAIN_BANNER_UI"a_main_banner_ui"CAMPUS_dining_1MAIN_DINING_SEE_MORE"c_main_dining_v1"CAMPUS_club_1MAIN_CLUB_UI"a_main_club_ui"BUSINESS_call_1BUSINESS_CALL"business_call"BUSINESS_benefit_1BENEFIT_STORE"Benefit"🎯 목표
DINING_SHARE실험과 공유 인프라는 그대로 유지합니다.DINING_SHARE실험은 제거 대상이 아니므로ABTestUseCase,ABTest도메인 모델,UserAuthApi의 AB 테스트 엔드포인트,ABTestDao/ABTestEntity(Room),UserRepository의 AB 테스트 메서드 등 공유 인프라를 삭제하지 마세요.feature/dining의abTestExperimentGroup(DINING_SHARE용)과DiningItemByABTest컴포저블은 유지해야 합니다.🔍 영향 범위 (패자군 제거 명세)
1. 공통 — Experiment 정의 (
core)core/src/main/java/in/koreatech/koin/core/abtest/Experiment.ktExperimentenum: 7개 엔트리 제거 (BENEFIT_STORE,MAIN_DINING_SEE_MORE,MAIN_ARTICLE_KEYWORD_BANNER,BUSINESS_CALL,MAIN_BANNER_UI,MAIN_CLUB_UI,DINING_STORE),DINING_SHARE만 유지ExperimentGroupobject: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.ktlogABTestEvent()함수 (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.ktCLUB_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.ktdiningStoreAbTestExperimentGroupflow (line 97-108) 제거_sessionId/sessionIdStateFlow (line 82-83) 제거getDiningSessionId()함수 (line 211-218) 제거feature/dining/src/main/java/in/koreatech/koin/feature/dining/ui/diningdetail/DiningDetailScreen.ktdiningStoreAbTestExperimentGroup수집 (line 146-148 중 해당 부분) 제거DiningAbTestFloatingButton블록 (line 573-643) 제거 — 패자 변형(VARIANT)feature/dining/src/main/java/in/koreatech/koin/feature/dining/component/abTeset/DiningAbTestFloatingButton.ktkoin/src/main/java/in/koreatech/koin/ui/main/viewmodel/MainActivityViewModel.ktdiningStoreAbTestExperimentGroupflow (line 84-95) 제거getDiningToShopSessionId()함수 (line 206-214) 제거koin/src/main/java/in/koreatech/koin/ui/main/activity/MainActivity.ktdiningStoreAbTestExperimentGroup수집 및 세션 이벤트 로깅 블록 (line 267-290) 제거DINING_AB_TEST_DESIGN_A/Bimport (line 32-33) 제거4.
CAMPUS_notice_1(MAIN_ARTICLE_KEYWORD_BANNER) — 승자: MAIN_BANNER_NEW / 패자: MAIN_BANNER_ORIGINALMAIN_BANNER_NEW동작을 기본으로 통합,MAIN_BANNER_ORIGINAL분기 제거.영향 파일:
koin/src/main/java/in/koreatech/koin/ui/main/viewmodel/MainActivityViewModel.ktbannerABTestExperimentGroupflow (line 58-69) 제거articleMainStateFlow의 combine에서bannerABTestExperimentGroup의존성 제거 (line 116-131)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.ktabTestUseCase주입 (line 31) 제거mainBannerABTestExperimentGroupflow (line 41-52) 제거feature/banner/src/main/java/in/koreatech/koin/feature/banner/ui/BannerActivity.ktexperimentGroup수집 (line 40) 제거when(experimentGroup)분기 (line 63-101) →BannerA호출만 남김logABTestEvent호출 제거feature/banner/src/main/java/in/koreatech/koin/feature/banner/component/BannerB.kt6.
CAMPUS_dining_1(MAIN_DINING_SEE_MORE) — 승자: MAIN_DINING_NEW / 패자: MAIN_DINING_ORIGINALMAIN_DINING_NEW의 "더보기" 동작을 기본 동작으로 통합,MAIN_DINING_ORIGINAL분기 제거.영향 파일:
koin/src/main/java/in/koreatech/koin/ui/main/viewmodel/MainActivityViewModel.ktdiningABTestExperimentGroupflow (line 71-82) 제거koin/src/main/java/in/koreatech/koin/ui/main/activity/MainActivity.ktdiningABTestExperimentGroup수집 및 DiningWidget 전달 (line 252-258) 제거koin/src/main/java/in/koreatech/koin/ui/main/widget/DiningWidget.ktdiningABTestExperimentGroup파라미터 (line 63) 제거ExperimentGroup.MAIN_DINING_NEW참조 (line 325) 제거7.
CAMPUS_club_1(MAIN_CLUB_UI) — 승자: HOT / 패자: CATEGORYHOT 디자인을 기본 동작으로 통합, CATEGORY 분기 제거.
영향 파일:
core/analytics/src/main/java/in/koreatech/koin/core/analytics/AnalyticsConstant.ktCLUB_AB_TEST_*상수 제거 (위에서 언급)core/src/main/java/in/koreatech/koin/core/abtest/Experiment.ktMAIN_CLUB_UIenum 엔트리 제거 (위에서 언급)feature/club소스에서 A/B 테스트 분기 UI 직접 참조 없음 (상수 정의만 존재). 만약 분기가 존재한다면 HOT 동작을 기본으로 통합8.
BUSINESS_call_1(BUSINESS_CALL) — 승자: CALL_NUMBER / 패자: CALL_FLOATINGCALL_NUMBER(전화하기 버튼) 동작을 기본 동작으로 통합, CALL_FLOATING 분기 제거.
영향 파일:
core/src/main/java/in/koreatech/koin/core/abtest/Experiment.ktBUSINESS_CALLenum 엔트리 제거 (위에서 언급)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/variableNameLiveData (line 55-56) 제거postABTestAssign()함수 (line 158-161) 제거koin/src/main/java/in/koreatech/koin/ui/main/activity/MainActivity.ktviewModel.postABTestAssign(Experiment.BENEFIT_STORE.experimentTitle)호출 (line 152) 제거10. 보존해야 할 인프라 (DINING_SHARE 용)
다음 파일들은 수정하지 마세요:
domain/src/main/java/in/koreatech/koin/domain/usecase/user/ABTestUseCase.ktdomain/src/main/java/in/koreatech/koin/domain/model/user/ABTest.ktdomain/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.ktdata/src/main/java/in/koreatech/koin/data/response/user/ABTestResponse.ktdata/src/main/java/in/koreatech/koin/data/response/user/ABTestTokenResponse.ktdata/src/main/java/in/koreatech/koin/data/entity/ABTestEntity.ktdata/src/main/java/in/koreatech/koin/data/dao/ABTestDao.ktdata/src/main/java/in/koreatech/koin/data/mapper/UserMapper.ktdata/src/main/java/in/koreatech/koin/data/source/local/UserLocalDataSource.ktdata/src/main/java/in/koreatech/koin/data/source/remote/UserRemoteDataSource.ktdata/src/main/java/in/koreatech/koin/data/repository/UserRepositoryImpl.ktfeature/dining/src/main/java/in/koreatech/koin/feature/dining/ui/diningdetail/DiningViewModel.kt—abTestExperimentGroup(DINING_SHARE) 유지feature/dining/src/main/java/in/koreatech/koin/feature/dining/ui/diningdetail/DiningDetailScreen.kt—DiningItemByABTest유지feature/dining/src/main/java/in/koreatech/koin/feature/dining/component/DiningItemOriginal.kt— DINING_SHARE 패자군 (유지)✅ 완료 조건
Experimentenum에서 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통과