";
- msgg += "CODE :
";
- msgg += ePw + "
";
- msgg += "
";
- return msgg;
- }
-
- public static String createKey() {
- StringBuilder key = new StringBuilder();
- Random rnd = new Random();
-
- for (int i = 0; i < 8; i++) { // 인증코드 8자리
- int index = rnd.nextInt(3); // 0~2 까지 랜덤
-
- switch (index) {
- case 0:
- key.append((char) (rnd.nextInt(26) + 97));
- // a~z (ex. 1+97=98 => (char)98 = 'b')
- break;
- case 1:
- key.append((char) (rnd.nextInt(26) + 65));
- // A~Z
- break;
- case 2:
- key.append((rnd.nextInt(10)));
- // 0~9
- break;
- }
- }
- return key.toString();
- }
-
- public String sendSimpleMessage(String to) throws Exception {
- // TODO Auto-generated method stub
- MimeMessage message = createMessage(to);
- try {//예외처리
- emailSender.send(message);
- } catch (MailException es) {
- throw new IllegalArgumentException("Failed to send email", es);
- }
- return ePw;
- }
-}
From c11e37ad9799d3889c6d0c791ef70dea5fbf76cf Mon Sep 17 00:00:00 2001
From: HyunwooYi <83715335+HyunwooYi@users.noreply.github.com>
Date: Fri, 1 Aug 2025 17:04:14 +0900
Subject: [PATCH 2/3] =?UTF-8?q?=EB=A9=94=EC=9D=BC=20=EC=9D=B8=EC=A6=9D=20r?=
=?UTF-8?q?edis=20=EC=A0=81=EC=9A=A9?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
build.gradle | 2 +
.../api/auth/controller/FindController.java | 2 -
.../api/auth/controller/LoginController.java | 5 --
.../api/auth/service/FindInfoService.java | 4 -
.../servnow/api/config/RedisConfig.java | 33 +++++++++
.../api/user/controller/UserController.java | 74 ++++++++++++-------
.../request/CertificationNumberRequest.java | 1 +
.../api/user/service/EmailCodeGenerator.java | 21 ++++++
.../api/user/service/EmailCommandService.java | 56 ++++++++++++++
.../api/user/service/EmailQueryService.java | 15 ++++
.../service/EmailVerificationService.java | 28 +++++++
.../api/user/service/UserCommandService.java | 49 ++++++------
.../api/user/service/UserQueryService.java | 15 +---
.../servnow/common/code/UserErrorCode.java | 1 +
14 files changed, 226 insertions(+), 80 deletions(-)
create mode 100644 src/main/java/servnow/servnow/api/config/RedisConfig.java
create mode 100644 src/main/java/servnow/servnow/api/user/service/EmailCodeGenerator.java
create mode 100644 src/main/java/servnow/servnow/api/user/service/EmailCommandService.java
create mode 100644 src/main/java/servnow/servnow/api/user/service/EmailQueryService.java
create mode 100644 src/main/java/servnow/servnow/api/user/service/EmailVerificationService.java
diff --git a/build.gradle b/build.gradle
index 0dbf780..34cd662 100644
--- a/build.gradle
+++ b/build.gradle
@@ -60,6 +60,8 @@ dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'
implementation "com.amazonaws:aws-java-sdk-s3:1.12.395"
+ // Redis
+ implementation 'org.springframework.boot:spring-boot-starter-data-redis'
// Swagger
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2'
diff --git a/src/main/java/servnow/servnow/api/auth/controller/FindController.java b/src/main/java/servnow/servnow/api/auth/controller/FindController.java
index 0633ad2..5d4834e 100644
--- a/src/main/java/servnow/servnow/api/auth/controller/FindController.java
+++ b/src/main/java/servnow/servnow/api/auth/controller/FindController.java
@@ -7,7 +7,6 @@
import servnow.servnow.api.dto.login.UserChangePwRequest;
import servnow.servnow.api.user.dto.request.CertificationNumberRequest;
import servnow.servnow.api.user.dto.request.EmailDuplicateRequest;
-import servnow.servnow.api.user.service.EmailService;
import servnow.servnow.api.user.service.UserCommandService;
import servnow.servnow.api.user.service.UserQueryService;
import servnow.servnow.common.code.CommonSuccessCode;
@@ -15,7 +14,6 @@
import servnow.servnow.common.code.UserErrorCode;
import servnow.servnow.domain.user.model.User;
import servnow.servnow.domain.user.model.enums.Platform;
-import servnow.servnow.domain.user.repository.UserInfoRepository;
import servnow.servnow.domain.user.repository.UserRepository;
import java.util.Optional;
diff --git a/src/main/java/servnow/servnow/api/auth/controller/LoginController.java b/src/main/java/servnow/servnow/api/auth/controller/LoginController.java
index f0b4d69..fc5bc2a 100644
--- a/src/main/java/servnow/servnow/api/auth/controller/LoginController.java
+++ b/src/main/java/servnow/servnow/api/auth/controller/LoginController.java
@@ -1,6 +1,5 @@
package servnow.servnow.api.auth.controller;
-import com.fasterxml.jackson.core.JsonProcessingException;
import io.swagger.v3.oas.annotations.Parameter;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpHeaders;
@@ -15,15 +14,11 @@
import servnow.servnow.api.user.dto.request.CertificationNumberRequest;
import servnow.servnow.api.user.dto.request.EmailDuplicateRequest;
import servnow.servnow.api.user.dto.request.SerialIdDuplicateRequest;
-import servnow.servnow.api.user.service.EmailService;
import servnow.servnow.api.user.service.UserQueryService;
import servnow.servnow.auth.UserId;
-import servnow.servnow.auth.jwt.Token;
import servnow.servnow.common.code.CommonSuccessCode;
import servnow.servnow.common.code.UserErrorCode;
-import java.io.IOException;
-
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/v1")
diff --git a/src/main/java/servnow/servnow/api/auth/service/FindInfoService.java b/src/main/java/servnow/servnow/api/auth/service/FindInfoService.java
index e932c4f..4ed38fb 100644
--- a/src/main/java/servnow/servnow/api/auth/service/FindInfoService.java
+++ b/src/main/java/servnow/servnow/api/auth/service/FindInfoService.java
@@ -1,12 +1,9 @@
package servnow.servnow.api.auth.service;
import lombok.RequiredArgsConstructor;
-import org.springframework.http.HttpStatus;
-import org.springframework.security.core.Authentication;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import servnow.servnow.api.dto.ServnowResponse;
-import servnow.servnow.api.user.service.EmailService;
import servnow.servnow.common.code.CommonSuccessCode;
import servnow.servnow.common.code.LoginErrorCode;
import servnow.servnow.common.code.UserErrorCode;
@@ -23,7 +20,6 @@ public class FindInfoService {
private final UserRepository userRepository;
private final UserInfoRepository userInfoRepository;
- private final EmailService emailService;
private final PasswordEncoder passwordEncoder;
/**
diff --git a/src/main/java/servnow/servnow/api/config/RedisConfig.java b/src/main/java/servnow/servnow/api/config/RedisConfig.java
new file mode 100644
index 0000000..958397a
--- /dev/null
+++ b/src/main/java/servnow/servnow/api/config/RedisConfig.java
@@ -0,0 +1,33 @@
+package servnow.servnow.api.config;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+
+@Configuration
+public class RedisConfig {
+
+ @Value("${spring.data.redis.host}")
+ private String redisHost;
+
+ @Value("${spring.data.redis.port}")
+ private int redisPort;
+
+ @Bean
+ public RedisConnectionFactory redisConnectionFactory() {
+ return new LettuceConnectionFactory(redisHost, redisPort);
+ }
+
+ @Bean
+ public RedisTemplate
redisTemplate() {
+ RedisTemplate redisTemplate = new RedisTemplate<>();
+ redisTemplate.setConnectionFactory(redisConnectionFactory());
+ redisTemplate.setKeySerializer(new StringRedisSerializer());
+ redisTemplate.setValueSerializer(new StringRedisSerializer());
+ return redisTemplate;
+ }
+}
diff --git a/src/main/java/servnow/servnow/api/user/controller/UserController.java b/src/main/java/servnow/servnow/api/user/controller/UserController.java
index 5683fec..84b4f36 100644
--- a/src/main/java/servnow/servnow/api/user/controller/UserController.java
+++ b/src/main/java/servnow/servnow/api/user/controller/UserController.java
@@ -27,7 +27,8 @@
import servnow.servnow.api.user.dto.response.MySurveyResponse;
import servnow.servnow.api.survey.service.SurveyQueryService;
import servnow.servnow.api.user.dto.response.UserPointGetResponse;
-import servnow.servnow.api.user.service.EmailService;
+import servnow.servnow.api.user.service.EmailCommandService;
+import servnow.servnow.api.user.service.EmailQueryService;
import servnow.servnow.api.user.service.UserCommandService;
import servnow.servnow.api.user.service.UserQueryService;
import servnow.servnow.auth.UserId;
@@ -46,17 +47,18 @@ public class UserController {
private final ResultQueryService resultQueryService;
private final ResultCommandService resultCommandService;
private final SurveyQueryService surveyQueryService;
-
+ private final EmailCommandService emailCommandService;
+ private final EmailQueryService emailQueryService;
// 아직 유저 정보를 넘기는 방식이 정해지지 않아서 UserQueryService에서 userId값을 고정하여 테스트 함
@GetMapping("/users/me")
- public ServnowResponse getMyPage(@Parameter (hidden = true) @UserId final Long userId) {
+ public ServnowResponse getMyPage(@Parameter(hidden = true) @UserId final Long userId) {
return ServnowResponse.success(CommonSuccessCode.OK, userQueryService.getMyPage(userId));
}
@GetMapping("/users/me/info")
- public ServnowResponse getEditProfilePage(@Parameter (hidden = true) @UserId final Long userId) {
+ public ServnowResponse getEditProfilePage(@Parameter(hidden = true) @UserId final Long userId) {
return ServnowResponse.success(CommonSuccessCode.OK, userQueryService.getEditProfilePage(userId));
}
@@ -67,12 +69,17 @@ public ServnowResponse getSerialIdDuplicate(@RequestBody SerialIdDuplic
@PostMapping("/users/me/info/identity-verification")
public ServnowResponse identityVerification(@RequestBody EmailDuplicateRequest request) throws Exception {
- return userQueryService.identityVerification(request.email());
+ if (userQueryService.emailDuplicate(request.email())) {
+ return ServnowResponse.fail(UserErrorCode.EMAIL_DUPLICATE);
+ }
+ emailCommandService.sendVerificationEmail(request.email());
+ return ServnowResponse.success(CommonSuccessCode.OK);
}
@PostMapping("/users/me/info/certification")
public ServnowResponse