diff --git a/src/main/java/com/rabbitmqprac/application/controller/UserController.java b/src/main/java/com/rabbitmqprac/application/controller/UserController.java index 27c825d..0504715 100644 --- a/src/main/java/com/rabbitmqprac/application/controller/UserController.java +++ b/src/main/java/com/rabbitmqprac/application/controller/UserController.java @@ -1,6 +1,7 @@ package com.rabbitmqprac.application.controller; import com.rabbitmqprac.application.dto.auth.res.UserDetailRes; +import com.rabbitmqprac.application.dto.user.req.NicknameCheckReq; import com.rabbitmqprac.application.dto.user.req.NicknameUpdateReq; import com.rabbitmqprac.domain.context.user.service.UserService; import com.rabbitmqprac.infra.security.authentication.SecurityUserDetails; @@ -46,4 +47,8 @@ public ResponseEntity patchNickname(@AuthenticationPrincipal SecurityUserD return ResponseEntity.noContent().build(); } + @GetMapping("/users/nickname") + public Map checkNicknameDuplication(@Validated NicknameCheckReq nicknameCheckReq) { + return Map.of("isDuplicated", userService.isDuplicatedNickname(nicknameCheckReq)); + } } diff --git a/src/main/java/com/rabbitmqprac/application/dto/user/req/NicknameCheckReq.java b/src/main/java/com/rabbitmqprac/application/dto/user/req/NicknameCheckReq.java new file mode 100644 index 0000000..b24e13d --- /dev/null +++ b/src/main/java/com/rabbitmqprac/application/dto/user/req/NicknameCheckReq.java @@ -0,0 +1,9 @@ +package com.rabbitmqprac.application.dto.user.req; + +import com.rabbitmqprac.global.annotation.Nickname; + +public record NicknameCheckReq( + @Nickname + String nickname +) { +} diff --git a/src/main/java/com/rabbitmqprac/domain/context/user/service/UserService.java b/src/main/java/com/rabbitmqprac/domain/context/user/service/UserService.java index 5e0beb9..c591fcc 100644 --- a/src/main/java/com/rabbitmqprac/domain/context/user/service/UserService.java +++ b/src/main/java/com/rabbitmqprac/domain/context/user/service/UserService.java @@ -2,6 +2,7 @@ import com.rabbitmqprac.application.dto.auth.res.UserDetailRes; +import com.rabbitmqprac.application.dto.user.req.NicknameCheckReq; import com.rabbitmqprac.application.dto.user.req.NicknameUpdateReq; import com.rabbitmqprac.application.mapper.UserMapper; import com.rabbitmqprac.domain.context.user.dto.req.UserCreateReq; @@ -91,4 +92,9 @@ public User create(String nickname) { User user = User.of(nickname, Role.USER); return userRepository.save(user); } + + @Transactional(readOnly = true) + public boolean isDuplicatedNickname(NicknameCheckReq req) { + return userRepository.existsByNickname(req.nickname()); + } } diff --git a/src/test/java/com/rabbitmqprac/service/UserServiceTest.java b/src/test/java/com/rabbitmqprac/service/UserServiceTest.java index b0d72f8..cc3720c 100644 --- a/src/test/java/com/rabbitmqprac/service/UserServiceTest.java +++ b/src/test/java/com/rabbitmqprac/service/UserServiceTest.java @@ -1,6 +1,7 @@ package com.rabbitmqprac.service; import com.rabbitmqprac.application.dto.auth.res.UserDetailRes; +import com.rabbitmqprac.application.dto.user.req.NicknameCheckReq; import com.rabbitmqprac.application.dto.user.req.NicknameUpdateReq; import com.rabbitmqprac.common.fixture.UserFixture; import com.rabbitmqprac.domain.context.user.dto.req.UserCreateReq; @@ -9,6 +10,7 @@ import com.rabbitmqprac.domain.context.user.service.UserService; import com.rabbitmqprac.domain.persistence.user.entity.User; import com.rabbitmqprac.domain.persistence.user.repository.UserRepository; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -279,4 +281,41 @@ void isDuplicatedUsernameFalse() { } } + @Nested + @DisplayName("닉네임 중복 체크 성공 시나리오") + class NicknameDuplicateCheckSuccessScenarios { + private static NicknameCheckReq req = mock(NicknameCheckReq.class); + + @BeforeEach + void setUp() { + given(req.nickname()).willReturn(user.getNickname()); + } + + @Test + @DisplayName("닉네임 중복 체크 - 중복") + void isDuplicatedNicknameTrue() { + // given + given(userRepository.existsByNickname(user.getNickname())).willReturn(Boolean.TRUE); + + // when + Boolean result = userService.isDuplicatedNickname(req); + + // then + assertThat(result).isTrue(); + } + + @Test + @DisplayName("닉네임 중복 체크 - 중복 아님") + void isDuplicatedNicknameFalse() { + // given + given(userRepository.existsByNickname(user.getNickname())).willReturn(Boolean.FALSE); + + // when + Boolean result = userService.isDuplicatedNickname(req); + + // then + assertThat(result).isFalse(); + } + } + }