docs(can): 캔 사용 내역 작업 문서를 정리한다
This commit is contained in:
14
docs/20260316_작업문서한글명변경.md
Normal file
14
docs/20260316_작업문서한글명변경.md
Normal file
@@ -0,0 +1,14 @@
|
||||
# 20260316_작업문서한글명변경.md
|
||||
|
||||
## 구현 항목
|
||||
- [x] 이번 세션에서 생성된 영문 작업 문서 이름 변경
|
||||
- [x] `docs/20260316_CanServiceGetCanUseStatusRefactoring.md` -> `docs/20260316_캔사용내역조회리팩토링.md`
|
||||
- [x] `docs/20260316_CanServiceGetCanUseStatusTimezoneAndNullHandling.md` -> `docs/20260316_캔사용내역타임존및널처리개선.md`
|
||||
|
||||
## 검증 결과
|
||||
### 1차 구현
|
||||
- 무엇을: 이번 세션에서 생성된 작업 문서 2개의 이름을 한글로 변경
|
||||
- 왜: 작업 계획 문서의 파일명 형식([날짜]_구현할내용한글.md)을 준수하기 위해
|
||||
- 어떻게: bash 명령어로 `mv` 실행
|
||||
- `mv docs/20260316_CanServiceGetCanUseStatusRefactoring.md docs/20260316_캔사용내역조회리팩토링.md`
|
||||
- `mv docs/20260316_CanServiceGetCanUseStatusTimezoneAndNullHandling.md docs/20260316_캔사용내역타임존및널처리개선.md`
|
||||
40
docs/20260316_캔사용내역조회리팩토링.md
Normal file
40
docs/20260316_캔사용내역조회리팩토링.md
Normal file
@@ -0,0 +1,40 @@
|
||||
# 20260316_CanServiceGetCanUseStatusRefactoring.md
|
||||
|
||||
## 작업 목표
|
||||
- `CanService.getCanUseStatus` 함수의 비효율적인 필터링 및 데이터 로딩 로직 개선.
|
||||
- Kotlin 레벨에서 수행하던 필터링을 DB 레벨(Querydsl)로 이동.
|
||||
- Entity 전체를 조회하는 대신 필요한 필드만 조회(Query Projection)하도록 리팩토링.
|
||||
|
||||
## 작업 내용
|
||||
- [x] `CanService.getCanUseStatus` 현재 기능 검증용 테스트 코드 작성.
|
||||
- [x] `UseCanQueryDto` 생성 (QueryProjection용 DTO).
|
||||
- [x] `CanRepository`에 Querydsl 기반의 고도화된 `getCanUseStatus` 추가 (또는 기존 메서드 수정).
|
||||
- [x] `member.id` 필터링 (기존 유지).
|
||||
- [x] `(can + rewardCan) > 0` 필터링.
|
||||
- [x] `container`(`aos`, `ios`, `else`)별 `paymentGateway` 필터링 (Join 사용).
|
||||
- [x] 필요한 연관 엔티티(`Member`, `Room`, `AudioContent` 등)의 필드만 선택적으로 조회.
|
||||
- [x] `CanService.getCanUseStatus` 리팩토링.
|
||||
- [x] 리포지토리에서 바로 DTO 또는 필요한 데이터만 받아오도록 수정.
|
||||
- [x] Kotlin `filter` 제거.
|
||||
- [x] Kotlin `map` 로직 단순화 또는 QueryProjection으로 흡수 가능한지 판단하여 처리.
|
||||
- [x] 작성한 테스트 코드로 기능 검증.
|
||||
- [x] 테스트 코드에 `@DisplayName` 추가 및 예외/엣지 케이스 테스트 보강.
|
||||
- [x] 성능 및 쿼리 최적화 확인.
|
||||
|
||||
## 검증 결과
|
||||
- **기능 검증**:
|
||||
- `CanServiceTest.kt`를 작성하여 리팩토링 전후의 필터링 및 맵핑 로직이 동일하게 유지됨을 확인.
|
||||
- `@DisplayName`을 추가하여 테스트 의도를 명확히 기술.
|
||||
- 유효하지 않은 타임존 입력 시 `DateTimeException`이 발생하는 예외 케이스 추가.
|
||||
- 데이터가 없을 때 빈 리스트 반환 및 각 `CanUsage`별 nullable 필드(닉네임, 제목 등)가 누락되었을 때의 기본 타이틀 처리 로직 검증.
|
||||
- **성능 개선**:
|
||||
- Kotlin 레벨의 필터링을 DB 레벨(Querydsl)로 이동하여 불필요한 데이터 조회를 줄이고 페이지네이션 정확도 향상.
|
||||
- Entity 전체 조회 대신 필요한 12개 필드만 조회하는 `UseCanQueryDto` 사용 (Projection).
|
||||
- `CHANNEL_DONATION` 시 별도의 Member 조회를 위해 발생하던 N+1 또는 추가 쿼리를 Join을 통해 1번의 쿼리로 최적화.
|
||||
- **코드 품질**:
|
||||
- `CanService`에서 더 이상 사용하지 않는 `memberRepository` 의존성 제거.
|
||||
- 복잡한 맵핑 로직을 QueryProjection DTO 기반으로 깔끔하게 정리.
|
||||
|
||||
### 단계별 검증 내용
|
||||
1. **1차 구현 및 단위 테스트**: `CanServiceTest`를 통해 `aos`, `ios` 컨테이너별 필터링 조건이 올바르게 DB 쿼리에 반영되고 결과가 맵핑되는지 검증 (성공).
|
||||
2. **쿼리 최적화 확인**: `UseCanCalculate` 및 관련 엔티티들을 `leftJoin` 및 `innerJoin`을 통해 한 번의 쿼리로 가져오도록 구현됨을 코드 레벨에서 확인.
|
||||
25
docs/20260316_캔사용내역타임존및널처리개선.md
Normal file
25
docs/20260316_캔사용내역타임존및널처리개선.md
Normal file
@@ -0,0 +1,25 @@
|
||||
# 20260316_CanServiceGetCanUseStatusTimezoneAndNullHandling.md
|
||||
|
||||
## 작업 개요
|
||||
- `CanService.getCanUseStatus` 함수에서 유효하지 않은 타임존 입력 시 처리 방식 변경 (예외 발생 -> UTC 기본값 사용).
|
||||
- 캔 사용 내역 타이틀에서 `null` 문자열이 노출되는 문제 해결 및 크리에이터 닉네임 활용 로직 강화.
|
||||
|
||||
## 구현 항목
|
||||
- [x] `CanService.getCanUseStatus` 타임존 처리 로직 수정
|
||||
- `ZoneId.of(timezone)` 호출 시 예외 발생 시 `UTC`를 기본값으로 사용하도록 변경.
|
||||
- [x] `CanService.getCanUseStatus` 타이틀 생성 로직 수정
|
||||
- `CanUsage.LIVE` 등에서 `roomTitle`이 null인 경우 `roomMemberNickname`을 출력하도록 변경.
|
||||
- 기타 `null` 문자열이 노출될 수 있는 지점 확인 및 수정.
|
||||
- [x] `CanServiceTest.kt` 수정
|
||||
- 타임존 예외 테스트를 UTC 기본값 동작 검증 테스트로 변경.
|
||||
- 타이틀 `null` 처리 로직 변경에 따른 검증 코드 업데이트.
|
||||
|
||||
## 검증 기록
|
||||
### 1차 구현
|
||||
- **무엇을**: 타임존 안전 처리 및 타이틀 null 방지 로직 구현
|
||||
- **왜**: 사용자 경험 개선 및 데이터 무결성 표시
|
||||
- **어떻게**:
|
||||
- `CanService.kt`: `ZoneId.of(timezone)`에 try-catch 적용, `CanUsage.LIVE` 등에서 제목 null 시 닉네임 사용하도록 수정.
|
||||
- `CanServiceTest.kt`: 타임존 UTC 폴백 테스트 및 타이틀 null 방지 테스트 케이스 업데이트.
|
||||
- `./gradlew test` 실행 결과: 5개 테스트 모두 통과.
|
||||
- `./gradlew ktlintCheck` 실행 결과: 성공.
|
||||
Reference in New Issue
Block a user