From b8255f0f7fec058a9ce6e60e92632755bff5b86f Mon Sep 17 00:00:00 2001 From: can019 Date: Sun, 7 Sep 2025 12:27:19 +0900 Subject: [PATCH 1/2] chore: Check email request, response dto --- .../icebang/domain/user/dto/CheckEmailRequest.java | 14 ++++++++++++++ .../domain/user/dto/CheckEmailResponse.java | 10 ++++++++++ 2 files changed, 24 insertions(+) create mode 100644 apps/user-service/src/main/java/com/gltkorea/icebang/domain/user/dto/CheckEmailRequest.java create mode 100644 apps/user-service/src/main/java/com/gltkorea/icebang/domain/user/dto/CheckEmailResponse.java diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/domain/user/dto/CheckEmailRequest.java b/apps/user-service/src/main/java/com/gltkorea/icebang/domain/user/dto/CheckEmailRequest.java new file mode 100644 index 00000000..49208315 --- /dev/null +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/domain/user/dto/CheckEmailRequest.java @@ -0,0 +1,14 @@ +package com.gltkorea.icebang.domain.user.dto; + +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class CheckEmailRequest { + @NotBlank(message = "이메일은 필수입니다") + @Email(message = "올바른 이메일 형식이 아닙니다") + private String email; +} diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/domain/user/dto/CheckEmailResponse.java b/apps/user-service/src/main/java/com/gltkorea/icebang/domain/user/dto/CheckEmailResponse.java new file mode 100644 index 00000000..8b92d187 --- /dev/null +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/domain/user/dto/CheckEmailResponse.java @@ -0,0 +1,10 @@ +package com.gltkorea.icebang.domain.user.dto; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class CheckEmailResponse { + private Boolean available; +} From 6c4ae46797e6fae3f872bfba092672e8d5aa25be Mon Sep 17 00:00:00 2001 From: can019 Date: Sun, 7 Sep 2025 12:38:43 +0900 Subject: [PATCH 2/2] feat: Email check api --- .../user/controller/UserController.java | 30 +++++++++++++++++++ .../domain/user/service/UserService.java | 11 ++++++- .../gltkorea/icebang/mapper/UserMapper.java | 11 +++++++ 3 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 apps/user-service/src/main/java/com/gltkorea/icebang/domain/user/controller/UserController.java create mode 100644 apps/user-service/src/main/java/com/gltkorea/icebang/mapper/UserMapper.java diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/domain/user/controller/UserController.java b/apps/user-service/src/main/java/com/gltkorea/icebang/domain/user/controller/UserController.java new file mode 100644 index 00000000..e6b07bce --- /dev/null +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/domain/user/controller/UserController.java @@ -0,0 +1,30 @@ +package com.gltkorea.icebang.domain.user.controller; + +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.gltkorea.icebang.common.dto.ApiResponse; +import com.gltkorea.icebang.domain.user.dto.CheckEmailRequest; +import com.gltkorea.icebang.domain.user.dto.CheckEmailResponse; +import com.gltkorea.icebang.domain.user.service.UserService; + +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; + +@RestController +@RequestMapping("/v0/users") +@RequiredArgsConstructor +public class UserController { + private final UserService userService; + + @PostMapping("/check-email") + public ApiResponse checkEmailAvailable( + @Valid @RequestBody CheckEmailRequest request) { + Boolean available = !userService.isExistEmail(request); + String message = available.equals(Boolean.TRUE) ? "사용 가능한 이메일입니다." : "이미 가입된 이메일입니다."; + + return ApiResponse.success(CheckEmailResponse.builder().available(available).build(), message); + } +} diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/domain/user/service/UserService.java b/apps/user-service/src/main/java/com/gltkorea/icebang/domain/user/service/UserService.java index 02d038ff..10ec3000 100644 --- a/apps/user-service/src/main/java/com/gltkorea/icebang/domain/user/service/UserService.java +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/domain/user/service/UserService.java @@ -1,16 +1,20 @@ package com.gltkorea.icebang.domain.user.service; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import com.gltkorea.icebang.domain.auth.dto.RegisterDto; +import com.gltkorea.icebang.domain.user.dto.CheckEmailRequest; import com.gltkorea.icebang.entity.Users; +import com.gltkorea.icebang.mapper.UserMapper; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; @Service @RequiredArgsConstructor public class UserService { - // private final UserMapper userMapper; + private final UserMapper userMapper; public void registerUser(RegisterDto registerDto) { Users user = @@ -21,4 +25,9 @@ public void registerUser(RegisterDto registerDto) { .status("PENDING") .build(); } + + @Transactional(readOnly = true) + public Boolean isExistEmail(@Valid CheckEmailRequest request) { + return userMapper.existsByEmail(request.getEmail()); + } } diff --git a/apps/user-service/src/main/java/com/gltkorea/icebang/mapper/UserMapper.java b/apps/user-service/src/main/java/com/gltkorea/icebang/mapper/UserMapper.java new file mode 100644 index 00000000..734fe8d5 --- /dev/null +++ b/apps/user-service/src/main/java/com/gltkorea/icebang/mapper/UserMapper.java @@ -0,0 +1,11 @@ +package com.gltkorea.icebang.mapper; + +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +@Mapper +public interface UserMapper { + @Select("SELECT COUNT(1) > 0 FROM users WHERE email = #{email}") + boolean existsByEmail(@Param("email") String email); +}