From 614ae079ba63cc41bd7c0e7740868dc5670da66a Mon Sep 17 00:00:00 2001 From: "birdie.rim" Date: Sat, 10 Jan 2026 16:47:23 +0900 Subject: [PATCH 1/3] =?UTF-8?q?docs:=20user=20phone=20number=20optional=20?= =?UTF-8?q?=EB=AC=B8=EC=84=9C=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/feature/505.md | 202 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 202 insertions(+) create mode 100644 docs/feature/505.md diff --git a/docs/feature/505.md b/docs/feature/505.md new file mode 100644 index 00000000..70b602c5 --- /dev/null +++ b/docs/feature/505.md @@ -0,0 +1,202 @@ +# Feature #505: 전화번호 입력 시점 변경 + +## 개요 + +회원가입 시 전화번호를 필수에서 선택으로 변경하고, 대여 시점에 전화번호를 수집하도록 변경한다. + +## 배경 + +- 현재: 회원가입 시 전화번호 필수 입력 +- 변경: 회원가입 시 전화번호 선택, 대여 시 전화번호 필수 입력 + +## 변경 사항 + +### 1. 회원가입 (JoinRequest) + +**파일:** `src/main/kotlin/upbrella/be/user/dto/request/JoinRequest.kt` + +| 항목 | 현재 | 변경 후 | +|------|------|---------| +| phoneNumber | `@NotBlank` (필수) | nullable (선택) | +| 검증 | 필수 + 패턴 검증 | 입력 시에만 패턴 검증 | + +```kotlin +// 변경 전 +@field:NotBlank +@field:Size(max = 16) +@field:Pattern(regexp = "^\\d{3}-?\\d{4}-?\\d{4}$", message = "유효한 전화번호 형식이 아닙니다.") +val phoneNumber: String = "" + +// 변경 후 +@field:Size(max = 16) +@field:Pattern(regexp = "^\\d{3}-?\\d{4}-?\\d{4}$", message = "유효한 전화번호 형식이 아닙니다.") +val phoneNumber: String? = null +``` + +### 2. User 엔티티 + +**파일:** `src/main/kotlin/upbrella/be/user/entity/User.kt` + +| 항목 | 현재 | 변경 후 | +|------|------|---------| +| phoneNumber | `String` (non-null) | `String?` (nullable) | + +```kotlin +// 변경 전 +var phoneNumber: String, + +// 변경 후 +var phoneNumber: String? = null, +``` + +**추가 메서드:** +```kotlin +fun updatePhoneNumber(phoneNumber: String) { + this.phoneNumber = phoneNumber +} + +fun hasPhoneNumber(): Boolean { + return !phoneNumber.isNullOrBlank() +} +``` + +### 3. 대여 요청 (RentUmbrellaByUserRequest) + +**파일:** `src/main/kotlin/upbrella/be/rent/dto/request/RentUmbrellaByUserRequest.kt` + +| 항목 | 현재 | 변경 후 | +|------|------|---------| +| phoneNumber | 없음 | 추가 (필수) | + +```kotlin +// 변경 후 +data class RentUmbrellaByUserRequest( + val region: String? = null, + val storeId: Long = 0, + val umbrellaId: Long = 0, + @field:Size(max = 400, message = "conditionReport는 최대 400자여야 합니다.") + val conditionReport: String? = null, + // 추가 + @field:NotBlank(message = "전화번호는 필수입니다.") + @field:Size(max = 16) + @field:Pattern(regexp = "^\\d{3}-?\\d{4}-?\\d{4}$", message = "유효한 전화번호 형식이 아닙니다.") + val phoneNumber: String = "" +) +``` + +### 4. 대여 서비스 (RentService) + +**파일:** `src/main/kotlin/upbrella/be/rent/service/RentService.kt` + +`addRental` 메서드에 전화번호 업데이트 로직 추가: + +```kotlin +@Transactional +fun addRental(rentUmbrellaByUserRequest: RentUmbrellaByUserRequest, userToRent: User) { + // 기존 검증 로직... + + // 전화번호 업데이트 (신규 추가) + if (!userToRent.hasPhoneNumber()) { + userToRent.updatePhoneNumber(rentUmbrellaByUserRequest.phoneNumber) + } + + // 기존 대여 로직... +} +``` + +### 5. 대여 폼 응답 (RentFormResponse) + +**파일:** `src/main/kotlin/upbrella/be/rent/dto/response/RentFormResponse.kt` + +대여 폼 조회 시 사용자의 전화번호 유무를 반환하여 프론트엔드에서 입력 필드 표시 여부 결정: + +```kotlin +data class RentFormResponse( + // 기존 필드들... + val hasPhoneNumber: Boolean // 추가 +) +``` + +## API 변경 사항 + +### POST /users/join (회원가입) + +**Request Body 변경:** +```json +{ + "name": "홍길동", + "email": "test@example.com", + "phoneNumber": "010-1234-5678", // 선택 (nullable) + "bank": "신한", + "accountNumber": "110-123-456789" +} +``` + +### GET /rent/form/{umbrellaId} (대여 폼 조회) + +**Response Body 변경:** +```json +{ + "code": 200, + "message": "success", + "data": { + "umbrellaUuid": 1, + "storeMetaId": 1, + "classification": "대여소", + "rentStoreName": "스타벅스 강남점", + "hasPhoneNumber": false // 추가 + } +} +``` + +### POST /rent (우산 대여) + +**Request Body 변경:** +```json +{ + "region": "강남", + "storeId": 1, + "umbrellaId": 1, + "conditionReport": "상태 양호", + "phoneNumber": "010-1234-5678" // 추가 (필수) +} +``` + +## 영향 받는 파일 + +| 파일 | 변경 내용 | +|------|----------| +| `JoinRequest.kt` | phoneNumber nullable로 변경 | +| `User.kt` | phoneNumber nullable + 메서드 추가 | +| `RentUmbrellaByUserRequest.kt` | phoneNumber 필드 추가 | +| `RentService.kt` | 전화번호 업데이트 로직 추가 | +| `RentFormResponse.kt` | hasPhoneNumber 필드 추가 | +| `UserInfoResponse.kt` | phoneNumber nullable 처리 | +| `SingleUserInfoResponse.kt` | phoneNumber nullable 처리 | +| `RentalHistoryResponse.kt` | phoneNumber nullable 처리 | +| `HistoryInfoDto.kt` | phoneNumber nullable 처리 | + +## 테스트 케이스 + +### 회원가입 +- [ ] 전화번호 없이 회원가입 성공 +- [ ] 전화번호 포함하여 회원가입 성공 +- [ ] 잘못된 전화번호 형식으로 회원가입 시 실패 + +### 대여 +- [ ] 전화번호 없는 사용자가 대여 시 전화번호 저장됨 +- [ ] 전화번호 있는 사용자가 대여 시 기존 전화번호 유지 +- [ ] 대여 시 잘못된 전화번호 형식이면 실패 + +### 대여 폼 +- [ ] 전화번호 없는 사용자: `hasPhoneNumber: false` +- [ ] 전화번호 있는 사용자: `hasPhoneNumber: true` + +## 마이그레이션 + +기존 사용자 데이터는 변경 없이 유지됩니다. 신규 가입자부터 적용됩니다. + +## 주의사항 + +1. **하위 호환성**: 기존 API를 사용하는 클라이언트는 대여 요청 시 phoneNumber 필드를 추가해야 합니다. +2. **프론트엔드 연동**: 대여 폼에서 `hasPhoneNumber` 값에 따라 전화번호 입력 필드 표시 여부를 결정해야 합니다. From ad1cd2ee6b0baf32c1a766ba7c04f697e8371312 Mon Sep 17 00:00:00 2001 From: "birdie.rim" Date: Sat, 10 Jan 2026 17:03:20 +0900 Subject: [PATCH 2/3] feat: user phone number optional --- .../upbrella/be/rent/controller/RentController.kt | 9 +++++++-- .../be/rent/dto/request/RentUmbrellaByUserRequest.kt | 9 ++++++++- .../upbrella/be/rent/dto/response/HistoryInfoDto.kt | 2 +- .../upbrella/be/rent/dto/response/RentFormResponse.kt | 8 +++++--- .../be/rent/dto/response/RentalHistoryResponse.kt | 2 +- .../kotlin/upbrella/be/rent/service/RentService.kt | 9 +++++++-- .../kotlin/upbrella/be/user/dto/request/JoinRequest.kt | 4 +--- .../be/user/dto/response/SingleUserInfoResponse.kt | 2 +- .../upbrella/be/user/dto/response/UserInfoResponse.kt | 2 +- src/main/kotlin/upbrella/be/user/entity/User.kt | 10 +++++++++- 10 files changed, 41 insertions(+), 16 deletions(-) diff --git a/src/main/kotlin/upbrella/be/rent/controller/RentController.kt b/src/main/kotlin/upbrella/be/rent/controller/RentController.kt index ee799d41..c06e9b80 100644 --- a/src/main/kotlin/upbrella/be/rent/controller/RentController.kt +++ b/src/main/kotlin/upbrella/be/rent/controller/RentController.kt @@ -31,8 +31,13 @@ class RentController( private val log = LoggerFactory.getLogger(RentController::class.java) @GetMapping("/rent/form/{umbrellaId}") - fun findRentForm(@PathVariable umbrellaId: Long): ResponseEntity> { - val rentForm = rentService.findRentForm(umbrellaId) + fun findRentForm( + @PathVariable umbrellaId: Long, + httpSession: HttpSession + ): ResponseEntity> { + val user = httpSession.getAttribute("user") as SessionUser + val userToRent = userReader.findUserById(user.id) + val rentForm = rentService.findRentForm(umbrellaId, userToRent) return ResponseEntity .ok() diff --git a/src/main/kotlin/upbrella/be/rent/dto/request/RentUmbrellaByUserRequest.kt b/src/main/kotlin/upbrella/be/rent/dto/request/RentUmbrellaByUserRequest.kt index 8b9abb79..d5bc5bc9 100644 --- a/src/main/kotlin/upbrella/be/rent/dto/request/RentUmbrellaByUserRequest.kt +++ b/src/main/kotlin/upbrella/be/rent/dto/request/RentUmbrellaByUserRequest.kt @@ -1,5 +1,7 @@ package upbrella.be.rent.dto.request +import javax.validation.constraints.NotBlank +import javax.validation.constraints.Pattern import javax.validation.constraints.Size data class RentUmbrellaByUserRequest( @@ -8,5 +10,10 @@ data class RentUmbrellaByUserRequest( val umbrellaId: Long = 0, @field:Size(max = 400, message = "conditionReport는 최대 400자여야 합니다.") - val conditionReport: String? = null + val conditionReport: String? = null, + + @field:NotBlank(message = "전화번호는 필수입니다.") + @field:Size(max = 16) + @field:Pattern(regexp = "^\\d{3}-?\\d{4}-?\\d{4}$", message = "유효한 전화번호 형식이 아닙니다.") + val phoneNumber: String = "" ) \ No newline at end of file diff --git a/src/main/kotlin/upbrella/be/rent/dto/response/HistoryInfoDto.kt b/src/main/kotlin/upbrella/be/rent/dto/response/HistoryInfoDto.kt index 6a6925ab..aed9f7dc 100644 --- a/src/main/kotlin/upbrella/be/rent/dto/response/HistoryInfoDto.kt +++ b/src/main/kotlin/upbrella/be/rent/dto/response/HistoryInfoDto.kt @@ -6,7 +6,7 @@ import java.time.LocalDateTime data class HistoryInfoDto @QueryProjection constructor( val id: Long, val name: String, - val phoneNumber: String, + val phoneNumber: String?, val rentStoreName: String, val rentAt: LocalDateTime, val umbrellaUuid: Long, diff --git a/src/main/kotlin/upbrella/be/rent/dto/response/RentFormResponse.kt b/src/main/kotlin/upbrella/be/rent/dto/response/RentFormResponse.kt index ba0cb0d4..b88d58c7 100644 --- a/src/main/kotlin/upbrella/be/rent/dto/response/RentFormResponse.kt +++ b/src/main/kotlin/upbrella/be/rent/dto/response/RentFormResponse.kt @@ -6,15 +6,17 @@ data class RentFormResponse( val classificationName: String, val storeMetaId: Long, val rentStoreName: String, - val umbrellaUuid: Long + val umbrellaUuid: Long, + val hasPhoneNumber: Boolean ) { companion object { - fun of(umbrella: Umbrella): RentFormResponse { + fun of(umbrella: Umbrella, hasPhoneNumber: Boolean): RentFormResponse { return RentFormResponse( classificationName = umbrella.storeMeta.classification!!.name!!, storeMetaId = umbrella.storeMeta.id!!, rentStoreName = umbrella.storeMeta.name, - umbrellaUuid = umbrella.uuid + umbrellaUuid = umbrella.uuid, + hasPhoneNumber = hasPhoneNumber ) } } diff --git a/src/main/kotlin/upbrella/be/rent/dto/response/RentalHistoryResponse.kt b/src/main/kotlin/upbrella/be/rent/dto/response/RentalHistoryResponse.kt index 0dffe915..0ff1a77c 100644 --- a/src/main/kotlin/upbrella/be/rent/dto/response/RentalHistoryResponse.kt +++ b/src/main/kotlin/upbrella/be/rent/dto/response/RentalHistoryResponse.kt @@ -6,7 +6,7 @@ import java.time.LocalDateTime data class RentalHistoryResponse( val id: Long, val name: String, - val phoneNumber: String, + val phoneNumber: String?, val rentStoreName: String, @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd kk:mm:ss") val rentAt: LocalDateTime, diff --git a/src/main/kotlin/upbrella/be/rent/service/RentService.kt b/src/main/kotlin/upbrella/be/rent/service/RentService.kt index d38873bc..0c44579b 100644 --- a/src/main/kotlin/upbrella/be/rent/service/RentService.kt +++ b/src/main/kotlin/upbrella/be/rent/service/RentService.kt @@ -41,12 +41,12 @@ class RentService( private val userReader: UserReader, ) { - fun findRentForm(umbrellaId: Long): RentFormResponse { + fun findRentForm(umbrellaId: Long, user: User): RentFormResponse { val umbrella = umbrellaService.findUmbrellaById(umbrellaId) if (umbrella.cannotBeRented()) { throw CannotBeRentedException("[ERROR] 해당 우산은 대여 불가능한 우산입니다.") } - return RentFormResponse.of(umbrella) + return RentFormResponse.of(umbrella, user.hasPhoneNumber()) } fun findReturnForm( @@ -65,6 +65,11 @@ class RentService( rentRepository.findByUserIdAndReturnedAtIsNull(userToRent.id).ifPresent { throw ExistingUmbrellaForRentException("[ERROR] 해당 유저가 대여 중인 우산이 있습니다.") } + + if (!userToRent.hasPhoneNumber()) { + userToRent.updatePhoneNumber(rentUmbrellaByUserRequest.phoneNumber) + } + val umbrella = umbrellaService.findUmbrellaById(rentUmbrellaByUserRequest.umbrellaId) if (umbrella.storeMeta.id != rentUmbrellaByUserRequest.storeId) { throw UmbrellaStoreMissMatchException("[ERROR] 해당 우산은 해당 매장에 존재하지 않습니다.") diff --git a/src/main/kotlin/upbrella/be/user/dto/request/JoinRequest.kt b/src/main/kotlin/upbrella/be/user/dto/request/JoinRequest.kt index 3c79d1be..dc0f7603 100644 --- a/src/main/kotlin/upbrella/be/user/dto/request/JoinRequest.kt +++ b/src/main/kotlin/upbrella/be/user/dto/request/JoinRequest.kt @@ -1,7 +1,6 @@ package upbrella.be.user.dto.request import javax.validation.constraints.Email -import javax.validation.constraints.NotBlank import javax.validation.constraints.Pattern import javax.validation.constraints.Size @@ -10,10 +9,9 @@ data class JoinRequest( @field:Pattern(regexp = "^[가-힣a-zA-Z\\s]{2,20}$", message = "이름은 한글, 영문, 공백 2~20자로 입력해주세요.") val name: String = "", - @field:NotBlank @field:Size(max = 16) @field:Pattern(regexp = "^\\d{3}-?\\d{4}-?\\d{4}$", message = "유효한 전화번호 형식이 아닙니다.") - val phoneNumber: String = "", + val phoneNumber: String? = null, @field:Email @field:Size(max = 100) diff --git a/src/main/kotlin/upbrella/be/user/dto/response/SingleUserInfoResponse.kt b/src/main/kotlin/upbrella/be/user/dto/response/SingleUserInfoResponse.kt index f8078979..d6fbe914 100644 --- a/src/main/kotlin/upbrella/be/user/dto/response/SingleUserInfoResponse.kt +++ b/src/main/kotlin/upbrella/be/user/dto/response/SingleUserInfoResponse.kt @@ -6,7 +6,7 @@ import java.time.LocalDateTime data class SingleUserInfoResponse( val id: Long, val name: String, - val phoneNumber: String, + val phoneNumber: String?, val email: String, val bank: String?, val accountNumber: String?, diff --git a/src/main/kotlin/upbrella/be/user/dto/response/UserInfoResponse.kt b/src/main/kotlin/upbrella/be/user/dto/response/UserInfoResponse.kt index 0c5653f2..d79a1b28 100644 --- a/src/main/kotlin/upbrella/be/user/dto/response/UserInfoResponse.kt +++ b/src/main/kotlin/upbrella/be/user/dto/response/UserInfoResponse.kt @@ -5,7 +5,7 @@ import upbrella.be.user.entity.User data class UserInfoResponse( val id: Long, val name: String, - val phoneNumber: String, + val phoneNumber: String?, val bank: String?, val accountNumber: String?, val email: String, diff --git a/src/main/kotlin/upbrella/be/user/entity/User.kt b/src/main/kotlin/upbrella/be/user/entity/User.kt index 37acb31c..6fbabe7d 100644 --- a/src/main/kotlin/upbrella/be/user/entity/User.kt +++ b/src/main/kotlin/upbrella/be/user/entity/User.kt @@ -14,7 +14,7 @@ import javax.persistence.Id class User( var socialId: Long, var name: String, - var phoneNumber: String, + var phoneNumber: String? = null, var email: String, var provider: String = "KAKAO", // KAKAO or APPLE var adminStatus: Boolean = false, @@ -102,4 +102,12 @@ class User( fun updateAdminStatus() { this.adminStatus = !this.adminStatus } + + fun updatePhoneNumber(phoneNumber: String) { + this.phoneNumber = phoneNumber + } + + fun hasPhoneNumber(): Boolean { + return !phoneNumber.isNullOrBlank() + } } \ No newline at end of file From 05b06a8c397d370e94ee208b8ac53cd0af76c764 Mon Sep 17 00:00:00 2001 From: "birdie.rim" Date: Sat, 10 Jan 2026 17:11:53 +0900 Subject: [PATCH 3/3] test: user phone number optional --- .../be/rent/controller/RentControllerTest.kt | 39 +++++++-- .../be/rent/service/RentServiceTest.kt | 61 +++++++++++++- .../be/user/controller/UserControllerTest.kt | 2 +- .../upbrella/be/user/entity/UserTest.kt | 79 +++++++++++++++++++ 4 files changed, 174 insertions(+), 7 deletions(-) diff --git a/src/test/kotlin/upbrella/be/rent/controller/RentControllerTest.kt b/src/test/kotlin/upbrella/be/rent/controller/RentControllerTest.kt index da81f55c..72878f16 100644 --- a/src/test/kotlin/upbrella/be/rent/controller/RentControllerTest.kt +++ b/src/test/kotlin/upbrella/be/rent/controller/RentControllerTest.kt @@ -79,19 +79,43 @@ class RentControllerTest : RestDocsSupport() { @DisplayName("사용자는 대여 폼 자동 완성에 필요한 데이터를 조회할 수 있다.") fun findRentalFormTest() { // given + val sessionUser = SessionUser( + id = 1L, + socialId = 1L, + adminStatus = false + ) + + val userToRent = User( + socialId = 1L, + name = "테스터1", + phoneNumber = "010-1111-1111", + email = "email", + provider = "KAKAO", + adminStatus = false, + bank = null, + accountNumber = null, + id = 1L + ) + + val session = MockHttpSession() + session.setAttribute("user", sessionUser) + val rentFormResponse = RentFormResponse( classificationName = "신촌", storeMetaId = 233L, rentStoreName = "motive study cafe", - umbrellaUuid = 99L + umbrellaUuid = 99L, + hasPhoneNumber = true ) - given(rentService.findRentForm(2L)) + given(userReader.findUserById(1L)).willReturn(userToRent) + given(rentService.findRentForm(2L, userToRent)) .willReturn(rentFormResponse) // when & then mockMvc.perform( get("/rent/form/{umbrellaId}", 2L) + .session(session) ) .andDo(print()) .andExpect(status().isOk) @@ -113,7 +137,9 @@ class RentControllerTest : RestDocsSupport() { fieldWithPath("rentStoreName").type(JsonFieldType.STRING) .description("대여 지점 이름"), fieldWithPath("umbrellaUuid").type(JsonFieldType.NUMBER) - .description("우산 고유번호") + .description("우산 고유번호"), + fieldWithPath("hasPhoneNumber").type(JsonFieldType.BOOLEAN) + .description("전화번호 보유 여부") ) ) ) @@ -215,7 +241,8 @@ class RentControllerTest : RestDocsSupport() { region = "신촌", storeId = 1L, umbrellaId = 1L, - conditionReport = "필요하다면 상태 신고를 해주세요." + conditionReport = "필요하다면 상태 신고를 해주세요.", + phoneNumber = "010-1111-1111" ) val newUser = User( @@ -258,7 +285,9 @@ class RentControllerTest : RestDocsSupport() { .description("우산 고유번호"), fieldWithPath("conditionReport").type(JsonFieldType.STRING) .optional() - .description("상태 신고") + .description("상태 신고"), + fieldWithPath("phoneNumber").type(JsonFieldType.STRING) + .description("전화번호") ), responseFields( beneathPath("data").withSubsectionId("data"), diff --git a/src/test/kotlin/upbrella/be/rent/service/RentServiceTest.kt b/src/test/kotlin/upbrella/be/rent/service/RentServiceTest.kt index cd9472e4..6089c7f3 100644 --- a/src/test/kotlin/upbrella/be/rent/service/RentServiceTest.kt +++ b/src/test/kotlin/upbrella/be/rent/service/RentServiceTest.kt @@ -95,7 +95,8 @@ class RentServiceTest { region = "신촌", storeId = 25L, umbrellaId = 99L, - conditionReport = "상태 양호" + conditionReport = "상태 양호", + phoneNumber = "010-1234-5678" ) foundStoreMeta = StoreMeta( @@ -228,6 +229,64 @@ class RentServiceTest { } ) } + + @Test + @DisplayName("전화번호가 없는 사용자가 대여하면 전화번호가 저장된다") + fun addPhoneNumberWhenUserHasNoPhoneNumber() { + // given + val userWithoutPhone = User( + socialId = 0L, + name = "테스터", + phoneNumber = null, + email = "email", + provider = "KAKAO", + adminStatus = false, + bank = null, + accountNumber = null, + id = 11L + ) + + given(storeMetaReader.findById(25L)).willReturn(foundStoreMeta) + given(umbrellaService.findUmbrellaById(99L)).willReturn(foundUmbrella) + given(rentRepository.save(any(History::class.java) ?: history)).willReturn(history) + doNothing().`when`(conditionReportService) + .saveConditionReport(any(ConditionReport::class.java) ?: conditionReport) + + // when + rentService.addRental(rentUmbrellaByUserRequest, userWithoutPhone) + + // then + assertThat(userWithoutPhone.phoneNumber).isEqualTo("010-1234-5678") + } + + @Test + @DisplayName("전화번호가 있는 사용자가 대여해도 기존 전화번호가 유지된다") + fun keepPhoneNumberWhenUserHasPhoneNumber() { + // given + val userWithPhone = User( + socialId = 0L, + name = "테스터", + phoneNumber = "010-9999-9999", + email = "email", + provider = "KAKAO", + adminStatus = false, + bank = null, + accountNumber = null, + id = 11L + ) + + given(storeMetaReader.findById(25L)).willReturn(foundStoreMeta) + given(umbrellaService.findUmbrellaById(99L)).willReturn(foundUmbrella) + given(rentRepository.save(any(History::class.java) ?: history)).willReturn(history) + doNothing().`when`(conditionReportService) + .saveConditionReport(any(ConditionReport::class.java) ?: conditionReport) + + // when + rentService.addRental(rentUmbrellaByUserRequest, userWithPhone) + + // then + assertThat(userWithPhone.phoneNumber).isEqualTo("010-9999-9999") + } } @Nested diff --git a/src/test/kotlin/upbrella/be/user/controller/UserControllerTest.kt b/src/test/kotlin/upbrella/be/user/controller/UserControllerTest.kt index 40feaab0..d58ea0dc 100644 --- a/src/test/kotlin/upbrella/be/user/controller/UserControllerTest.kt +++ b/src/test/kotlin/upbrella/be/user/controller/UserControllerTest.kt @@ -369,7 +369,7 @@ class UserControllerTest ( getDocumentResponse(), requestFields( fieldWithPath("name").description("이름"), - fieldWithPath("phoneNumber").description("연락처"), + fieldWithPath("phoneNumber").optional().description("연락처"), fieldWithPath("email").optional().description("이메일"), fieldWithPath("bank").optional().description("은행"), fieldWithPath("accountNumber").optional().description("계좌 번호") diff --git a/src/test/kotlin/upbrella/be/user/entity/UserTest.kt b/src/test/kotlin/upbrella/be/user/entity/UserTest.kt index 457c673b..db463bd8 100644 --- a/src/test/kotlin/upbrella/be/user/entity/UserTest.kt +++ b/src/test/kotlin/upbrella/be/user/entity/UserTest.kt @@ -166,4 +166,83 @@ class UserTest { // then assertThat(user.adminStatus).isTrue() } + + @Test + @DisplayName("사용자의 전화번호를 업데이트할 수 있다.") + fun updatePhoneNumberTest() { + // given + val user = User( + id = 1L, + socialId = 1L, + name = "testUser", + phoneNumber = null, + email = "email@example.com", + adminStatus = false, + bank = "bank", + accountNumber = "accountNumber" + ) + + // when + user.updatePhoneNumber("010-1234-5678") + + // then + assertThat(user.phoneNumber).isEqualTo("010-1234-5678") + } + + @Test + @DisplayName("전화번호가 있는 사용자는 hasPhoneNumber가 true를 반환한다.") + fun hasPhoneNumberReturnsTrueTest() { + // given + val user = User( + id = 1L, + socialId = 1L, + name = "testUser", + phoneNumber = "010-1234-5678", + email = "email@example.com", + adminStatus = false, + bank = "bank", + accountNumber = "accountNumber" + ) + + // when & then + assertThat(user.hasPhoneNumber()).isTrue() + } + + @Test + @DisplayName("전화번호가 없는 사용자는 hasPhoneNumber가 false를 반환한다.") + fun hasPhoneNumberReturnsFalseTest() { + // given + val user = User( + id = 1L, + socialId = 1L, + name = "testUser", + phoneNumber = null, + email = "email@example.com", + adminStatus = false, + bank = "bank", + accountNumber = "accountNumber" + ) + + // when & then + assertThat(user.hasPhoneNumber()).isFalse() + } + + @Test + @DisplayName("전화번호가 빈 문자열인 사용자는 hasPhoneNumber가 false를 반환한다.") + fun hasPhoneNumberReturnsFalseForEmptyStringTest() { + // given + val user = User( + id = 1L, + socialId = 1L, + name = "testUser", + phoneNumber = "", + email = "email@example.com", + adminStatus = false, + bank = "bank", + accountNumber = "accountNumber" + ) + + // when & then + assertThat(user.hasPhoneNumber()).isFalse() + } } \ No newline at end of file