From 55959dc49467d505a8fb16339c313330730079cb Mon Sep 17 00:00:00 2001 From: JIWON Date: Mon, 12 Oct 2026 21:34:20 +0900 Subject: [PATCH] =?UTF-8?q?[WTH-538]=20=EC=9C=A0=EB=A0=B9=20=ED=94=84?= =?UTF-8?q?=EB=A1=9C=ED=95=84=20=EC=88=98=EC=A0=95=20(#127)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: 동아리 가입 시 기본 프로필 즉시 생성 및 할당 * test: 동아리 가입 시 기본 프로필 할당 검증 테스트 추가 * refactor: UserProfile 이름 길이 상수 중복 제거 (cherry picked from commit 7136c6b7fb1408bd51d462592941633a637e5f52) --- .../command/ManageClubMemberUsecase.kt | 9 +++++ .../domain/user/domain/entity/UserProfile.kt | 2 +- .../command/ManageClubMemberUseCaseTest.kt | 33 +++++++++++++++++++ .../domain/user/fixture/UserTestFixture.kt | 7 ++-- 4 files changed, 48 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/com/weeth/domain/club/application/usecase/command/ManageClubMemberUsecase.kt b/src/main/kotlin/com/weeth/domain/club/application/usecase/command/ManageClubMemberUsecase.kt index 5c1d4d73d..d0494c322 100644 --- a/src/main/kotlin/com/weeth/domain/club/application/usecase/command/ManageClubMemberUsecase.kt +++ b/src/main/kotlin/com/weeth/domain/club/application/usecase/command/ManageClubMemberUsecase.kt @@ -20,6 +20,8 @@ import com.weeth.domain.club.domain.service.ClubCodePolicy import com.weeth.domain.club.domain.service.ClubJoinPolicy import com.weeth.domain.club.domain.service.ClubMemberPolicy import com.weeth.domain.user.application.exception.UserInActiveException +import com.weeth.domain.user.domain.entity.UserProfile +import com.weeth.domain.user.domain.repository.UserProfileRepository import com.weeth.domain.user.domain.repository.UserReader import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional @@ -33,6 +35,7 @@ import java.time.LocalDateTime class ManageClubMemberUsecase( private val clubRepository: ClubRepository, private val clubMemberRepository: ClubMemberRepository, + private val userProfileRepository: UserProfileRepository, private val clubMemberCardinalRepository: ClubMemberCardinalRepository, private val cardinalReader: CardinalReader, private val attendanceInitializer: AttendanceInitializer, @@ -76,6 +79,12 @@ class ManageClubMemberUsecase( accept() } + val defaultProfile = + userProfileRepository.save( + UserProfile.create(user = user, name = user.name.take(UserProfile.MAX_NAME_LENGTH)), + ) + member.assignProfile(defaultProfile) + clubMemberRepository.save(member) } diff --git a/src/main/kotlin/com/weeth/domain/user/domain/entity/UserProfile.kt b/src/main/kotlin/com/weeth/domain/user/domain/entity/UserProfile.kt index 817d30d8e..6645056e6 100644 --- a/src/main/kotlin/com/weeth/domain/user/domain/entity/UserProfile.kt +++ b/src/main/kotlin/com/weeth/domain/user/domain/entity/UserProfile.kt @@ -71,7 +71,7 @@ class UserProfile( fun isOwnedBy(userId: Long): Boolean = user.id == userId companion object { - private const val MAX_NAME_LENGTH = 20 + const val MAX_NAME_LENGTH = 20 private const val MAX_STORAGE_KEY_LENGTH = 500 private const val MAX_BIO_LENGTH = 30 diff --git a/src/test/kotlin/com/weeth/domain/club/application/usecase/command/ManageClubMemberUseCaseTest.kt b/src/test/kotlin/com/weeth/domain/club/application/usecase/command/ManageClubMemberUseCaseTest.kt index ef583fbe5..c46489998 100644 --- a/src/test/kotlin/com/weeth/domain/club/application/usecase/command/ManageClubMemberUseCaseTest.kt +++ b/src/test/kotlin/com/weeth/domain/club/application/usecase/command/ManageClubMemberUseCaseTest.kt @@ -20,6 +20,8 @@ import com.weeth.domain.club.domain.service.ClubMemberPolicy import com.weeth.domain.club.fixture.ClubMemberTestFixture import com.weeth.domain.club.fixture.ClubTestFixture import com.weeth.domain.user.application.exception.UserInActiveException +import com.weeth.domain.user.domain.entity.UserProfile +import com.weeth.domain.user.domain.repository.UserProfileRepository import com.weeth.domain.user.domain.repository.UserReader import com.weeth.domain.user.fixture.UserTestFixture import io.kotest.assertions.throwables.shouldThrow @@ -39,6 +41,7 @@ class ManageClubMemberUseCaseTest : DescribeSpec({ val clubRepository = mockk() val clubMemberRepository = mockk() + val userProfileRepository = mockk() val clubMemberCardinalRepository = mockk(relaxed = true) val cardinalReader = mockk() val attendanceInitializer = mockk(relaxed = true) @@ -52,6 +55,7 @@ class ManageClubMemberUseCaseTest : ManageClubMemberUsecase( clubRepository = clubRepository, clubMemberRepository = clubMemberRepository, + userProfileRepository = userProfileRepository, clubMemberCardinalRepository = clubMemberCardinalRepository, cardinalReader = cardinalReader, attendanceInitializer = attendanceInitializer, @@ -66,6 +70,7 @@ class ManageClubMemberUseCaseTest : clearMocks( clubRepository, clubMemberRepository, + userProfileRepository, clubMemberCardinalRepository, cardinalReader, attendanceInitializer, @@ -75,6 +80,7 @@ class ManageClubMemberUseCaseTest : clubActivityDeletionPolicy, ) every { clubMemberRepository.save(any()) } answers { firstArg() } + every { userProfileRepository.save(any()) } answers { firstArg() } } describe("setInitialCardinals") { @@ -275,6 +281,33 @@ class ManageClubMemberUseCaseTest : verify(exactly = 1) { clubMemberRepository.save(any()) } } + + it("가입 즉시 기본 프로필이 생성되어 멤버에 할당된다") { + val targetClub = ClubTestFixture.createClub(code = "JOIN-CODE") + val user = UserTestFixture.createRegisteredUser(name = "홍길동") + + every { clubRepository.getClubById(1L) } returns targetClub + every { userReader.getByIdWithLock(10L) } returns user + every { clubMemberRepository.findByClubIdAndUserId(1L, 10L) } returns null + justRun { clubJoinPolicy.validateJoinLimit(10L) } + + useCase.join( + clubId = 1L, + userId = 10L, + request = ClubJoinRequest(code = "JOIN-CODE"), + ) + + verify(exactly = 1) { + userProfileRepository.save( + match { it.name == "홍길동" && it.user == user }, + ) + } + verify(exactly = 1) { + clubMemberRepository.save( + match { it.userProfile != null }, + ) + } + } } context("탈퇴 사용자가 가입 시도하는 경우") { diff --git a/src/test/kotlin/com/weeth/domain/user/fixture/UserTestFixture.kt b/src/test/kotlin/com/weeth/domain/user/fixture/UserTestFixture.kt index 7445c9cb3..652ab024d 100644 --- a/src/test/kotlin/com/weeth/domain/user/fixture/UserTestFixture.kt +++ b/src/test/kotlin/com/weeth/domain/user/fixture/UserTestFixture.kt @@ -34,9 +34,12 @@ object UserTestFixture { status = Status.WAITING, ).applyId(id) - fun createRegisteredUser(id: Long = 0L): User = + fun createRegisteredUser( + id: Long = 0L, + name: String = "등록완료", + ): User = User( - name = "등록완료", + name = name, email = Email.from("registered@test.com"), status = Status.ACTIVE, ).apply {