feat(profile): 카카오 오픈채팅 URL 필드로 프로필 응답과 수정을 통일한다

This commit is contained in:
2026-02-24 17:22:29 +09:00
parent 1650ed402c
commit 772883993b
11 changed files with 34 additions and 32 deletions

View File

@@ -0,0 +1,19 @@
## 구현 항목
- [x] SNS 응답/요청 DTO 전수 점검 후 `blogUrl` 제거
- [x] SNS 응답/요청 DTO에 `kakaoOpenChatUrl` 추가
- [x] 기존 `websiteUrl` 입력/반환 값을 `kakaoOpenChatUrl`로 동일 매핑
- [x] 회원 정보 수정 API(`ProfileUpdateRequest`, `MemberService.profileUpdate`) 반영
- [x] SNS 정보를 반환하는 API 응답(`ProfileResponse`, `MyPageResponse`, `CreatorResponse`, `GetCreatorDetailResponse`, `GetLiveRoomUserProfileResponse`, `GetRoomDetailManager`) 반영
- [x] LSP 진단/테스트/빌드 검증 및 결과 기록
## 검증 기록
- 1차 구현
- 무엇을: SNS 필드를 `instagramUrl`, `fancimmUrl`, `xUrl`, `youtubeUrl`, `kakaoOpenChatUrl` 구조로 통일하고 `blogUrl`을 API 요청/응답 계층에서 제거했다. `kakaoOpenChatUrl`은 기존 `member.websiteUrl` 컬럼 값을 그대로 사용하도록 매핑했다.
- 왜: DB/Entity 변경 없이 기존 `websiteUrl` 저장 데이터를 카카오 오픈채팅 링크로 재해석해 노출하고, 더 이상 사용하지 않는 `blogUrl`을 API 스펙에서 제거하기 위해서다.
- 어떻게:
- 코드 반영: `ProfileUpdateRequest`, `ProfileResponse`, `MyPageResponse`, `CreatorResponse`, `GetCreatorDetailResponse`, `GetLiveRoomUserProfileResponse`, `GetRoomDetailResponse`, `MemberService`, `ExplorerService`, `LiveRoomService`
- 정적 진단: `lsp_diagnostics` 실행 시 `.kt` LSP 미구성으로 불가(환경 제약 확인)
- 동작 검증: `./gradlew test && ./gradlew build` 실행
- 결과: `BUILD SUCCESSFUL` (test 성공 후 build 성공)

View File

@@ -10,8 +10,7 @@ data class CreatorResponse(
val fancimmUrl: String? = null,
val xUrl: String? = null,
val youtubeUrl: String? = null,
val websiteUrl: String? = null,
val blogUrl: String? = null,
val kakaoOpenChatUrl: String? = null,
val isFollow: Boolean,
val isNotify: Boolean,
val isNotification: Boolean,

View File

@@ -248,8 +248,7 @@ class ExplorerService(
fancimmUrl = creatorAccount.fancimmUrl,
xUrl = creatorAccount.xUrl,
youtubeUrl = creatorAccount.youtubeUrl,
websiteUrl = creatorAccount.websiteUrl,
blogUrl = creatorAccount.blogUrl
kakaoOpenChatUrl = creatorAccount.websiteUrl
)
}
@@ -451,8 +450,7 @@ class ExplorerService(
fancimmUrl = creatorAccount.fancimmUrl,
xUrl = creatorAccount.xUrl,
youtubeUrl = creatorAccount.youtubeUrl,
websiteUrl = creatorAccount.websiteUrl,
blogUrl = creatorAccount.blogUrl,
kakaoOpenChatUrl = creatorAccount.websiteUrl,
isFollow = creatorFollowing?.isFollow ?: false,
isNotify = creatorFollowing?.isNotify ?: false,
isNotification = creatorFollowing?.isFollow ?: false,

View File

@@ -10,6 +10,5 @@ data class GetCreatorDetailResponse(
val fancimmUrl: String,
val xUrl: String,
val youtubeUrl: String,
val websiteUrl: String,
val blogUrl: String
val kakaoOpenChatUrl: String
)

View File

@@ -9,8 +9,7 @@ data class GetLiveRoomUserProfileResponse(
val fancimmUrl: String,
val xUrl: String,
val youtubeUrl: String,
val websiteUrl: String,
val blogUrl: String,
val kakaoOpenChatUrl: String,
val introduce: String,
val tags: String,
val isSpeaker: Boolean?,

View File

@@ -1123,8 +1123,7 @@ class LiveRoomService(
fancimmUrl = user.fancimmUrl,
xUrl = user.xUrl,
youtubeUrl = user.youtubeUrl,
websiteUrl = user.websiteUrl,
blogUrl = user.blogUrl,
kakaoOpenChatUrl = user.websiteUrl,
introduce = user.introduce,
tags = user.tags
.asSequence()

View File

@@ -33,8 +33,7 @@ data class GetRoomDetailManager(
val instagramUrl: String?,
val fancimmUrl: String?,
val xUrl: String?,
val websiteUrl: String?,
val blogUrl: String?,
val kakaoOpenChatUrl: String?,
val profileImageUrl: String,
val isCreator: Boolean
) {
@@ -46,8 +45,7 @@ data class GetRoomDetailManager(
instagramUrl = member.instagramUrl,
fancimmUrl = member.fancimmUrl,
xUrl = member.xUrl,
websiteUrl = member.websiteUrl,
blogUrl = member.blogUrl,
kakaoOpenChatUrl = member.websiteUrl,
profileImageUrl = if (member.profileImage != null) {
"$cloudFrontHost/${member.profileImage}"
} else {

View File

@@ -305,8 +305,7 @@ class MemberService(
instagramUrl = member.instagramUrl,
fancimmUrl = member.fancimmUrl,
xUrl = member.xUrl,
websiteUrl = member.websiteUrl,
blogUrl = member.blogUrl,
kakaoOpenChatUrl = member.websiteUrl,
liveReservationCount = liveReservationCount,
isAuth = member.auth != null,
orderList = orderList
@@ -737,12 +736,8 @@ class MemberService(
member.xUrl = profileUpdateRequest.xUrl
}
if (profileUpdateRequest.websiteUrl != null) {
member.websiteUrl = profileUpdateRequest.websiteUrl
}
if (profileUpdateRequest.blogUrl != null) {
member.blogUrl = profileUpdateRequest.blogUrl
if (profileUpdateRequest.kakaoOpenChatUrl != null) {
member.websiteUrl = profileUpdateRequest.kakaoOpenChatUrl
}
if (profileUpdateRequest.isVisibleDonationRank != null) {

View File

@@ -12,8 +12,7 @@ data class ProfileResponse(
val instagramUrl: String?,
val fancimmUrl: String?,
val xUrl: String?,
val blogUrl: String?,
val websiteUrl: String?,
val kakaoOpenChatUrl: String?,
val introduce: String,
val tags: List<String>
) {
@@ -33,8 +32,7 @@ data class ProfileResponse(
instagramUrl = member.instagramUrl,
fancimmUrl = member.fancimmUrl,
xUrl = member.xUrl,
websiteUrl = member.websiteUrl,
blogUrl = member.blogUrl,
kakaoOpenChatUrl = member.websiteUrl,
introduce = member.introduce,
tags = member.tags.asSequence().filter { it.tag.isActive }.map { it.tag.tag }.toList()
)

View File

@@ -13,8 +13,7 @@ data class ProfileUpdateRequest(
val instagramUrl: String? = null,
val fancimmUrl: String? = null,
val xUrl: String? = null,
val websiteUrl: String? = null,
val blogUrl: String? = null,
val kakaoOpenChatUrl: String? = null,
val isVisibleDonationRank: Boolean? = null,
val donationRankingPeriod: DonationRankingPeriod? = null,
val container: String

View File

@@ -12,8 +12,7 @@ data class MyPageResponse(
val instagramUrl: String?,
val fancimmUrl: String? = null,
val xUrl: String? = null,
val websiteUrl: String? = null,
val blogUrl: String? = null,
val kakaoOpenChatUrl: String? = null,
val liveReservationCount: Int,
val isAuth: Boolean,
val orderList: GetAudioContentOrderListResponse