diff --git a/docs/20260220_member_fancimm_x_url_ddl.sql b/docs/20260220_member_fancimm_x_url_ddl.sql new file mode 100644 index 00000000..66762ed2 --- /dev/null +++ b/docs/20260220_member_fancimm_x_url_ddl.sql @@ -0,0 +1,4 @@ +ALTER TABLE member + ADD fancimm_url VARCHAR(255) DEFAULT NULL COMMENT '팬심M url' AFTER instagram_url, + ADD x_url VARCHAR(255) DEFAULT NULL COMMENT 'X url' AFTER fancimm_url +; diff --git a/docs/20260220_팬심M와XURL추가.md b/docs/20260220_팬심M와XURL추가.md new file mode 100644 index 00000000..8138f1ea --- /dev/null +++ b/docs/20260220_팬심M와XURL추가.md @@ -0,0 +1,14 @@ +# 팬심M/X URL 추가 작업 계획 + +- [x] `Member` 엔티티 SNS 필드에 팬심M URL, X URL 속성 추가 +- [x] 인스타그램 URL 수정 흐름 분석 후 동일한 수정 요청 DTO 반영 +- [x] 서비스의 프로필 수정 로직에 팬심M URL, X URL 수정 처리 추가 +- [x] 관련 응답 DTO에 신규 URL 필드 반영 및 매핑 연결 +- [x] 후속 요청 반영: `fansimMUrl` 필드명을 `fancimmUrl`로 일괄 변경 +- [x] `ddl-auto: validate` 대응을 위한 DB 컬럼 추가 SQL 파일 생성 +- [x] 진단/테스트/빌드 검증 실행 후 결과 기록 + +## 검증 기록 +- 무엇을: 팬심M/X URL 필드 추가, 인스타그램 URL 수정 흐름과 동일한 수정/응답 매핑 반영, `fansimMUrl` -> `fancimmUrl` 명칭 변경을 검증했다. +- 왜: 프로필 수정 API에서 두 URL이 저장되고, 주요 응답 DTO에서 값이 일관되게 내려가야 하기 때문이다. +- 어떻게: `./gradlew ktlintCheck test build`를 팬심M/X URL 추가 시점과 `fancimmUrl` 명칭 변경 시점에 각각 실행해 정적 검사, 테스트, 빌드 성공(Exit code 0)을 확인했다. 또한 `docs/20260220_member_fancimm_x_url_ddl.sql`에 운영 DB 반영용 DDL을 추가했다. Kotlin LSP 미구성으로 `lsp_diagnostics`는 수행할 수 없었다. diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/explorer/CreatorResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/explorer/CreatorResponse.kt index 1252cca1..3d1c2d52 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/explorer/CreatorResponse.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/explorer/CreatorResponse.kt @@ -7,6 +7,8 @@ data class CreatorResponse( val tags: List, val introduce: String = "", val instagramUrl: String? = null, + val fancimmUrl: String? = null, + val xUrl: String? = null, val youtubeUrl: String? = null, val websiteUrl: String? = null, val blogUrl: String? = null, diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/explorer/ExplorerService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/explorer/ExplorerService.kt index d0366c4d..c24b10e8 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/explorer/ExplorerService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/explorer/ExplorerService.kt @@ -372,6 +372,8 @@ class ExplorerService( tags = creatorAccount.tags.asSequence().filter { it.tag.isActive }.map { it.tag.tag }.toList(), introduce = creatorAccount.introduce, instagramUrl = creatorAccount.instagramUrl, + fancimmUrl = creatorAccount.fancimmUrl, + xUrl = creatorAccount.xUrl, youtubeUrl = creatorAccount.youtubeUrl, websiteUrl = creatorAccount.websiteUrl, blogUrl = creatorAccount.blogUrl, diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/GetLiveRoomUserProfileResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/GetLiveRoomUserProfileResponse.kt index 42226abc..f93d51e9 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/GetLiveRoomUserProfileResponse.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/GetLiveRoomUserProfileResponse.kt @@ -6,6 +6,8 @@ data class GetLiveRoomUserProfileResponse( val profileUrl: String, val gender: String, val instagramUrl: String, + val fancimmUrl: String, + val xUrl: String, val youtubeUrl: String, val websiteUrl: String, val blogUrl: String, diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomService.kt index 60653ff1..600e8b9d 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomService.kt @@ -1098,6 +1098,8 @@ class LiveRoomService( else -> messageSource.getMessage("member.gender.unknown", langContext.lang) }.orEmpty(), instagramUrl = user.instagramUrl, + fancimmUrl = user.fancimmUrl, + xUrl = user.xUrl, youtubeUrl = user.youtubeUrl, websiteUrl = user.websiteUrl, blogUrl = user.blogUrl, diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/detail/GetRoomDetailResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/detail/GetRoomDetailResponse.kt index a97b0460..b22590fb 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/detail/GetRoomDetailResponse.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/detail/GetRoomDetailResponse.kt @@ -31,6 +31,8 @@ data class GetRoomDetailManager( val introduce: String, val youtubeUrl: String?, val instagramUrl: String?, + val fancimmUrl: String?, + val xUrl: String?, val websiteUrl: String?, val blogUrl: String?, val profileImageUrl: String, @@ -42,6 +44,8 @@ data class GetRoomDetailManager( introduce = member.introduce, youtubeUrl = member.youtubeUrl, instagramUrl = member.instagramUrl, + fancimmUrl = member.fancimmUrl, + xUrl = member.xUrl, websiteUrl = member.websiteUrl, blogUrl = member.blogUrl, profileImageUrl = if (member.profileImage != null) { diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/Member.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/Member.kt index 75ff126f..c1f631b2 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/Member.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/Member.kt @@ -81,6 +81,8 @@ data class Member( // SNS var instagramUrl = "" + var fancimmUrl = "" + var xUrl = "" var youtubeUrl = "" var websiteUrl = "" var blogUrl = "" diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt index d6868bd0..7ea24956 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt @@ -301,6 +301,8 @@ class MemberService( point = totalPoint, youtubeUrl = member.youtubeUrl, instagramUrl = member.instagramUrl, + fancimmUrl = member.fancimmUrl, + xUrl = member.xUrl, websiteUrl = member.websiteUrl, blogUrl = member.blogUrl, liveReservationCount = liveReservationCount, @@ -714,6 +716,14 @@ class MemberService( member.instagramUrl = profileUpdateRequest.instagramUrl } + if (profileUpdateRequest.fancimmUrl != null) { + member.fancimmUrl = profileUpdateRequest.fancimmUrl + } + + if (profileUpdateRequest.xUrl != null) { + member.xUrl = profileUpdateRequest.xUrl + } + if (profileUpdateRequest.websiteUrl != null) { member.websiteUrl = profileUpdateRequest.websiteUrl } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/ProfileResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/ProfileResponse.kt index 12475347..4172767f 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/ProfileResponse.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/ProfileResponse.kt @@ -10,6 +10,8 @@ data class ProfileResponse( val rewardCan: Int, val youtubeUrl: String?, val instagramUrl: String?, + val fancimmUrl: String?, + val xUrl: String?, val blogUrl: String?, val websiteUrl: String?, val introduce: String, @@ -29,6 +31,8 @@ data class ProfileResponse( rewardCan = member.getRewardCan(container), youtubeUrl = member.youtubeUrl, instagramUrl = member.instagramUrl, + fancimmUrl = member.fancimmUrl, + xUrl = member.xUrl, websiteUrl = member.websiteUrl, blogUrl = member.blogUrl, introduce = member.introduce, diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/ProfileUpdateRequest.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/ProfileUpdateRequest.kt index 4f5d97de..1f85148a 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/ProfileUpdateRequest.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/ProfileUpdateRequest.kt @@ -11,6 +11,8 @@ data class ProfileUpdateRequest( val introduce: String? = null, val youtubeUrl: String? = null, val instagramUrl: String? = null, + val fancimmUrl: String? = null, + val xUrl: String? = null, val websiteUrl: String? = null, val blogUrl: String? = null, val isVisibleDonationRank: Boolean? = null, diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/myPage/MyPageResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/myPage/MyPageResponse.kt index 5bf0481c..5c89d6e3 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/myPage/MyPageResponse.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/myPage/MyPageResponse.kt @@ -10,6 +10,8 @@ data class MyPageResponse( val point: Int, val youtubeUrl: String?, val instagramUrl: String?, + val fancimmUrl: String? = null, + val xUrl: String? = null, val websiteUrl: String? = null, val blogUrl: String? = null, val liveReservationCount: Int,