feat(member): 팬심M 및 X URL 필드를 프로필 응답에 연동한다

This commit is contained in:
2026-02-20 19:31:13 +09:00
parent c3a2ca66f8
commit ecef49393b
12 changed files with 50 additions and 0 deletions

View File

@@ -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
;

View File

@@ -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`는 수행할 수 없었다.

View File

@@ -7,6 +7,8 @@ data class CreatorResponse(
val tags: List<String>, val tags: List<String>,
val introduce: String = "", val introduce: String = "",
val instagramUrl: String? = null, val instagramUrl: String? = null,
val fancimmUrl: String? = null,
val xUrl: String? = null,
val youtubeUrl: String? = null, val youtubeUrl: String? = null,
val websiteUrl: String? = null, val websiteUrl: String? = null,
val blogUrl: String? = null, val blogUrl: String? = null,

View File

@@ -372,6 +372,8 @@ class ExplorerService(
tags = creatorAccount.tags.asSequence().filter { it.tag.isActive }.map { it.tag.tag }.toList(), tags = creatorAccount.tags.asSequence().filter { it.tag.isActive }.map { it.tag.tag }.toList(),
introduce = creatorAccount.introduce, introduce = creatorAccount.introduce,
instagramUrl = creatorAccount.instagramUrl, instagramUrl = creatorAccount.instagramUrl,
fancimmUrl = creatorAccount.fancimmUrl,
xUrl = creatorAccount.xUrl,
youtubeUrl = creatorAccount.youtubeUrl, youtubeUrl = creatorAccount.youtubeUrl,
websiteUrl = creatorAccount.websiteUrl, websiteUrl = creatorAccount.websiteUrl,
blogUrl = creatorAccount.blogUrl, blogUrl = creatorAccount.blogUrl,

View File

@@ -6,6 +6,8 @@ data class GetLiveRoomUserProfileResponse(
val profileUrl: String, val profileUrl: String,
val gender: String, val gender: String,
val instagramUrl: String, val instagramUrl: String,
val fancimmUrl: String,
val xUrl: String,
val youtubeUrl: String, val youtubeUrl: String,
val websiteUrl: String, val websiteUrl: String,
val blogUrl: String, val blogUrl: String,

View File

@@ -1098,6 +1098,8 @@ class LiveRoomService(
else -> messageSource.getMessage("member.gender.unknown", langContext.lang) else -> messageSource.getMessage("member.gender.unknown", langContext.lang)
}.orEmpty(), }.orEmpty(),
instagramUrl = user.instagramUrl, instagramUrl = user.instagramUrl,
fancimmUrl = user.fancimmUrl,
xUrl = user.xUrl,
youtubeUrl = user.youtubeUrl, youtubeUrl = user.youtubeUrl,
websiteUrl = user.websiteUrl, websiteUrl = user.websiteUrl,
blogUrl = user.blogUrl, blogUrl = user.blogUrl,

View File

@@ -31,6 +31,8 @@ data class GetRoomDetailManager(
val introduce: String, val introduce: String,
val youtubeUrl: String?, val youtubeUrl: String?,
val instagramUrl: String?, val instagramUrl: String?,
val fancimmUrl: String?,
val xUrl: String?,
val websiteUrl: String?, val websiteUrl: String?,
val blogUrl: String?, val blogUrl: String?,
val profileImageUrl: String, val profileImageUrl: String,
@@ -42,6 +44,8 @@ data class GetRoomDetailManager(
introduce = member.introduce, introduce = member.introduce,
youtubeUrl = member.youtubeUrl, youtubeUrl = member.youtubeUrl,
instagramUrl = member.instagramUrl, instagramUrl = member.instagramUrl,
fancimmUrl = member.fancimmUrl,
xUrl = member.xUrl,
websiteUrl = member.websiteUrl, websiteUrl = member.websiteUrl,
blogUrl = member.blogUrl, blogUrl = member.blogUrl,
profileImageUrl = if (member.profileImage != null) { profileImageUrl = if (member.profileImage != null) {

View File

@@ -81,6 +81,8 @@ data class Member(
// SNS // SNS
var instagramUrl = "" var instagramUrl = ""
var fancimmUrl = ""
var xUrl = ""
var youtubeUrl = "" var youtubeUrl = ""
var websiteUrl = "" var websiteUrl = ""
var blogUrl = "" var blogUrl = ""

View File

@@ -301,6 +301,8 @@ class MemberService(
point = totalPoint, point = totalPoint,
youtubeUrl = member.youtubeUrl, youtubeUrl = member.youtubeUrl,
instagramUrl = member.instagramUrl, instagramUrl = member.instagramUrl,
fancimmUrl = member.fancimmUrl,
xUrl = member.xUrl,
websiteUrl = member.websiteUrl, websiteUrl = member.websiteUrl,
blogUrl = member.blogUrl, blogUrl = member.blogUrl,
liveReservationCount = liveReservationCount, liveReservationCount = liveReservationCount,
@@ -714,6 +716,14 @@ class MemberService(
member.instagramUrl = profileUpdateRequest.instagramUrl member.instagramUrl = profileUpdateRequest.instagramUrl
} }
if (profileUpdateRequest.fancimmUrl != null) {
member.fancimmUrl = profileUpdateRequest.fancimmUrl
}
if (profileUpdateRequest.xUrl != null) {
member.xUrl = profileUpdateRequest.xUrl
}
if (profileUpdateRequest.websiteUrl != null) { if (profileUpdateRequest.websiteUrl != null) {
member.websiteUrl = profileUpdateRequest.websiteUrl member.websiteUrl = profileUpdateRequest.websiteUrl
} }

View File

@@ -10,6 +10,8 @@ data class ProfileResponse(
val rewardCan: Int, val rewardCan: Int,
val youtubeUrl: String?, val youtubeUrl: String?,
val instagramUrl: String?, val instagramUrl: String?,
val fancimmUrl: String?,
val xUrl: String?,
val blogUrl: String?, val blogUrl: String?,
val websiteUrl: String?, val websiteUrl: String?,
val introduce: String, val introduce: String,
@@ -29,6 +31,8 @@ data class ProfileResponse(
rewardCan = member.getRewardCan(container), rewardCan = member.getRewardCan(container),
youtubeUrl = member.youtubeUrl, youtubeUrl = member.youtubeUrl,
instagramUrl = member.instagramUrl, instagramUrl = member.instagramUrl,
fancimmUrl = member.fancimmUrl,
xUrl = member.xUrl,
websiteUrl = member.websiteUrl, websiteUrl = member.websiteUrl,
blogUrl = member.blogUrl, blogUrl = member.blogUrl,
introduce = member.introduce, introduce = member.introduce,

View File

@@ -11,6 +11,8 @@ data class ProfileUpdateRequest(
val introduce: String? = null, val introduce: String? = null,
val youtubeUrl: String? = null, val youtubeUrl: String? = null,
val instagramUrl: String? = null, val instagramUrl: String? = null,
val fancimmUrl: String? = null,
val xUrl: String? = null,
val websiteUrl: String? = null, val websiteUrl: String? = null,
val blogUrl: String? = null, val blogUrl: String? = null,
val isVisibleDonationRank: Boolean? = null, val isVisibleDonationRank: Boolean? = null,

View File

@@ -10,6 +10,8 @@ data class MyPageResponse(
val point: Int, val point: Int,
val youtubeUrl: String?, val youtubeUrl: String?,
val instagramUrl: String?, val instagramUrl: String?,
val fancimmUrl: String? = null,
val xUrl: String? = null,
val websiteUrl: String? = null, val websiteUrl: String? = null,
val blogUrl: String? = null, val blogUrl: String? = null,
val liveReservationCount: Int, val liveReservationCount: Int,