From 73e70b646c6cfd5f982ceb22554b5f89b2657384 Mon Sep 17 00:00:00 2001 From: seungheonlee Date: Tue, 26 Aug 2025 03:28:17 +0900 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20=EC=9C=A0=EC=A0=80=20=EB=8B=89?= =?UTF-8?q?=EB=84=A4=EC=9E=84=20=EC=A4=91=EB=B3=B5=20=EC=B2=B4=ED=81=AC=20?= =?UTF-8?q?api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/controller/UserController.java | 5 +++++ .../application/dto/user/req/NicknameCheckReq.java | 9 +++++++++ .../domain/context/user/service/UserService.java | 6 ++++++ 3 files changed, 20 insertions(+) create mode 100644 src/main/java/com/rabbitmqprac/application/dto/user/req/NicknameCheckReq.java 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()); + } } From cec4719423807f8b4557c0354951479da44c8bf4 Mon Sep 17 00:00:00 2001 From: seungheonlee Date: Tue, 26 Aug 2025 03:28:23 +0900 Subject: [PATCH 2/2] =?UTF-8?q?test:=20=EC=9C=A0=EC=A0=80=20=EB=8B=89?= =?UTF-8?q?=EB=84=A4=EC=9E=84=20=EC=A4=91=EB=B3=B5=20=EC=B2=B4=ED=81=AC=20?= =?UTF-8?q?api?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../rabbitmqprac/service/UserServiceTest.java | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) 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(); + } + } + }