# 20260327 멤버 콘텐츠 선호 신규 생성 정책 수정 ## 목적 - `resolveForQuery` 레거시 파라미터를 기존 row 갱신 용도로 사용하지 않고, **row 미존재 최초 생성 시에만** 제한적으로 사용한다. - 최종 목표인 "MemberContentPreference 저장값만 조회에 사용" 방향으로 정책을 단순화한다. ## 최종 정책 - [x] `MemberContentPreference` 없음 + `member.auth != null` - 요청 파라미터(`isAdultContentVisible`, `contentType`)가 있으면 전달값으로 생성한다. - 요청 파라미터가 없으면 `isAdultContentVisible = true`, `contentType = ContentType.ALL`로 생성한다. - [x] `MemberContentPreference` 없음 + `member.auth == null` - `isAdultContentVisible = false`, `contentType = ContentType.ALL`로 생성한다. - [x] `MemberContentPreference` 있음 - `resolveForQuery`로 들어온 요청 파라미터는 무시하고 저장값만 사용한다. ## 구현 체크리스트 - [x] `MemberContentPreferenceService` 생성 경로(`initializeDefaultPreference`)가 초기값을 정책 기반으로 받을 수 있도록 수정 - QA: `resolveForQuery` 호출 시 row 유/무에 따른 생성값이 테스트에서 일치하는지 확인 - [x] `resolveForQuery`에서 기존 row에 대한 레거시 파라미터 반영/캐시 무효화 제거 - QA: 기존 row + 파라미터 입력 시 저장값 불변 및 캐시 미무효화 테스트 통과 - [x] 관련 단위/통합 테스트 갱신 - QA: `MemberContentPreferenceServiceTest`, `MemberContentPreferenceIntegrationTest` 통과 - [x] 회귀 검증 실행 - QA: `./gradlew test`, `./gradlew ktlintCheck`, `./gradlew build` 성공 ## 구현 완료 후 기록 ### 1차 구현 - 무엇을: - `MemberContentPreferenceService`에 `PreferenceSeed`를 도입해 row 미존재 시 초기 생성값을 호출 목적에 맞게 주입하도록 변경했다. - `resolveForQuery`는 더 이상 기존 row를 요청 파라미터로 갱신하지 않고, 저장값 조회 전용으로 동작하도록 수정했다. - row 미존재 시 seed 정책을 다음과 같이 반영했다. - `member.auth != null` + legacy 파라미터 존재: 전달값 기반 생성 - `member.auth != null` + legacy 파라미터 미존재: `true/ALL` 생성 - `member.auth == null`: 파라미터와 무관하게 `false/ALL` 생성 - `MemberContentPreferenceServiceTest`, `MemberContentPreferenceIntegrationTest`를 정책에 맞게 갱신/추가했다. - 왜: - 기존 row를 조회 API 파라미터로 계속 갱신하면 "저장값 단일 기준" 목표와 충돌하므로, 레거시 파라미터 역할을 row 최초 생성 시점으로 한정하기 위해서다. - 기존 회원 중 row 미존재 사용자의 초기 생성 경로를 명시적으로 제어해 운영 일관성을 확보하기 위해서다. - 어떻게: - 명령: - `./gradlew test --tests "kr.co.vividnext.sodalive.member.contentpreference.MemberContentPreferenceServiceTest" --tests "kr.co.vividnext.sodalive.member.contentpreference.MemberContentPreferenceIntegrationTest"` - `./gradlew test && ./gradlew ktlintCheck && ./gradlew build` - 결과: - 정책 관련 단위/통합 테스트 통과. - 전체 회귀 검증(`test`, `ktlintCheck`, `build`) 통과. - `.kt` 대상 LSP 서버가 현재 환경에 없어 Kotlin LSP 진단은 수행 불가였고, 대신 Gradle 검증으로 대체했다.