From b96fe0cd8950edd50419b75219400d51cc9e3d57 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Mon, 20 Jan 2025 04:08:01 +0900 Subject: [PATCH 01/25] =?UTF-8?q?feat:=20MealTime=20=EC=9E=85=EB=A0=A5=20?= =?UTF-8?q?=EA=B0=9C=EC=88=98=20=EC=98=88=EC=99=B8=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/user/application/UserService.java | 14 ++++++++++---- .../exception/InvalidMealTimeCountException.java | 11 +++++++++++ .../backend/global/exception/ErrorCode.java | 1 + 3 files changed, 22 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/ourmenu/backend/domain/user/exception/InvalidMealTimeCountException.java diff --git a/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java b/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java index 770da7d..3d9229c 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java +++ b/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java @@ -11,10 +11,7 @@ import com.ourmenu.backend.domain.user.dto.response.ReissueToken; import com.ourmenu.backend.domain.user.dto.response.TokenDto; import com.ourmenu.backend.domain.user.dto.response.UserDto; -import com.ourmenu.backend.domain.user.exception.DuplicateEmailException; -import com.ourmenu.backend.domain.user.exception.NotMatchTokenException; -import com.ourmenu.backend.domain.user.exception.PasswordNotMatchException; -import com.ourmenu.backend.domain.user.exception.UserNotFoundException; +import com.ourmenu.backend.domain.user.exception.*; import com.ourmenu.backend.global.util.JwtTokenProvider; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; @@ -68,6 +65,11 @@ public String signUp(SignUpRequest signUpRequest) { .build(); mealTimes.add(newMealTime); } + + if (mealTimes.isEmpty() || mealTimes.size() > 4){ + throw new InvalidMealTimeCountException(); + } + mealTimeRepository.saveAll(mealTimes); return "OK"; @@ -149,6 +151,10 @@ public String changeMealTime(MealTimeRequest request, CustomUserDetails userDeta updatedMealTimes.add(newMealTime); } + if (updatedMealTimes.isEmpty() || updatedMealTimes.size() > 4){ + throw new InvalidMealTimeCountException(); + } + mealTimeRepository.saveAll(updatedMealTimes); return "OK"; } diff --git a/src/main/java/com/ourmenu/backend/domain/user/exception/InvalidMealTimeCountException.java b/src/main/java/com/ourmenu/backend/domain/user/exception/InvalidMealTimeCountException.java new file mode 100644 index 0000000..36ba9ba --- /dev/null +++ b/src/main/java/com/ourmenu/backend/domain/user/exception/InvalidMealTimeCountException.java @@ -0,0 +1,11 @@ +package com.ourmenu.backend.domain.user.exception; + +import com.ourmenu.backend.global.exception.CustomException; +import com.ourmenu.backend.global.exception.ErrorCode; + +public class InvalidMealTimeCountException extends CustomException { + + public InvalidMealTimeCountException(){ + super(ErrorCode.INVALID_MEAL_TIME_COUNT); + } +} diff --git a/src/main/java/com/ourmenu/backend/global/exception/ErrorCode.java b/src/main/java/com/ourmenu/backend/global/exception/ErrorCode.java index 2951092..0c63d51 100644 --- a/src/main/java/com/ourmenu/backend/global/exception/ErrorCode.java +++ b/src/main/java/com/ourmenu/backend/global/exception/ErrorCode.java @@ -19,6 +19,7 @@ public enum ErrorCode { PASSWORD_NOT_MATCH(HttpStatus.UNAUTHORIZED, "U401", "비밀번호가 일치하지 않습니다."), DUPLICATE_EMAIL(HttpStatus.CONFLICT, "U409", "이미 존재하는 이메일입니다."), NOT_MATCH_TOKEN(HttpStatus.UNAUTHORIZED, "U401", "유저의 토큰값과 일치하지 않습니다."), + INVALID_MEAL_TIME_COUNT(HttpStatus.BAD_REQUEST, "U400", "식사시간 배열의 크기가 유효하지 않습니다."), // 메뉴판 FORBIDDEN_MENU_FOLDER(HttpStatus.FORBIDDEN, "F403", "소유하고 있는 메뉴판이 아닙니다"), From c9b28997febd314b4cbbfd8976c146938a11b43c Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Tue, 21 Jan 2025 22:50:25 +0900 Subject: [PATCH 02/25] =?UTF-8?q?feat:=20=EC=9C=A0=EC=A0=80=20API=20?= =?UTF-8?q?=EC=98=88=EC=99=B8=EC=B2=98=EB=A6=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/CustomUserDetailsService.java | 6 ++--- .../domain/user/application/EmailService.java | 26 ++++++++----------- .../domain/user/application/UserService.java | 10 +++---- .../ConfirmCodeNotFoundException.java | 11 ++++++++ .../NotMatchConfirmCodeException.java | 11 ++++++++ ...on.java => NotMatchPasswordException.java} | 6 ++--- .../exception/SendCodeFailureException.java | 11 ++++++++ .../user/exception/TokenExpiredExcpetion.java | 11 ++++++++ .../backend/global/exception/ErrorCode.java | 6 ++++- 9 files changed, 71 insertions(+), 27 deletions(-) create mode 100644 src/main/java/com/ourmenu/backend/domain/user/exception/ConfirmCodeNotFoundException.java create mode 100644 src/main/java/com/ourmenu/backend/domain/user/exception/NotMatchConfirmCodeException.java rename src/main/java/com/ourmenu/backend/domain/user/exception/{PasswordNotMatchException.java => NotMatchPasswordException.java} (54%) create mode 100644 src/main/java/com/ourmenu/backend/domain/user/exception/SendCodeFailureException.java create mode 100644 src/main/java/com/ourmenu/backend/domain/user/exception/TokenExpiredExcpetion.java diff --git a/src/main/java/com/ourmenu/backend/domain/user/application/CustomUserDetailsService.java b/src/main/java/com/ourmenu/backend/domain/user/application/CustomUserDetailsService.java index 51a0d6a..d402b33 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/application/CustomUserDetailsService.java +++ b/src/main/java/com/ourmenu/backend/domain/user/application/CustomUserDetailsService.java @@ -3,6 +3,7 @@ import com.ourmenu.backend.domain.user.dao.UserRepository; import com.ourmenu.backend.domain.user.domain.User; import com.ourmenu.backend.domain.user.domain.CustomUserDetails; +import com.ourmenu.backend.domain.user.exception.UserNotFoundException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.security.core.userdetails.UserDetails; @@ -20,9 +21,8 @@ public class CustomUserDetailsService implements UserDetailsService { @Override public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException { - User user= userRepository.findByEmail(email).orElseThrow( - () -> new RuntimeException("Not Found Account") - ); + User user= userRepository.findByEmail(email). + orElseThrow(UserNotFoundException::new); return new CustomUserDetails( user.getId(), diff --git a/src/main/java/com/ourmenu/backend/domain/user/application/EmailService.java b/src/main/java/com/ourmenu/backend/domain/user/application/EmailService.java index bdebd31..a078926 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/application/EmailService.java +++ b/src/main/java/com/ourmenu/backend/domain/user/application/EmailService.java @@ -5,6 +5,9 @@ import com.ourmenu.backend.domain.user.dto.request.EmailRequest; import com.ourmenu.backend.domain.user.dto.response.EmailResponse; import com.ourmenu.backend.domain.user.dto.request.VerifyEmailRequest; +import com.ourmenu.backend.domain.user.exception.ConfirmCodeNotFoundException; +import com.ourmenu.backend.domain.user.exception.NotMatchConfirmCodeException; +import com.ourmenu.backend.domain.user.exception.SendCodeFailureException; import jakarta.mail.MessagingException; import jakarta.mail.internet.MimeMessage; import lombok.RequiredArgsConstructor; @@ -31,15 +34,10 @@ public void sendEmail(String toEmail, String title, String content) throws Messa helper.setSubject(title); helper.setText(content, true); helper.setReplyTo("ourmenuv2@gmail.com"); - try { - emailSender.send(message); - } catch (RuntimeException e) { - e.printStackTrace(); - throw new RuntimeException("Unable to send email in sendEmail", e); - } + emailSender.send(message); } - public EmailResponse sendCodeToEmail(EmailRequest request) { + public EmailResponse sendCodeToEmail(EmailRequest request){ String email = request.getEmail(); String title = "아워메뉴 이메일 인증 번호"; String generatedRandomCode = generateRandomCode(CONFIRM_CODE_LENGTH); @@ -50,21 +48,19 @@ public EmailResponse sendCodeToEmail(EmailRequest request) { + "" + ""; + try { sendEmail(email, title, content); - } catch (RuntimeException | MessagingException e) { - e.printStackTrace(); - throw new RuntimeException("Unable to send email in sendCodeToEmail", e); + }catch (MessagingException e){ + throw new SendCodeFailureException(); } ConfirmCode confirmCode = ConfirmCode.of(email, generatedRandomCode); confirmCodeRepository.save(confirmCode); - EmailResponse response = EmailResponse.builder() + return EmailResponse.builder() .code(generatedRandomCode) .build(); - - return response; } public String generateRandomCode(int length) { @@ -87,10 +83,10 @@ public String verifyConfirmCode(VerifyEmailRequest request){ log.error("{},{}", email, inputConfirmCode); ConfirmCode confirmCode = confirmCodeRepository.findConfirmCodeByEmail(email) - .orElseThrow(() -> new RuntimeException("ConfirmCode not found")); + .orElseThrow(ConfirmCodeNotFoundException::new); if (!confirmCode.getConfirmCode().equals(inputConfirmCode)) { - throw new IllegalArgumentException("Confirmation code does not match."); + throw new NotMatchConfirmCodeException(); } return "OK"; diff --git a/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java b/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java index 3d9229c..f571fec 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java +++ b/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java @@ -88,7 +88,7 @@ public TokenDto signIn(SignInRequest signInRequest, HttpServletResponse response ); if(!passwordEncoder.matches(signInRequest.getPassword(), user.getPassword())) { - throw new PasswordNotMatchException(); + throw new NotMatchPasswordException(); } TokenDto tokenDto = jwtTokenProvider.createAllToken(signInRequest.getEmail()); @@ -122,7 +122,7 @@ public String changePassword(PasswordRequest request, CustomUserDetails userDeta String encodedPassword = userDetails.getPassword(); if (!passwordEncoder.matches(rawPassword, encodedPassword)) { - throw new PasswordNotMatchException(); + throw new NotMatchPasswordException(); } User user = userRepository.findById(userDetails.getId()) @@ -161,7 +161,7 @@ public String changeMealTime(MealTimeRequest request, CustomUserDetails userDeta public UserDto getUserInfo(CustomUserDetails userDetails) { User user = userRepository.findById(userDetails.getId()) - .orElseThrow(() -> new UserNotFoundException()); + .orElseThrow(UserNotFoundException::new); return UserDto.of(user); } @@ -171,11 +171,11 @@ public TokenDto reissueToken(ReissueToken reissueToken) { String email = jwtTokenProvider.getEmailFromToken(refreshToken); if (!jwtTokenProvider.tokenValidation(refreshToken)) { - throw new RuntimeException(); + throw new TokenExpiredExcpetion(); } RefreshToken storedToken = refreshTokenRepository.findRefreshTokenByEmail(email) - .orElseThrow(() -> new NotMatchTokenException()); + .orElseThrow(NotMatchTokenException::new); String newAccessToken = jwtTokenProvider.createToken(email, "Access"); diff --git a/src/main/java/com/ourmenu/backend/domain/user/exception/ConfirmCodeNotFoundException.java b/src/main/java/com/ourmenu/backend/domain/user/exception/ConfirmCodeNotFoundException.java new file mode 100644 index 0000000..9bba1a4 --- /dev/null +++ b/src/main/java/com/ourmenu/backend/domain/user/exception/ConfirmCodeNotFoundException.java @@ -0,0 +1,11 @@ +package com.ourmenu.backend.domain.user.exception; + +import com.ourmenu.backend.global.exception.CustomException; +import com.ourmenu.backend.global.exception.ErrorCode; + +public class ConfirmCodeNotFoundException extends CustomException { + + public ConfirmCodeNotFoundException(){ + super(ErrorCode.CONFIRM_CODE_NOT_FOUND); + } +} diff --git a/src/main/java/com/ourmenu/backend/domain/user/exception/NotMatchConfirmCodeException.java b/src/main/java/com/ourmenu/backend/domain/user/exception/NotMatchConfirmCodeException.java new file mode 100644 index 0000000..0181343 --- /dev/null +++ b/src/main/java/com/ourmenu/backend/domain/user/exception/NotMatchConfirmCodeException.java @@ -0,0 +1,11 @@ +package com.ourmenu.backend.domain.user.exception; + +import com.ourmenu.backend.global.exception.CustomException; +import com.ourmenu.backend.global.exception.ErrorCode; + +public class NotMatchConfirmCodeException extends CustomException { + + public NotMatchConfirmCodeException(){ + super(ErrorCode.NOT_MATCH_CONFIRM_CODE); + } +} diff --git a/src/main/java/com/ourmenu/backend/domain/user/exception/PasswordNotMatchException.java b/src/main/java/com/ourmenu/backend/domain/user/exception/NotMatchPasswordException.java similarity index 54% rename from src/main/java/com/ourmenu/backend/domain/user/exception/PasswordNotMatchException.java rename to src/main/java/com/ourmenu/backend/domain/user/exception/NotMatchPasswordException.java index 1b2346d..a1e92de 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/exception/PasswordNotMatchException.java +++ b/src/main/java/com/ourmenu/backend/domain/user/exception/NotMatchPasswordException.java @@ -3,9 +3,9 @@ import com.ourmenu.backend.global.exception.CustomException; import com.ourmenu.backend.global.exception.ErrorCode; -public class PasswordNotMatchException extends CustomException { +public class NotMatchPasswordException extends CustomException { - public PasswordNotMatchException(){ - super(ErrorCode.PASSWORD_NOT_MATCH); + public NotMatchPasswordException(){ + super(ErrorCode.NOT_MATCH_PASSWORD); } } diff --git a/src/main/java/com/ourmenu/backend/domain/user/exception/SendCodeFailureException.java b/src/main/java/com/ourmenu/backend/domain/user/exception/SendCodeFailureException.java new file mode 100644 index 0000000..c6dd3b3 --- /dev/null +++ b/src/main/java/com/ourmenu/backend/domain/user/exception/SendCodeFailureException.java @@ -0,0 +1,11 @@ +package com.ourmenu.backend.domain.user.exception; + +import com.ourmenu.backend.global.exception.CustomException; +import com.ourmenu.backend.global.exception.ErrorCode; + +public class SendCodeFailureException extends CustomException { + + public SendCodeFailureException(){ + super(ErrorCode.SEND_CODE_FAILURE); + } +} diff --git a/src/main/java/com/ourmenu/backend/domain/user/exception/TokenExpiredExcpetion.java b/src/main/java/com/ourmenu/backend/domain/user/exception/TokenExpiredExcpetion.java new file mode 100644 index 0000000..2bf9973 --- /dev/null +++ b/src/main/java/com/ourmenu/backend/domain/user/exception/TokenExpiredExcpetion.java @@ -0,0 +1,11 @@ +package com.ourmenu.backend.domain.user.exception; + +import com.ourmenu.backend.global.exception.CustomException; +import com.ourmenu.backend.global.exception.ErrorCode; + +public class TokenExpiredExcpetion extends CustomException { + + public TokenExpiredExcpetion(){ + super(ErrorCode.TOKEN_EXPIRED); + } +} diff --git a/src/main/java/com/ourmenu/backend/global/exception/ErrorCode.java b/src/main/java/com/ourmenu/backend/global/exception/ErrorCode.java index 0c63d51..e7c63db 100644 --- a/src/main/java/com/ourmenu/backend/global/exception/ErrorCode.java +++ b/src/main/java/com/ourmenu/backend/global/exception/ErrorCode.java @@ -16,10 +16,14 @@ public enum ErrorCode { // 유저 USER_NOT_FOUND(HttpStatus.NOT_FOUND, "U404", "해당 유저가 존재하지 않습니다."), - PASSWORD_NOT_MATCH(HttpStatus.UNAUTHORIZED, "U401", "비밀번호가 일치하지 않습니다."), + NOT_MATCH_PASSWORD(HttpStatus.UNAUTHORIZED, "U401", "비밀번호가 일치하지 않습니다."), DUPLICATE_EMAIL(HttpStatus.CONFLICT, "U409", "이미 존재하는 이메일입니다."), NOT_MATCH_TOKEN(HttpStatus.UNAUTHORIZED, "U401", "유저의 토큰값과 일치하지 않습니다."), INVALID_MEAL_TIME_COUNT(HttpStatus.BAD_REQUEST, "U400", "식사시간 배열의 크기가 유효하지 않습니다."), + CONFIRM_CODE_NOT_FOUND(HttpStatus.NOT_FOUND, "U404", "인증 코드가 존재하지 않습니다."), + NOT_MATCH_CONFIRM_CODE(HttpStatus.UNAUTHORIZED, "U401", "인증 코드가 일치하지 않습니다."), + TOKEN_EXPIRED(HttpStatus.UNAUTHORIZED, "U401", "JWT 토큰의 유효 기간이 만료되었습니다."), + SEND_CODE_FAILURE(HttpStatus.INTERNAL_SERVER_ERROR, "U500", "이메일 인증 코드 전송에 실패하였습니다."), // 메뉴판 FORBIDDEN_MENU_FOLDER(HttpStatus.FORBIDDEN, "F403", "소유하고 있는 메뉴판이 아닙니다"), From 4d53194dab5945ca26c271c2dbff23cb11bce74d Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Tue, 21 Jan 2025 23:09:01 +0900 Subject: [PATCH 03/25] =?UTF-8?q?fix:=20Response=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/user/api/EmailController.java | 6 +++--- .../domain/user/api/UserController.java | 18 +++++++++--------- .../domain/user/application/EmailService.java | 6 +----- .../domain/user/application/UserService.java | 9 +++------ 4 files changed, 16 insertions(+), 23 deletions(-) diff --git a/src/main/java/com/ourmenu/backend/domain/user/api/EmailController.java b/src/main/java/com/ourmenu/backend/domain/user/api/EmailController.java index 3997163..061e483 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/api/EmailController.java +++ b/src/main/java/com/ourmenu/backend/domain/user/api/EmailController.java @@ -27,8 +27,8 @@ private ApiResponse sendConfirmCode(@Valid @RequestBody EmailRequ } @PostMapping("/confirm-code") - private ApiResponse verifyEmail(@Valid @RequestBody VerifyEmailRequest request){ - String response = emailService.verifyConfirmCode(request); - return ApiUtil.success(response); + private ApiResponse verifyEmail(@Valid @RequestBody VerifyEmailRequest request){ + emailService.verifyConfirmCode(request); + return ApiUtil.successOnly(); } } diff --git a/src/main/java/com/ourmenu/backend/domain/user/api/UserController.java b/src/main/java/com/ourmenu/backend/domain/user/api/UserController.java index 565e7ac..685b4e6 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/api/UserController.java +++ b/src/main/java/com/ourmenu/backend/domain/user/api/UserController.java @@ -30,9 +30,9 @@ public class UserController { * @return */ @PostMapping("/sign-up") - private ApiResponse signUp(@Valid @RequestBody SignUpRequest signUpRequest){ - String response = userService.signUp(signUpRequest); - return ApiUtil.success(response); + private ApiResponse signUp(@Valid @RequestBody SignUpRequest signUpRequest){ + userService.signUp(signUpRequest); + return ApiUtil.successOnly(); } /** @@ -48,15 +48,15 @@ private ApiResponse signIn(@Valid @RequestBody SignInRequest request, } @PatchMapping("/password") - private ApiResponse changePassword(@Valid @RequestBody PasswordRequest request, @AuthenticationPrincipal CustomUserDetails userDetails){ - String response = userService.changePassword(request, userDetails); - return ApiUtil.success(response); + private ApiResponse changePassword(@Valid @RequestBody PasswordRequest request, @AuthenticationPrincipal CustomUserDetails userDetails){ + userService.changePassword(request, userDetails); + return ApiUtil.successOnly(); } @PatchMapping("/meal-time") - private ApiResponse changeMealTime(@Valid @RequestBody MealTimeRequest request, @AuthenticationPrincipal CustomUserDetails userDetails){ - String response = userService.changeMealTime(request, userDetails); - return ApiUtil.success(response); + private ApiResponse changeMealTime(@Valid @RequestBody MealTimeRequest request, @AuthenticationPrincipal CustomUserDetails userDetails){ + userService.changeMealTime(request, userDetails); + return ApiUtil.successOnly(); } @GetMapping("") diff --git a/src/main/java/com/ourmenu/backend/domain/user/application/EmailService.java b/src/main/java/com/ourmenu/backend/domain/user/application/EmailService.java index a078926..df0572a 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/application/EmailService.java +++ b/src/main/java/com/ourmenu/backend/domain/user/application/EmailService.java @@ -76,20 +76,16 @@ public String generateRandomCode(int length) { return confirmCode.toString(); } - public String verifyConfirmCode(VerifyEmailRequest request){ + public void verifyConfirmCode(VerifyEmailRequest request){ String email = request.getEmail(); String inputConfirmCode = request.getConfirmCode(); - log.error("{},{}", email, inputConfirmCode); - ConfirmCode confirmCode = confirmCodeRepository.findConfirmCodeByEmail(email) .orElseThrow(ConfirmCodeNotFoundException::new); if (!confirmCode.getConfirmCode().equals(inputConfirmCode)) { throw new NotMatchConfirmCodeException(); } - - return "OK"; } } diff --git a/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java b/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java index f571fec..165218d 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java +++ b/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java @@ -41,7 +41,7 @@ public class UserService { * @param signUpRequest User의 Email, Password, SignInType, MealTime 정보를 가진 Request * @return 회원가입 완료 */ - public String signUp(SignUpRequest signUpRequest) { + public void signUp(SignUpRequest signUpRequest) { if(userRepository.findByEmail(signUpRequest.getEmail()).isPresent()){ throw new DuplicateEmailException(); @@ -72,7 +72,6 @@ public String signUp(SignUpRequest signUpRequest) { mealTimeRepository.saveAll(mealTimes); - return "OK"; } /** @@ -117,7 +116,7 @@ private void setHeader(HttpServletResponse response, TokenDto tokenDto) { response.addHeader(JwtTokenProvider.REFRESH_TOKEN, tokenDto.getRefreshToken()); } - public String changePassword(PasswordRequest request, CustomUserDetails userDetails) { + public void changePassword(PasswordRequest request, CustomUserDetails userDetails) { String rawPassword = request.password(); String encodedPassword = userDetails.getPassword(); @@ -131,11 +130,10 @@ public String changePassword(PasswordRequest request, CustomUserDetails userDeta String newPassword = passwordEncoder.encode(request.newPassword()); user.changePassword(newPassword); userRepository.save(user); - return "OK"; } @Transactional - public String changeMealTime(MealTimeRequest request, CustomUserDetails userDetails) { + public void changeMealTime(MealTimeRequest request, CustomUserDetails userDetails) { log.debug("{}", userDetails.getId()); mealTimeRepository.deleteAllByUserId(userDetails.getId()); @@ -156,7 +154,6 @@ public String changeMealTime(MealTimeRequest request, CustomUserDetails userDeta } mealTimeRepository.saveAll(updatedMealTimes); - return "OK"; } public UserDto getUserInfo(CustomUserDetails userDetails) { From 6487981c46bbe7b424fdd79a6ebc30fe08985639 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Wed, 22 Jan 2025 00:40:07 +0900 Subject: [PATCH 04/25] =?UTF-8?q?remove:=20SignOutFilter=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/global/filter/SignOutFilter.java | 44 ------------------- 1 file changed, 44 deletions(-) delete mode 100644 src/main/java/com/ourmenu/backend/global/filter/SignOutFilter.java diff --git a/src/main/java/com/ourmenu/backend/global/filter/SignOutFilter.java b/src/main/java/com/ourmenu/backend/global/filter/SignOutFilter.java deleted file mode 100644 index 01284d4..0000000 --- a/src/main/java/com/ourmenu/backend/global/filter/SignOutFilter.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.ourmenu.backend.global.filter; - -import com.ourmenu.backend.domain.user.dao.RefreshTokenRepository; -import com.ourmenu.backend.global.util.JwtTokenProvider; -import jakarta.servlet.FilterChain; -import jakarta.servlet.ServletException; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Component; -import org.springframework.web.filter.OncePerRequestFilter; - -import java.io.IOException; - -@Component -@RequiredArgsConstructor -public class SignOutFilter extends OncePerRequestFilter { - - private final JwtTokenProvider jwtTokenProvider; - private final RefreshTokenRepository refreshTokenRepository; - - @Override - protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { - if ("/api/sign-out".equals(request.getRequestURI()) && "POST".equalsIgnoreCase(request.getMethod())) { - String token = request.getHeader("Authorization"); - - if (token != null && token.startsWith("Bearer ")) { - token = token.substring(7); - String email = jwtTokenProvider.getEmailFromToken(token); - - refreshTokenRepository.findRefreshTokenByEmail(email) - .ifPresent(refreshToken -> refreshTokenRepository.delete(refreshToken)); - - response.setStatus(HttpServletResponse.SC_OK); - return; - } - - response.setStatus(HttpServletResponse.SC_BAD_REQUEST); - return; - } - - filterChain.doFilter(request, response); - } -} From 65cec67527f27ebaf80493b0ee463c8abaa0fed8 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Wed, 22 Jan 2025 00:41:48 +0900 Subject: [PATCH 05/25] =?UTF-8?q?feat:=20Security=20RequestMatch=20?= =?UTF-8?q?=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ourmenu/backend/global/config/SecurityConfig.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/ourmenu/backend/global/config/SecurityConfig.java b/src/main/java/com/ourmenu/backend/global/config/SecurityConfig.java index 402e52f..9f29ebf 100644 --- a/src/main/java/com/ourmenu/backend/global/config/SecurityConfig.java +++ b/src/main/java/com/ourmenu/backend/global/config/SecurityConfig.java @@ -2,7 +2,6 @@ import com.ourmenu.backend.domain.user.dao.RefreshTokenRepository; import com.ourmenu.backend.global.filter.JwtAuthenticationFilter; -import com.ourmenu.backend.global.filter.SignOutFilter; import com.ourmenu.backend.global.util.JwtTokenProvider; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Bean; @@ -34,11 +33,12 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { .formLogin(AbstractHttpConfigurer::disable) .sessionManagement(sessionManagementConfigurer -> sessionManagementConfigurer.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) + .logout(AbstractHttpConfigurer::disable) .authorizeHttpRequests(authorize -> authorize - .requestMatchers("/api/users").permitAll() - .anyRequest().permitAll()) // 테스트 용도로 우선 모든 경로 허용 + .requestMatchers("/api/users/sign-up", "/api/users/sign-in", "/api/users/reissue-token").permitAll() + .requestMatchers("/api/emails/**").permitAll() + .anyRequest().authenticated()) .addFilterBefore(new JwtAuthenticationFilter(jwtTokenProvider), UsernamePasswordAuthenticationFilter.class) - .addFilterBefore(new SignOutFilter(jwtTokenProvider, refreshTokenRepository), JwtAuthenticationFilter.class) .build(); } From e7cc350e5328febd6a9bb857ae03efa1d1f977a7 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Wed, 22 Jan 2025 00:42:29 +0900 Subject: [PATCH 06/25] =?UTF-8?q?feat:=20=EB=A1=9C=EA=B7=B8=EC=95=84?= =?UTF-8?q?=EC=9B=83=20API=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/domain/user/api/UserController.java | 5 +++-- .../domain/user/application/UserService.java | 13 +++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/ourmenu/backend/domain/user/api/UserController.java b/src/main/java/com/ourmenu/backend/domain/user/api/UserController.java index 685b4e6..accd0db 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/api/UserController.java +++ b/src/main/java/com/ourmenu/backend/domain/user/api/UserController.java @@ -66,8 +66,9 @@ private ApiResponse getUserInfo(@AuthenticationPrincipal CustomUserDeta } @PostMapping("/sign-out") - private ApiResponse signOut(){ - return ApiUtil.success("OK"); + private ApiResponse signOut(HttpServletRequest request, @AuthenticationPrincipal CustomUserDetails userDetails){ + userService.signOut(request, userDetails.getId()); + return ApiUtil.successOnly(); } @PostMapping("/reissue-token") diff --git a/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java b/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java index 165218d..4df2b26 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java +++ b/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java @@ -13,6 +13,7 @@ import com.ourmenu.backend.domain.user.dto.response.UserDto; import com.ourmenu.backend.domain.user.exception.*; import com.ourmenu.backend.global.util.JwtTokenProvider; +import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -192,4 +193,16 @@ public TokenDto reissueToken(ReissueToken reissueToken) { .build(); } + public void signOut(HttpServletRequest request, Long userId){ + String token = request.getHeader("Authorization"); + + log.info("{}", token); + if (token != null && token.startsWith("Bearer ")) { + token = token.substring(7); + String email = jwtTokenProvider.getEmailFromToken(token); + + refreshTokenRepository.findRefreshTokenByEmail(email) + .ifPresent(refreshTokenRepository::delete); + } + } } From 615cd7937703547a12a785a09d33f1b18bbde07f Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Wed, 22 Jan 2025 00:43:32 +0900 Subject: [PATCH 07/25] =?UTF-8?q?feat:=20Reissue=20=EA=B2=80=EC=A6=9D=20?= =?UTF-8?q?=EB=B0=8F=20=EC=98=88=EC=99=B8=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/domain/user/api/UserController.java | 1 + .../backend/domain/user/application/UserService.java | 5 ++++- .../domain/user/exception/InvalidTokenException.java | 11 +++++++++++ .../ourmenu/backend/global/exception/ErrorCode.java | 1 + 4 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/ourmenu/backend/domain/user/exception/InvalidTokenException.java diff --git a/src/main/java/com/ourmenu/backend/domain/user/api/UserController.java b/src/main/java/com/ourmenu/backend/domain/user/api/UserController.java index accd0db..627c972 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/api/UserController.java +++ b/src/main/java/com/ourmenu/backend/domain/user/api/UserController.java @@ -11,6 +11,7 @@ import com.ourmenu.backend.domain.user.dto.request.SignUpRequest; import com.ourmenu.backend.global.response.ApiResponse; import com.ourmenu.backend.global.response.util.ApiUtil; +import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java b/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java index 4df2b26..4009e72 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java +++ b/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java @@ -168,6 +168,10 @@ public TokenDto reissueToken(ReissueToken reissueToken) { String refreshToken = reissueToken.getRefreshToken(); String email = jwtTokenProvider.getEmailFromToken(refreshToken); + if (email.isEmpty()){ + throw new InvalidTokenException(); + } + if (!jwtTokenProvider.tokenValidation(refreshToken)) { throw new TokenExpiredExcpetion(); } @@ -175,7 +179,6 @@ public TokenDto reissueToken(ReissueToken reissueToken) { RefreshToken storedToken = refreshTokenRepository.findRefreshTokenByEmail(email) .orElseThrow(NotMatchTokenException::new); - String newAccessToken = jwtTokenProvider.createToken(email, "Access"); String newRefreshToken = reissueToken.getRefreshToken(); diff --git a/src/main/java/com/ourmenu/backend/domain/user/exception/InvalidTokenException.java b/src/main/java/com/ourmenu/backend/domain/user/exception/InvalidTokenException.java new file mode 100644 index 0000000..517918d --- /dev/null +++ b/src/main/java/com/ourmenu/backend/domain/user/exception/InvalidTokenException.java @@ -0,0 +1,11 @@ +package com.ourmenu.backend.domain.user.exception; + +import com.ourmenu.backend.global.exception.CustomException; +import com.ourmenu.backend.global.exception.ErrorCode; + +public class InvalidTokenException extends CustomException { + + public InvalidTokenException(){ + super(ErrorCode.INVALID_TOKEN); + } +} diff --git a/src/main/java/com/ourmenu/backend/global/exception/ErrorCode.java b/src/main/java/com/ourmenu/backend/global/exception/ErrorCode.java index e7c63db..aa85bbc 100644 --- a/src/main/java/com/ourmenu/backend/global/exception/ErrorCode.java +++ b/src/main/java/com/ourmenu/backend/global/exception/ErrorCode.java @@ -24,6 +24,7 @@ public enum ErrorCode { NOT_MATCH_CONFIRM_CODE(HttpStatus.UNAUTHORIZED, "U401", "인증 코드가 일치하지 않습니다."), TOKEN_EXPIRED(HttpStatus.UNAUTHORIZED, "U401", "JWT 토큰의 유효 기간이 만료되었습니다."), SEND_CODE_FAILURE(HttpStatus.INTERNAL_SERVER_ERROR, "U500", "이메일 인증 코드 전송에 실패하였습니다."), + INVALID_TOKEN(HttpStatus.UNAUTHORIZED, "U403", "유효하지 않은 토큰입니다."), // 메뉴판 FORBIDDEN_MENU_FOLDER(HttpStatus.FORBIDDEN, "F403", "소유하고 있는 메뉴판이 아닙니다"), From 6ce50c03ce296ee753f259963120c9d22e9ccacd Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Wed, 22 Jan 2025 01:10:39 +0900 Subject: [PATCH 08/25] =?UTF-8?q?refactor:=20=EC=A0=95=EC=A0=81=20?= =?UTF-8?q?=EB=A9=94=EC=86=8C=EB=93=9C=20=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/domain/user/dto/response/TokenDto.java | 9 +++++++++ .../ourmenu/backend/global/util/JwtTokenProvider.java | 9 +-------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/response/TokenDto.java b/src/main/java/com/ourmenu/backend/domain/user/dto/response/TokenDto.java index 82c749d..90e3aee 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dto/response/TokenDto.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dto/response/TokenDto.java @@ -12,4 +12,13 @@ public class TokenDto { private String accessToken; private String refreshToken; private Instant refreshTokenExpiredAt; + + public static TokenDto of(String accessToken, String refreshToken, Instant refreshTokenExpiredAt){ + return TokenDto.builder() + .grantType("Bearer") + .accessToken(accessToken) + .refreshToken(refreshToken) + .refreshTokenExpiredAt(refreshTokenExpiredAt) + .build(); + } } diff --git a/src/main/java/com/ourmenu/backend/global/util/JwtTokenProvider.java b/src/main/java/com/ourmenu/backend/global/util/JwtTokenProvider.java index 2239d6c..a0ebf16 100644 --- a/src/main/java/com/ourmenu/backend/global/util/JwtTokenProvider.java +++ b/src/main/java/com/ourmenu/backend/global/util/JwtTokenProvider.java @@ -92,14 +92,7 @@ public TokenDto createAllToken(String email) { Instant refreshTokenExpiredAt = Instant.now().plus(30, ChronoUnit.DAYS); - TokenDto tokenDto = TokenDto.builder() - .grantType("Bearer") - .accessToken(accessToken) - .refreshToken(refreshToken) - .refreshTokenExpiredAt(refreshTokenExpiredAt) - .build(); - - return tokenDto; + return TokenDto.of(accessToken, refreshToken, refreshTokenExpiredAt); } /** From 9b4afebdb1a98d7c13c94ef5d8af4daebdda65ee Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Wed, 22 Jan 2025 01:10:53 +0900 Subject: [PATCH 09/25] =?UTF-8?q?refactor:=20if=EB=AC=B8=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../filter/JwtAuthenticationFilter.java | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/ourmenu/backend/global/filter/JwtAuthenticationFilter.java b/src/main/java/com/ourmenu/backend/global/filter/JwtAuthenticationFilter.java index 80530f9..e5065c8 100644 --- a/src/main/java/com/ourmenu/backend/global/filter/JwtAuthenticationFilter.java +++ b/src/main/java/com/ourmenu/backend/global/filter/JwtAuthenticationFilter.java @@ -26,20 +26,19 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse String accessToken = jwtTokenProvider.getHeaderToken(request, HttpHeaders.AUTHORIZATION); String refreshToken = jwtTokenProvider.getHeaderToken(request, "Refresh_token"); - if(accessToken != null) { - if(jwtTokenProvider.tokenValidation(accessToken)){ - setAuthentication(jwtTokenProvider.getEmailFromToken(accessToken)); - } - else if (refreshToken != null) { - boolean isRefreshToken = jwtTokenProvider.refreshTokenValidation(refreshToken); - if (isRefreshToken) { - String email = jwtTokenProvider.getEmailFromToken(refreshToken); - String newAccessToken = jwtTokenProvider.createToken(email, "Access"); - - jwtTokenProvider.setHeaderAccessToken(response, newAccessToken); - setAuthentication(jwtTokenProvider.getEmailFromToken(newAccessToken)); - } - } + if(accessToken != null && jwtTokenProvider.tokenValidation(accessToken)) { + setAuthentication(jwtTokenProvider.getEmailFromToken(accessToken)); + filterChain.doFilter(request,response); + return; + } + + if (refreshToken != null && jwtTokenProvider.refreshTokenValidation(refreshToken)) { + String email = jwtTokenProvider.getEmailFromToken(refreshToken); + String newAccessToken = jwtTokenProvider.createToken(email, "Access"); + jwtTokenProvider.setHeaderAccessToken(response, newAccessToken); + setAuthentication(jwtTokenProvider.getEmailFromToken(newAccessToken)); + filterChain.doFilter(request,response); + return; } filterChain.doFilter(request,response); From 4264036ddb1c9f786136a9bf873e53fb929f7e4e Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Wed, 22 Jan 2025 01:11:20 +0900 Subject: [PATCH 10/25] =?UTF-8?q?refactor:=20=EC=82=BC=ED=95=AD=20?= =?UTF-8?q?=EC=97=B0=EC=82=B0=EC=9E=90=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ourmenu/backend/global/util/JwtTokenProvider.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/ourmenu/backend/global/util/JwtTokenProvider.java b/src/main/java/com/ourmenu/backend/global/util/JwtTokenProvider.java index a0ebf16..77219f3 100644 --- a/src/main/java/com/ourmenu/backend/global/util/JwtTokenProvider.java +++ b/src/main/java/com/ourmenu/backend/global/util/JwtTokenProvider.java @@ -108,7 +108,11 @@ public String createToken(String email, String type) { Claims claims = Jwts.claims(); claims.put("email", email); - long time = type.equals("Access") ? ACCESS_TIME : REFRESH_TIME; + long time = ACCESS_TIME; + + if (type.equals("Refresh")){ + time = REFRESH_TIME; + } return Jwts.builder() .setClaims(claims) From 111496e65d1ba78a36936f10d8a0ca268513284b Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Wed, 22 Jan 2025 01:11:45 +0900 Subject: [PATCH 11/25] =?UTF-8?q?rename:=20RefreshToken=20=ED=97=A4?= =?UTF-8?q?=EB=8D=94=20=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ourmenu/backend/global/util/JwtTokenProvider.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/ourmenu/backend/global/util/JwtTokenProvider.java b/src/main/java/com/ourmenu/backend/global/util/JwtTokenProvider.java index 77219f3..08e229c 100644 --- a/src/main/java/com/ourmenu/backend/global/util/JwtTokenProvider.java +++ b/src/main/java/com/ourmenu/backend/global/util/JwtTokenProvider.java @@ -42,7 +42,7 @@ public class JwtTokenProvider { private static final long ACCESS_TIME = 60 * 60 * 1000L; // 1시간 private static final long REFRESH_TIME = 30 * 24 * 60 * 60 * 1000L; // 30일 public static final String ACCESS_TOKEN = "Authorization"; - public static final String REFRESH_TOKEN = "Refresh_Token"; + public static final String REFRESH_TOKEN = "Refresh-Token"; private final CustomUserDetailsService customUserDetailsService; private final RefreshTokenRepository refreshTokenRepository; From 40423aee8018f150c84c49e56fb637129f7518a6 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Wed, 22 Jan 2025 01:12:08 +0900 Subject: [PATCH 12/25] =?UTF-8?q?fix:=20=EB=94=94=EB=B2=84=EA=B9=85?= =?UTF-8?q?=EC=9A=A9=20=EB=A1=9C=EA=B7=B8=20=EC=A0=9C=EA=B1=B0=20=EB=B0=8F?= =?UTF-8?q?=20=EC=98=88=EC=99=B8=EC=B2=98=EB=A6=AC=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ourmenu/backend/global/util/JwtTokenProvider.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/ourmenu/backend/global/util/JwtTokenProvider.java b/src/main/java/com/ourmenu/backend/global/util/JwtTokenProvider.java index 08e229c..2193903 100644 --- a/src/main/java/com/ourmenu/backend/global/util/JwtTokenProvider.java +++ b/src/main/java/com/ourmenu/backend/global/util/JwtTokenProvider.java @@ -4,6 +4,7 @@ import com.ourmenu.backend.domain.user.dao.RefreshTokenRepository; import com.ourmenu.backend.domain.user.domain.RefreshToken; import com.ourmenu.backend.domain.user.dto.response.TokenDto; +import com.ourmenu.backend.domain.user.exception.InvalidTokenException; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; @@ -132,7 +133,6 @@ public Boolean tokenValidation(String token) { Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token); return true; } catch (Exception ex) { - log.error(ex.getMessage()); return false; } } @@ -202,8 +202,7 @@ public Date getExpiredAt(String token) { .getBody() .getExpiration(); // Claims에서 만료 시간 추출 } catch (Exception e) { - log.error("Failed to get expiration time from token: {}", e.getMessage()); - throw new IllegalArgumentException("Invalid token", e); + throw new InvalidTokenException(); } } From 069adb37075b03b7232755cfbd9c998b9e8e85b8 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Wed, 22 Jan 2025 01:18:27 +0900 Subject: [PATCH 13/25] =?UTF-8?q?fix:=20User=20DTO=20@Data=20=EC=96=B4?= =?UTF-8?q?=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=20=EB=B3=80=EA=B2=BD=20?= =?UTF-8?q?=EB=B0=8F=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/user/application/UserService.java | 8 ++++---- .../domain/user/dto/request/EmailRequest.java | 4 ---- .../user/dto/request/MealTimeRequest.java | 6 +++++- .../user/dto/request/PasswordRequest.java | 10 +++++++++- .../domain/user/dto/request/SignInRequest.java | 6 ++---- .../domain/user/dto/request/SignUpRequest.java | 6 ++---- .../user/dto/request/VerifyEmailRequest.java | 6 ------ .../domain/user/dto/response/EmailResponse.java | 2 -- .../user/dto/response/SignUpResponse.java | 17 ----------------- .../domain/user/dto/response/TokenDto.java | 4 ++-- .../domain/user/dto/response/UserDto.java | 2 +- 11 files changed, 25 insertions(+), 46 deletions(-) delete mode 100644 src/main/java/com/ourmenu/backend/domain/user/dto/response/SignUpResponse.java diff --git a/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java b/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java index 4009e72..191a19e 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java +++ b/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java @@ -118,7 +118,7 @@ private void setHeader(HttpServletResponse response, TokenDto tokenDto) { } public void changePassword(PasswordRequest request, CustomUserDetails userDetails) { - String rawPassword = request.password(); + String rawPassword = request.getPassword(); String encodedPassword = userDetails.getPassword(); if (!passwordEncoder.matches(rawPassword, encodedPassword)) { @@ -128,7 +128,7 @@ public void changePassword(PasswordRequest request, CustomUserDetails userDetail User user = userRepository.findById(userDetails.getId()) .orElseThrow(UserNotFoundException::new); - String newPassword = passwordEncoder.encode(request.newPassword()); + String newPassword = passwordEncoder.encode(request.getNewPassword()); user.changePassword(newPassword); userRepository.save(user); } @@ -139,7 +139,7 @@ public void changeMealTime(MealTimeRequest request, CustomUserDetails userDetail mealTimeRepository.deleteAllByUserId(userDetails.getId()); - ArrayList newMealTimes = request.mealTime(); + ArrayList newMealTimes = request.getMealTime(); ArrayList updatedMealTimes = new ArrayList<>(); for (String mealTime : newMealTimes) { @@ -161,7 +161,7 @@ public UserDto getUserInfo(CustomUserDetails userDetails) { User user = userRepository.findById(userDetails.getId()) .orElseThrow(UserNotFoundException::new); - return UserDto.of(user); + return UserDto.from(user); } public TokenDto reissueToken(ReissueToken reissueToken) { diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/request/EmailRequest.java b/src/main/java/com/ourmenu/backend/domain/user/dto/request/EmailRequest.java index ad23df4..cfcbe2d 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dto/request/EmailRequest.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dto/request/EmailRequest.java @@ -1,15 +1,11 @@ package com.ourmenu.backend.domain.user.dto.request; import jakarta.validation.constraints.Email; -import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; -import lombok.NoArgsConstructor; @Builder @Getter -@NoArgsConstructor -@AllArgsConstructor public class EmailRequest { @Email diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/request/MealTimeRequest.java b/src/main/java/com/ourmenu/backend/domain/user/dto/request/MealTimeRequest.java index fcfc8fd..4b568f7 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dto/request/MealTimeRequest.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dto/request/MealTimeRequest.java @@ -1,8 +1,12 @@ package com.ourmenu.backend.domain.user.dto.request; import jakarta.validation.constraints.NotEmpty; +import lombok.Getter; import java.util.ArrayList; -public record MealTimeRequest(@NotEmpty ArrayList mealTime) { +@Getter +public class MealTimeRequest { + + @NotEmpty ArrayList mealTime; } diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/request/PasswordRequest.java b/src/main/java/com/ourmenu/backend/domain/user/dto/request/PasswordRequest.java index 76f31d3..1ecb8bb 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dto/request/PasswordRequest.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dto/request/PasswordRequest.java @@ -2,6 +2,14 @@ import jakarta.validation.constraints.NotBlank; +import lombok.Getter; -public record PasswordRequest(@NotBlank String password,@NotBlank String newPassword) { +@Getter +public class PasswordRequest { + + @NotBlank + String password; + + @NotBlank + String newPassword; } diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignInRequest.java b/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignInRequest.java index 9bc02a2..1511dc3 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignInRequest.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignInRequest.java @@ -2,11 +2,9 @@ import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotBlank; -import lombok.Builder; -import lombok.Data; +import lombok.Getter; -@Data -@Builder +@Getter public class SignInRequest { @Email diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignUpRequest.java b/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignUpRequest.java index 9e6bfbe..f2fa9b6 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignUpRequest.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignUpRequest.java @@ -3,13 +3,11 @@ import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotEmpty; -import lombok.AllArgsConstructor; -import lombok.Data; +import lombok.Getter; import java.util.ArrayList; -@Data -@AllArgsConstructor +@Getter public class SignUpRequest { @Email diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/request/VerifyEmailRequest.java b/src/main/java/com/ourmenu/backend/domain/user/dto/request/VerifyEmailRequest.java index 642b160..b81f897 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dto/request/VerifyEmailRequest.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dto/request/VerifyEmailRequest.java @@ -2,15 +2,9 @@ import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotBlank; -import lombok.AllArgsConstructor; -import lombok.Builder; import lombok.Getter; -import lombok.NoArgsConstructor; -@Builder @Getter -@AllArgsConstructor -@NoArgsConstructor public class VerifyEmailRequest { @Email diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/response/EmailResponse.java b/src/main/java/com/ourmenu/backend/domain/user/dto/response/EmailResponse.java index f9d0b07..22cbd3d 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dto/response/EmailResponse.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dto/response/EmailResponse.java @@ -3,11 +3,9 @@ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; -import lombok.NoArgsConstructor; @Builder @Getter -@NoArgsConstructor @AllArgsConstructor public class EmailResponse { private String code; diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/response/SignUpResponse.java b/src/main/java/com/ourmenu/backend/domain/user/dto/response/SignUpResponse.java deleted file mode 100644 index a97865a..0000000 --- a/src/main/java/com/ourmenu/backend/domain/user/dto/response/SignUpResponse.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.ourmenu.backend.domain.user.dto.response; - -import lombok.Builder; -import lombok.Data; - - -@Data -@Builder -public class SignUpResponse { - - private String grantType; - private String accessToken; - private String refreshToken; - private Long accessTokenExpiredAt; - - private Long refreshTokenExpiredAt; -} diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/response/TokenDto.java b/src/main/java/com/ourmenu/backend/domain/user/dto/response/TokenDto.java index 90e3aee..965e8ff 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dto/response/TokenDto.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dto/response/TokenDto.java @@ -1,11 +1,11 @@ package com.ourmenu.backend.domain.user.dto.response; import lombok.Builder; -import lombok.Data; +import lombok.Getter; import java.time.Instant; -@Data +@Getter @Builder public class TokenDto { private String grantType; diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/response/UserDto.java b/src/main/java/com/ourmenu/backend/domain/user/dto/response/UserDto.java index 953ee5b..c59ea76 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dto/response/UserDto.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dto/response/UserDto.java @@ -12,7 +12,7 @@ public class UserDto { private String email; private String signInType; - public static UserDto of(User user){ + public static UserDto from(User user){ return UserDto.builder() .userId(user.getId()) .email(user.getEmail()) From 45fb76021bfaf0342e4092cf5129b775a97d2c9f Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Wed, 22 Jan 2025 01:33:32 +0900 Subject: [PATCH 14/25] =?UTF-8?q?fix:=20MealTime=20=ED=83=80=EC=9E=85=20In?= =?UTF-8?q?teger=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/domain/user/application/UserService.java | 6 +++--- .../com/ourmenu/backend/domain/user/domain/MealTime.java | 2 +- .../backend/domain/user/dto/request/MealTimeRequest.java | 3 +-- .../backend/domain/user/dto/request/SignUpRequest.java | 6 +----- 4 files changed, 6 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java b/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java index 191a19e..7b248a1 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java +++ b/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java @@ -59,7 +59,7 @@ public void signUp(SignUpRequest signUpRequest) { User savedUser = userRepository.save(user); List mealTimes = new ArrayList<>(); - for (String mealTime : signUpRequest.getMealTime()) { + for (Integer mealTime : signUpRequest.getMealTime()) { MealTime newMealTime = MealTime.builder() .userId(savedUser.getId()) .mealTime(mealTime) @@ -139,10 +139,10 @@ public void changeMealTime(MealTimeRequest request, CustomUserDetails userDetail mealTimeRepository.deleteAllByUserId(userDetails.getId()); - ArrayList newMealTimes = request.getMealTime(); + ArrayList newMealTimes = request.getMealTime(); ArrayList updatedMealTimes = new ArrayList<>(); - for (String mealTime : newMealTimes) { + for (Integer mealTime : newMealTimes) { MealTime newMealTime = MealTime.builder() .userId(userDetails.getId()) .mealTime(mealTime) diff --git a/src/main/java/com/ourmenu/backend/domain/user/domain/MealTime.java b/src/main/java/com/ourmenu/backend/domain/user/domain/MealTime.java index a079a2c..c0f7d55 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/domain/MealTime.java +++ b/src/main/java/com/ourmenu/backend/domain/user/domain/MealTime.java @@ -23,5 +23,5 @@ public class MealTime extends BaseEntity { private Long userId; - private String mealTime; + private Integer mealTime; } diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/request/MealTimeRequest.java b/src/main/java/com/ourmenu/backend/domain/user/dto/request/MealTimeRequest.java index 4b568f7..993b5af 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dto/request/MealTimeRequest.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dto/request/MealTimeRequest.java @@ -7,6 +7,5 @@ @Getter public class MealTimeRequest { - - @NotEmpty ArrayList mealTime; + ArrayList mealTime; } diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignUpRequest.java b/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignUpRequest.java index f2fa9b6..1ebb04e 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignUpRequest.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignUpRequest.java @@ -15,10 +15,6 @@ public class SignUpRequest { @NotBlank private String password; - - @NotEmpty - private ArrayList mealTime; - - @NotBlank + private ArrayList mealTime; private String signInType; } From 9b2545798ce3e5c20130bb1565d39ad6e4c9f630 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Wed, 22 Jan 2025 01:34:32 +0900 Subject: [PATCH 15/25] =?UTF-8?q?fix:=20MealTime=20=EC=98=88=EC=99=B8=20?= =?UTF-8?q?=EC=8B=9C=20=EC=9C=A0=EC=A0=80=20=EC=A0=80=EC=9E=A5=20=EC=B7=A8?= =?UTF-8?q?=EC=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ourmenu/backend/domain/user/application/UserService.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java b/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java index 7b248a1..9cef9a7 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java +++ b/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java @@ -55,7 +55,6 @@ public void signUp(SignUpRequest signUpRequest) { .password(encodedPassword) .signInType(SignInType.valueOf(signUpRequest.getSignInType())) .build(); - User savedUser = userRepository.save(user); List mealTimes = new ArrayList<>(); @@ -68,6 +67,7 @@ public void signUp(SignUpRequest signUpRequest) { } if (mealTimes.isEmpty() || mealTimes.size() > 4){ + userRepository.delete(savedUser); throw new InvalidMealTimeCountException(); } @@ -199,7 +199,6 @@ public TokenDto reissueToken(ReissueToken reissueToken) { public void signOut(HttpServletRequest request, Long userId){ String token = request.getHeader("Authorization"); - log.info("{}", token); if (token != null && token.startsWith("Bearer ")) { token = token.substring(7); String email = jwtTokenProvider.getEmailFromToken(token); From 7417a15f6366e75abb5faea5a50be1f7b12de044 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Wed, 22 Jan 2025 01:34:54 +0900 Subject: [PATCH 16/25] =?UTF-8?q?remove:=20validation=20=EC=96=B4=EB=85=B8?= =?UTF-8?q?=ED=85=8C=EC=9D=B4=EC=85=98=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/domain/user/dto/request/EmailRequest.java | 3 --- .../backend/domain/user/dto/request/MealTimeRequest.java | 2 +- .../backend/domain/user/dto/request/PasswordRequest.java | 6 ------ .../backend/domain/user/dto/request/SignInRequest.java | 8 -------- .../backend/domain/user/dto/request/SignUpRequest.java | 7 ------- .../domain/user/dto/request/VerifyEmailRequest.java | 6 ------ 6 files changed, 1 insertion(+), 31 deletions(-) diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/request/EmailRequest.java b/src/main/java/com/ourmenu/backend/domain/user/dto/request/EmailRequest.java index cfcbe2d..4501ccb 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dto/request/EmailRequest.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dto/request/EmailRequest.java @@ -1,13 +1,10 @@ package com.ourmenu.backend.domain.user.dto.request; -import jakarta.validation.constraints.Email; import lombok.Builder; import lombok.Getter; @Builder @Getter public class EmailRequest { - - @Email private String email; } diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/request/MealTimeRequest.java b/src/main/java/com/ourmenu/backend/domain/user/dto/request/MealTimeRequest.java index 993b5af..40d38c0 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dto/request/MealTimeRequest.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dto/request/MealTimeRequest.java @@ -1,6 +1,6 @@ package com.ourmenu.backend.domain.user.dto.request; -import jakarta.validation.constraints.NotEmpty; + import lombok.Getter; import java.util.ArrayList; diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/request/PasswordRequest.java b/src/main/java/com/ourmenu/backend/domain/user/dto/request/PasswordRequest.java index 1ecb8bb..97eac16 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dto/request/PasswordRequest.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dto/request/PasswordRequest.java @@ -1,15 +1,9 @@ package com.ourmenu.backend.domain.user.dto.request; - -import jakarta.validation.constraints.NotBlank; import lombok.Getter; @Getter public class PasswordRequest { - - @NotBlank String password; - - @NotBlank String newPassword; } diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignInRequest.java b/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignInRequest.java index 1511dc3..8334072 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignInRequest.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignInRequest.java @@ -1,18 +1,10 @@ package com.ourmenu.backend.domain.user.dto.request; -import jakarta.validation.constraints.Email; -import jakarta.validation.constraints.NotBlank; import lombok.Getter; @Getter public class SignInRequest { - - @Email private String email; - - @NotBlank private String password; - - @NotBlank private String signInType; } diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignUpRequest.java b/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignUpRequest.java index 1ebb04e..d1f49a4 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignUpRequest.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignUpRequest.java @@ -1,19 +1,12 @@ package com.ourmenu.backend.domain.user.dto.request; -import jakarta.validation.constraints.Email; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotEmpty; import lombok.Getter; import java.util.ArrayList; @Getter public class SignUpRequest { - - @Email private String email; - - @NotBlank private String password; private ArrayList mealTime; private String signInType; diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/request/VerifyEmailRequest.java b/src/main/java/com/ourmenu/backend/domain/user/dto/request/VerifyEmailRequest.java index b81f897..807bcb7 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dto/request/VerifyEmailRequest.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dto/request/VerifyEmailRequest.java @@ -1,15 +1,9 @@ package com.ourmenu.backend.domain.user.dto.request; -import jakarta.validation.constraints.Email; -import jakarta.validation.constraints.NotBlank; import lombok.Getter; @Getter public class VerifyEmailRequest { - - @Email private String email; - - @NotBlank private String confirmCode; } From d48239bb055f3ac7d07602b4ebf564e66bda6d46 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Wed, 22 Jan 2025 23:59:56 +0900 Subject: [PATCH 17/25] =?UTF-8?q?feat:=20=EC=9C=A0=EC=A0=80=20=EC=A0=95?= =?UTF-8?q?=EB=B3=B4=20=EC=A1=B0=ED=9A=8C=20Response=20=EC=8B=9D=EC=82=AC?= =?UTF-8?q?=EC=8B=9C=EA=B0=84=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/domain/user/application/UserService.java | 4 +++- .../backend/domain/user/dao/MealTimeRepository.java | 4 ++++ .../backend/domain/user/dto/response/UserDto.java | 12 +++++++++--- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java b/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java index 9cef9a7..bffb296 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java +++ b/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java @@ -161,7 +161,9 @@ public UserDto getUserInfo(CustomUserDetails userDetails) { User user = userRepository.findById(userDetails.getId()) .orElseThrow(UserNotFoundException::new); - return UserDto.from(user); + List mealTimes = mealTimeRepository.findAllByUserId(userDetails.getId()); + + return UserDto.of(user, mealTimes); } public TokenDto reissueToken(ReissueToken reissueToken) { diff --git a/src/main/java/com/ourmenu/backend/domain/user/dao/MealTimeRepository.java b/src/main/java/com/ourmenu/backend/domain/user/dao/MealTimeRepository.java index 5ea3e3c..5cf2cb7 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dao/MealTimeRepository.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dao/MealTimeRepository.java @@ -3,7 +3,11 @@ import com.ourmenu.backend.domain.user.domain.MealTime; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; + public interface MealTimeRepository extends JpaRepository { void deleteAllByUserId(Long userId); + + List findAllByUserId(Long userId); } diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/response/UserDto.java b/src/main/java/com/ourmenu/backend/domain/user/dto/response/UserDto.java index c59ea76..6e28a22 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dto/response/UserDto.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dto/response/UserDto.java @@ -1,22 +1,28 @@ package com.ourmenu.backend.domain.user.dto.response; +import com.ourmenu.backend.domain.user.domain.MealTime; import com.ourmenu.backend.domain.user.domain.User; import lombok.Builder; import lombok.Getter; +import java.util.List; +import java.util.stream.Collectors; + @Builder @Getter public class UserDto { - private Long userId; private String email; private String signInType; + private List mealTime; - public static UserDto from(User user){ + public static UserDto of(User user, List mealTimes){ return UserDto.builder() - .userId(user.getId()) .email(user.getEmail()) .signInType(user.getSignInType().name()) + .mealTime(mealTimes.stream() + .map(MealTime::getMealTime) + .collect(Collectors.toList())) .build(); } } From e62d88cf077d8859850ac28a8dba0695cfd5fdc0 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Thu, 23 Jan 2025 02:13:31 +0900 Subject: [PATCH 18/25] =?UTF-8?q?rename:=20=ED=86=A0=ED=81=B0=20=EC=9C=A0?= =?UTF-8?q?=ED=9A=A8=20=EA=B2=80=EC=82=AC=20=EB=A9=94=EC=86=8C=EB=93=9C=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/user/application/UserService.java | 4 ++-- .../filter/JwtAuthenticationFilter.java | 2 +- .../backend/global/util/JwtTokenProvider.java | 19 ++++++++++--------- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java b/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java index bffb296..b3c8c8c 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java +++ b/src/main/java/com/ourmenu/backend/domain/user/application/UserService.java @@ -174,7 +174,7 @@ public TokenDto reissueToken(ReissueToken reissueToken) { throw new InvalidTokenException(); } - if (!jwtTokenProvider.tokenValidation(refreshToken)) { + if (!jwtTokenProvider.validateToken(refreshToken)) { throw new TokenExpiredExcpetion(); } @@ -184,7 +184,7 @@ public TokenDto reissueToken(ReissueToken reissueToken) { String newAccessToken = jwtTokenProvider.createToken(email, "Access"); String newRefreshToken = reissueToken.getRefreshToken(); - if (jwtTokenProvider.tokenValidation(refreshToken)) { + if (jwtTokenProvider.validateToken(refreshToken)) { newRefreshToken = jwtTokenProvider.createToken(email, "Refresh"); storedToken.updateToken(newRefreshToken); refreshTokenRepository.save(storedToken); diff --git a/src/main/java/com/ourmenu/backend/global/filter/JwtAuthenticationFilter.java b/src/main/java/com/ourmenu/backend/global/filter/JwtAuthenticationFilter.java index e5065c8..7ff997d 100644 --- a/src/main/java/com/ourmenu/backend/global/filter/JwtAuthenticationFilter.java +++ b/src/main/java/com/ourmenu/backend/global/filter/JwtAuthenticationFilter.java @@ -26,7 +26,7 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse String accessToken = jwtTokenProvider.getHeaderToken(request, HttpHeaders.AUTHORIZATION); String refreshToken = jwtTokenProvider.getHeaderToken(request, "Refresh_token"); - if(accessToken != null && jwtTokenProvider.tokenValidation(accessToken)) { + if(accessToken != null && jwtTokenProvider.validateToken(accessToken)) { setAuthentication(jwtTokenProvider.getEmailFromToken(accessToken)); filterChain.doFilter(request,response); return; diff --git a/src/main/java/com/ourmenu/backend/global/util/JwtTokenProvider.java b/src/main/java/com/ourmenu/backend/global/util/JwtTokenProvider.java index 2193903..3ff9ddf 100644 --- a/src/main/java/com/ourmenu/backend/global/util/JwtTokenProvider.java +++ b/src/main/java/com/ourmenu/backend/global/util/JwtTokenProvider.java @@ -5,9 +5,8 @@ import com.ourmenu.backend.domain.user.domain.RefreshToken; import com.ourmenu.backend.domain.user.dto.response.TokenDto; import com.ourmenu.backend.domain.user.exception.InvalidTokenException; -import io.jsonwebtoken.Claims; -import io.jsonwebtoken.Jwts; -import io.jsonwebtoken.SignatureAlgorithm; +import com.ourmenu.backend.domain.user.exception.TokenExpiredExcpetion; +import io.jsonwebtoken.*; import io.jsonwebtoken.security.Keys; import jakarta.annotation.PostConstruct; import jakarta.servlet.http.HttpServletRequest; @@ -128,12 +127,14 @@ public String createToken(String email, String type) { * @param token JWT 토큰값 * @return Token의 유효 여부(True, False) */ - public Boolean tokenValidation(String token) { + public Boolean validateToken(String token) { try { - Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token); - return true; - } catch (Exception ex) { - return false; + Jws claims = Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token); + return !claims.getBody().getExpiration().before(new Date()); + } catch (ExpiredJwtException e) { + throw new TokenExpiredExcpetion(); + } catch (JwtException e){ + throw new InvalidTokenException(); } } @@ -143,7 +144,7 @@ public Boolean tokenValidation(String token) { * @return RefreshToken 유효 여부 (True, False) */ public Boolean refreshTokenValidation(String token) { - if(!tokenValidation(token)) { + if(!validateToken(token)) { return false; } From 5a92fd7e52ad88ae4c71a81ff3ce474a6cd14b83 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Thu, 23 Jan 2025 02:14:06 +0900 Subject: [PATCH 19/25] =?UTF-8?q?fix:=20Invalid=20Token=20=EC=97=90?= =?UTF-8?q?=EB=9F=AC=EC=BD=94=EB=93=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/ourmenu/backend/global/exception/ErrorCode.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/ourmenu/backend/global/exception/ErrorCode.java b/src/main/java/com/ourmenu/backend/global/exception/ErrorCode.java index aa85bbc..420bfb6 100644 --- a/src/main/java/com/ourmenu/backend/global/exception/ErrorCode.java +++ b/src/main/java/com/ourmenu/backend/global/exception/ErrorCode.java @@ -24,7 +24,7 @@ public enum ErrorCode { NOT_MATCH_CONFIRM_CODE(HttpStatus.UNAUTHORIZED, "U401", "인증 코드가 일치하지 않습니다."), TOKEN_EXPIRED(HttpStatus.UNAUTHORIZED, "U401", "JWT 토큰의 유효 기간이 만료되었습니다."), SEND_CODE_FAILURE(HttpStatus.INTERNAL_SERVER_ERROR, "U500", "이메일 인증 코드 전송에 실패하였습니다."), - INVALID_TOKEN(HttpStatus.UNAUTHORIZED, "U403", "유효하지 않은 토큰입니다."), + INVALID_TOKEN(HttpStatus.UNAUTHORIZED, "U401", "유효하지 않은 토큰입니다."), // 메뉴판 FORBIDDEN_MENU_FOLDER(HttpStatus.FORBIDDEN, "F403", "소유하고 있는 메뉴판이 아닙니다"), From aa3adee0ec36e624fe58306c74398eaa9adefb01 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Thu, 23 Jan 2025 02:14:20 +0900 Subject: [PATCH 20/25] =?UTF-8?q?feat:=20JWT=20Exception=20=ED=95=84?= =?UTF-8?q?=ED=84=B0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/global/config/SecurityConfig.java | 3 ++ .../global/filter/JwtExceptionFilter.java | 47 +++++++++++++++++++ 2 files changed, 50 insertions(+) create mode 100644 src/main/java/com/ourmenu/backend/global/filter/JwtExceptionFilter.java diff --git a/src/main/java/com/ourmenu/backend/global/config/SecurityConfig.java b/src/main/java/com/ourmenu/backend/global/config/SecurityConfig.java index 9f29ebf..02988ea 100644 --- a/src/main/java/com/ourmenu/backend/global/config/SecurityConfig.java +++ b/src/main/java/com/ourmenu/backend/global/config/SecurityConfig.java @@ -2,6 +2,7 @@ import com.ourmenu.backend.domain.user.dao.RefreshTokenRepository; import com.ourmenu.backend.global.filter.JwtAuthenticationFilter; +import com.ourmenu.backend.global.filter.JwtExceptionFilter; import com.ourmenu.backend.global.util.JwtTokenProvider; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Bean; @@ -24,6 +25,7 @@ public class SecurityConfig { private final JwtTokenProvider jwtTokenProvider; private final RefreshTokenRepository refreshTokenRepository; + private final JwtExceptionFilter jwtExceptionFilter; @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { @@ -39,6 +41,7 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { .requestMatchers("/api/emails/**").permitAll() .anyRequest().authenticated()) .addFilterBefore(new JwtAuthenticationFilter(jwtTokenProvider), UsernamePasswordAuthenticationFilter.class) + .addFilterBefore(jwtExceptionFilter, JwtAuthenticationFilter.class) .build(); } diff --git a/src/main/java/com/ourmenu/backend/global/filter/JwtExceptionFilter.java b/src/main/java/com/ourmenu/backend/global/filter/JwtExceptionFilter.java new file mode 100644 index 0000000..e3c12a4 --- /dev/null +++ b/src/main/java/com/ourmenu/backend/global/filter/JwtExceptionFilter.java @@ -0,0 +1,47 @@ +package com.ourmenu.backend.global.filter; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.ourmenu.backend.domain.user.exception.TokenExpiredExcpetion; +import com.ourmenu.backend.global.exception.ErrorCode; +import com.ourmenu.backend.global.exception.ErrorResponse; +import com.ourmenu.backend.global.response.ApiResponse; +import com.ourmenu.backend.global.response.util.ApiUtil; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; + +import java.io.IOException; + +@Slf4j +@RequiredArgsConstructor +@Component +public class JwtExceptionFilter extends OncePerRequestFilter { + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { + try { + chain.doFilter(request, response); + } catch (Exception e) { + if(e.equals(TokenExpiredExcpetion.class)) { + setResponse(response, ApiUtil.error(ErrorResponse.of(ErrorCode.TOKEN_EXPIRED))); + } + else { + setResponse(response, ApiUtil.error(ErrorResponse.of(ErrorCode.INVALID_TOKEN))); + } + } + } + + private void setResponse(HttpServletResponse response, ApiResponse errorMessage) throws RuntimeException, IOException { + response.setContentType("application/json;charset=UTF-8"); + + ObjectMapper objectMapper = new ObjectMapper(); + String result = objectMapper.writeValueAsString(errorMessage); + response.getWriter().print(result); + } + +} \ No newline at end of file From fbd33053bd8b5fd9709cacc147a8a4134b17875c Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Thu, 23 Jan 2025 02:39:50 +0900 Subject: [PATCH 21/25] =?UTF-8?q?feat:=20=ED=86=A0=ED=81=B0=20=EB=A7=8C?= =?UTF-8?q?=EB=A3=8C=20=EC=98=88=EC=99=B8=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/global/exception/GlobalExceptionHandler.java | 1 + .../ourmenu/backend/global/filter/JwtExceptionFilter.java | 2 +- .../com/ourmenu/backend/global/util/JwtTokenProvider.java | 6 +++--- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/ourmenu/backend/global/exception/GlobalExceptionHandler.java b/src/main/java/com/ourmenu/backend/global/exception/GlobalExceptionHandler.java index 02cde4b..f74e582 100644 --- a/src/main/java/com/ourmenu/backend/global/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/ourmenu/backend/global/exception/GlobalExceptionHandler.java @@ -2,6 +2,7 @@ import com.ourmenu.backend.global.response.ApiResponse; import com.ourmenu.backend.global.response.util.ApiUtil; +import io.jsonwebtoken.JwtException; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; diff --git a/src/main/java/com/ourmenu/backend/global/filter/JwtExceptionFilter.java b/src/main/java/com/ourmenu/backend/global/filter/JwtExceptionFilter.java index e3c12a4..c5a6e55 100644 --- a/src/main/java/com/ourmenu/backend/global/filter/JwtExceptionFilter.java +++ b/src/main/java/com/ourmenu/backend/global/filter/JwtExceptionFilter.java @@ -27,7 +27,7 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse try { chain.doFilter(request, response); } catch (Exception e) { - if(e.equals(TokenExpiredExcpetion.class)) { + if(e instanceof TokenExpiredExcpetion) { setResponse(response, ApiUtil.error(ErrorResponse.of(ErrorCode.TOKEN_EXPIRED))); } else { diff --git a/src/main/java/com/ourmenu/backend/global/util/JwtTokenProvider.java b/src/main/java/com/ourmenu/backend/global/util/JwtTokenProvider.java index 3ff9ddf..8059e46 100644 --- a/src/main/java/com/ourmenu/backend/global/util/JwtTokenProvider.java +++ b/src/main/java/com/ourmenu/backend/global/util/JwtTokenProvider.java @@ -39,7 +39,7 @@ public class JwtTokenProvider { private Key key; private final SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; - private static final long ACCESS_TIME = 60 * 60 * 1000L; // 1시간 + private static final long ACCESS_TIME = 60 * 1000L; // 1시간 private static final long REFRESH_TIME = 30 * 24 * 60 * 60 * 1000L; // 30일 public static final String ACCESS_TOKEN = "Authorization"; public static final String REFRESH_TOKEN = "Refresh-Token"; @@ -130,8 +130,8 @@ public String createToken(String email, String type) { public Boolean validateToken(String token) { try { Jws claims = Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token); - return !claims.getBody().getExpiration().before(new Date()); - } catch (ExpiredJwtException e) { + return true; + } catch (ExpiredJwtException e){ throw new TokenExpiredExcpetion(); } catch (JwtException e){ throw new InvalidTokenException(); From 7a5db192dfb3cb05302a31b8bf750148df75dd21 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Fri, 24 Jan 2025 00:35:05 +0900 Subject: [PATCH 22/25] =?UTF-8?q?fix:=20NoArgsConstructor=20=EC=96=B4?= =?UTF-8?q?=EB=85=B8=ED=85=8C=EC=9D=B4=EC=85=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../backend/domain/user/dto/request/EmailRequest.java | 5 ++--- .../backend/domain/user/dto/request/MealTimeRequest.java | 2 ++ .../backend/domain/user/dto/request/PasswordRequest.java | 2 ++ .../backend/domain/user/dto/request/SignInRequest.java | 2 ++ .../backend/domain/user/dto/request/SignUpRequest.java | 2 ++ .../backend/domain/user/dto/request/VerifyEmailRequest.java | 2 ++ 6 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/request/EmailRequest.java b/src/main/java/com/ourmenu/backend/domain/user/dto/request/EmailRequest.java index 4501ccb..c945c30 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dto/request/EmailRequest.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dto/request/EmailRequest.java @@ -1,10 +1,9 @@ package com.ourmenu.backend.domain.user.dto.request; -import lombok.Builder; -import lombok.Getter; +import lombok.*; -@Builder @Getter +@NoArgsConstructor public class EmailRequest { private String email; } diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/request/MealTimeRequest.java b/src/main/java/com/ourmenu/backend/domain/user/dto/request/MealTimeRequest.java index 40d38c0..cfa30b4 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dto/request/MealTimeRequest.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dto/request/MealTimeRequest.java @@ -2,10 +2,12 @@ import lombok.Getter; +import lombok.NoArgsConstructor; import java.util.ArrayList; @Getter +@NoArgsConstructor public class MealTimeRequest { ArrayList mealTime; } diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/request/PasswordRequest.java b/src/main/java/com/ourmenu/backend/domain/user/dto/request/PasswordRequest.java index 97eac16..8dd7f68 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dto/request/PasswordRequest.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dto/request/PasswordRequest.java @@ -1,8 +1,10 @@ package com.ourmenu.backend.domain.user.dto.request; import lombok.Getter; +import lombok.NoArgsConstructor; @Getter +@NoArgsConstructor public class PasswordRequest { String password; String newPassword; diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignInRequest.java b/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignInRequest.java index 8334072..5c2e978 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignInRequest.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignInRequest.java @@ -1,8 +1,10 @@ package com.ourmenu.backend.domain.user.dto.request; import lombok.Getter; +import lombok.NoArgsConstructor; @Getter +@NoArgsConstructor public class SignInRequest { private String email; private String password; diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignUpRequest.java b/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignUpRequest.java index d1f49a4..0d7f7e6 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignUpRequest.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dto/request/SignUpRequest.java @@ -1,10 +1,12 @@ package com.ourmenu.backend.domain.user.dto.request; import lombok.Getter; +import lombok.NoArgsConstructor; import java.util.ArrayList; @Getter +@NoArgsConstructor public class SignUpRequest { private String email; private String password; diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/request/VerifyEmailRequest.java b/src/main/java/com/ourmenu/backend/domain/user/dto/request/VerifyEmailRequest.java index 807bcb7..4dd9f1b 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/dto/request/VerifyEmailRequest.java +++ b/src/main/java/com/ourmenu/backend/domain/user/dto/request/VerifyEmailRequest.java @@ -1,8 +1,10 @@ package com.ourmenu.backend.domain.user.dto.request; import lombok.Getter; +import lombok.NoArgsConstructor; @Getter +@NoArgsConstructor public class VerifyEmailRequest { private String email; private String confirmCode; From dd9c5d31809e0517f782f91592708cf79abeec51 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Fri, 24 Jan 2025 01:05:44 +0900 Subject: [PATCH 23/25] =?UTF-8?q?feat:=20=EC=9D=B4=EB=A9=94=EC=9D=BC=20?= =?UTF-8?q?=EC=9D=B8=EC=A6=9D=20=EB=A9=94=EC=9D=BC=20=EB=B9=84=EB=8F=99?= =?UTF-8?q?=EA=B8=B0=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/AsyncEmailSenderService.java | 29 ++++++++++++++++ .../domain/user/application/EmailService.java | 18 ++-------- .../backend/global/config/AsyncConfig.java | 34 +++++++++++++++++++ 3 files changed, 65 insertions(+), 16 deletions(-) create mode 100644 src/main/java/com/ourmenu/backend/domain/user/application/AsyncEmailSenderService.java create mode 100644 src/main/java/com/ourmenu/backend/global/config/AsyncConfig.java diff --git a/src/main/java/com/ourmenu/backend/domain/user/application/AsyncEmailSenderService.java b/src/main/java/com/ourmenu/backend/domain/user/application/AsyncEmailSenderService.java new file mode 100644 index 0000000..bddfb56 --- /dev/null +++ b/src/main/java/com/ourmenu/backend/domain/user/application/AsyncEmailSenderService.java @@ -0,0 +1,29 @@ +package com.ourmenu.backend.domain.user.application; + +import jakarta.mail.MessagingException; +import jakarta.mail.internet.MimeMessage; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.mail.javamail.MimeMessageHelper; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +@Slf4j +public class AsyncEmailSenderService { + + private final JavaMailSender emailSender; + + @Async("mailExecutor") + public void sendEmail(String toEmail, String title, String content) throws MessagingException { + MimeMessage message = emailSender.createMimeMessage(); + MimeMessageHelper helper = new MimeMessageHelper(message, true); + helper.setTo(toEmail); + helper.setSubject(title); + helper.setText(content, true); + helper.setReplyTo("ourmenuv2@gmail.com"); + emailSender.send(message); + } +} diff --git a/src/main/java/com/ourmenu/backend/domain/user/application/EmailService.java b/src/main/java/com/ourmenu/backend/domain/user/application/EmailService.java index df0572a..6bef710 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/application/EmailService.java +++ b/src/main/java/com/ourmenu/backend/domain/user/application/EmailService.java @@ -9,11 +9,8 @@ import com.ourmenu.backend.domain.user.exception.NotMatchConfirmCodeException; import com.ourmenu.backend.domain.user.exception.SendCodeFailureException; import jakarta.mail.MessagingException; -import jakarta.mail.internet.MimeMessage; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.mail.javamail.JavaMailSender; -import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.stereotype.Service; import java.util.concurrent.ThreadLocalRandom; @@ -23,20 +20,10 @@ @RequiredArgsConstructor public class EmailService { - private final JavaMailSender emailSender; + private final AsyncEmailSenderService asyncEmailSenderService; private final int CONFIRM_CODE_LENGTH = 6; private final ConfirmCodeRepository confirmCodeRepository; - public void sendEmail(String toEmail, String title, String content) throws MessagingException { - MimeMessage message = emailSender.createMimeMessage(); - MimeMessageHelper helper = new MimeMessageHelper(message, true); - helper.setTo(toEmail); - helper.setSubject(title); - helper.setText(content, true); - helper.setReplyTo("ourmenuv2@gmail.com"); - emailSender.send(message); - } - public EmailResponse sendCodeToEmail(EmailRequest request){ String email = request.getEmail(); String title = "아워메뉴 이메일 인증 번호"; @@ -48,9 +35,8 @@ public EmailResponse sendCodeToEmail(EmailRequest request){ + "" + ""; - try { - sendEmail(email, title, content); + asyncEmailSenderService.sendEmail(email, title, content); }catch (MessagingException e){ throw new SendCodeFailureException(); } diff --git a/src/main/java/com/ourmenu/backend/global/config/AsyncConfig.java b/src/main/java/com/ourmenu/backend/global/config/AsyncConfig.java new file mode 100644 index 0000000..a743920 --- /dev/null +++ b/src/main/java/com/ourmenu/backend/global/config/AsyncConfig.java @@ -0,0 +1,34 @@ +package com.ourmenu.backend.global.config; + +import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.AsyncConfigurer; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + +@Configuration +@EnableAsync +public class AsyncConfig implements AsyncConfigurer { + + @Override + @Bean(name = "mailExecutor") + public Executor getAsyncExecutor() { + final ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(5); + executor.setMaxPoolSize(25); + executor.setQueueCapacity(30); + executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + executor.setAwaitTerminationSeconds(60); + executor.setThreadNamePrefix("Asynchronous Mail Sender Thread-"); + return executor; + } + + @Override + public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { + return AsyncConfigurer.super.getAsyncUncaughtExceptionHandler(); + } +} \ No newline at end of file From f0fde665393624c40b4bf4be306590db4ac4aea4 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Fri, 24 Jan 2025 01:45:32 +0900 Subject: [PATCH 24/25] =?UTF-8?q?feat:=20=EC=9E=84=EC=8B=9C=20=EB=B9=84?= =?UTF-8?q?=EB=B0=80=EB=B2=88=ED=98=B8=20API=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/user/api/EmailController.java | 7 +++++++ .../domain/user/application/EmailService.java | 18 ++++++++++++++++++ .../response/TemporaryPasswordResponse.java | 16 ++++++++++++++++ 3 files changed, 41 insertions(+) create mode 100644 src/main/java/com/ourmenu/backend/domain/user/dto/response/TemporaryPasswordResponse.java diff --git a/src/main/java/com/ourmenu/backend/domain/user/api/EmailController.java b/src/main/java/com/ourmenu/backend/domain/user/api/EmailController.java index 061e483..5261d69 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/api/EmailController.java +++ b/src/main/java/com/ourmenu/backend/domain/user/api/EmailController.java @@ -4,6 +4,7 @@ import com.ourmenu.backend.domain.user.dto.request.EmailRequest; import com.ourmenu.backend.domain.user.dto.response.EmailResponse; import com.ourmenu.backend.domain.user.dto.request.VerifyEmailRequest; +import com.ourmenu.backend.domain.user.dto.response.TemporaryPasswordResponse; import com.ourmenu.backend.global.response.ApiResponse; import com.ourmenu.backend.global.response.util.ApiUtil; import jakarta.validation.Valid; @@ -31,4 +32,10 @@ private ApiResponse verifyEmail(@Valid @RequestBody VerifyEmailRequest req emailService.verifyConfirmCode(request); return ApiUtil.successOnly(); } + + @PostMapping("/temporary-password") + private ApiResponse sendTemporaryPassword(@RequestBody EmailRequest request){ + TemporaryPasswordResponse response = emailService.sendTemporaryPassword(request); + return ApiUtil.success(response); + } } diff --git a/src/main/java/com/ourmenu/backend/domain/user/application/EmailService.java b/src/main/java/com/ourmenu/backend/domain/user/application/EmailService.java index 6bef710..5b70d28 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/application/EmailService.java +++ b/src/main/java/com/ourmenu/backend/domain/user/application/EmailService.java @@ -1,18 +1,24 @@ package com.ourmenu.backend.domain.user.application; import com.ourmenu.backend.domain.user.dao.ConfirmCodeRepository; +import com.ourmenu.backend.domain.user.dao.UserRepository; import com.ourmenu.backend.domain.user.domain.ConfirmCode; +import com.ourmenu.backend.domain.user.domain.User; import com.ourmenu.backend.domain.user.dto.request.EmailRequest; import com.ourmenu.backend.domain.user.dto.response.EmailResponse; import com.ourmenu.backend.domain.user.dto.request.VerifyEmailRequest; +import com.ourmenu.backend.domain.user.dto.response.TemporaryPasswordResponse; import com.ourmenu.backend.domain.user.exception.ConfirmCodeNotFoundException; import com.ourmenu.backend.domain.user.exception.NotMatchConfirmCodeException; import com.ourmenu.backend.domain.user.exception.SendCodeFailureException; +import com.ourmenu.backend.domain.user.exception.UserNotFoundException; import jakarta.mail.MessagingException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import java.util.Optional; import java.util.concurrent.ThreadLocalRandom; @Slf4j @@ -23,6 +29,7 @@ public class EmailService { private final AsyncEmailSenderService asyncEmailSenderService; private final int CONFIRM_CODE_LENGTH = 6; private final ConfirmCodeRepository confirmCodeRepository; + private final UserRepository userRepository; public EmailResponse sendCodeToEmail(EmailRequest request){ String email = request.getEmail(); @@ -74,4 +81,15 @@ public void verifyConfirmCode(VerifyEmailRequest request){ } } + public TemporaryPasswordResponse sendTemporaryPassword(EmailRequest request) { + String email = request.getEmail(); + log.warn("{}", email); + String temporaryPassword = generateRandomCode(8); + User user = userRepository.findByEmail(email) + .orElseThrow(UserNotFoundException::new); + + user.changePassword(temporaryPassword); + userRepository.save(user); + return TemporaryPasswordResponse.from(temporaryPassword); + } } diff --git a/src/main/java/com/ourmenu/backend/domain/user/dto/response/TemporaryPasswordResponse.java b/src/main/java/com/ourmenu/backend/domain/user/dto/response/TemporaryPasswordResponse.java new file mode 100644 index 0000000..61b7b12 --- /dev/null +++ b/src/main/java/com/ourmenu/backend/domain/user/dto/response/TemporaryPasswordResponse.java @@ -0,0 +1,16 @@ +package com.ourmenu.backend.domain.user.dto.response; + +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class TemporaryPasswordResponse { + private String temporaryPassword; + + public static TemporaryPasswordResponse from(String temporaryPassword){ + return TemporaryPasswordResponse.builder() + .temporaryPassword(temporaryPassword) + .build(); + } +} From b27245bd4904af5bf370b117b6c15ed26c8ac4c6 Mon Sep 17 00:00:00 2001 From: You-Hyuk Date: Sat, 25 Jan 2025 01:18:50 +0900 Subject: [PATCH 25/25] =?UTF-8?q?remove:=20=EB=94=94=EB=B2=84=EA=B9=85?= =?UTF-8?q?=EC=9A=A9=20=EB=A1=9C=EA=B7=B8=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ourmenu/backend/domain/user/application/EmailService.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/ourmenu/backend/domain/user/application/EmailService.java b/src/main/java/com/ourmenu/backend/domain/user/application/EmailService.java index 5b70d28..95aa69c 100644 --- a/src/main/java/com/ourmenu/backend/domain/user/application/EmailService.java +++ b/src/main/java/com/ourmenu/backend/domain/user/application/EmailService.java @@ -83,7 +83,6 @@ public void verifyConfirmCode(VerifyEmailRequest request){ public TemporaryPasswordResponse sendTemporaryPassword(EmailRequest request) { String email = request.getEmail(); - log.warn("{}", email); String temporaryPassword = generateRandomCode(8); User user = userRepository.findByEmail(email) .orElseThrow(UserNotFoundException::new);