From 8eb45f97aa2a64f8b983cdf9a48abcbf38a5c580 Mon Sep 17 00:00:00 2001 From: minjee2758 Date: Sun, 31 Aug 2025 19:53:16 +0900 Subject: [PATCH 1/7] =?UTF-8?q?refactor=20:=20=EA=B8=B0=EB=B3=B8=20?= =?UTF-8?q?=EC=96=B8=EC=96=B4=EA=B0=80=20=EC=A0=80=EC=9E=A5=EB=90=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EC=9D=80=20=EC=9C=A0=EC=A0=80=EC=97=90=20?= =?UTF-8?q?=EB=8C=80=ED=95=B4=20=EC=A1=B0=ED=9A=8C=EC=8B=9C=201=EB=B2=88?= =?UTF-8?q?=20=EC=96=B8=EC=96=B4=EB=A1=9C=20=EC=9E=90=EB=8F=99=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95=20=EB=B0=8F=20=EC=A1=B0=ED=9A=8C=EB=90=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../usermanagement/user/service/UserService.java | 6 +++++- .../org/ezcode/codetest/domain/user/model/entity/User.java | 4 ++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/ezcode/codetest/application/usermanagement/user/service/UserService.java b/src/main/java/org/ezcode/codetest/application/usermanagement/user/service/UserService.java index 6a41b981..539af15f 100644 --- a/src/main/java/org/ezcode/codetest/application/usermanagement/user/service/UserService.java +++ b/src/main/java/org/ezcode/codetest/application/usermanagement/user/service/UserService.java @@ -56,7 +56,7 @@ public class UserService { private final RedisTemplate redisTemplate; private final S3Uploader s3Uploader; - @Transactional(readOnly = true) + @Transactional public UserInfoResponse getUserInfo(AuthUser authUser) { log.info("authUserEmail: {}, authUserID : {}", authUser.getEmail(), authUser.getId()); User user = userDomainService.getUserById(authUser.getId()); @@ -64,6 +64,10 @@ public UserInfoResponse getUserInfo(AuthUser authUser) { List userAuthTypes = userDomainService.getUserAuthTypesByUser(user); List authTypes = userAuthTypes.stream() .map(UserAuthType::getAuthType).toList(); + if (user.getLanguage() == null) { + Language userLanguage = languageDomainService.getLanguage(1L); + user.setLanguage(userLanguage); + } return UserInfoResponse.builder() .username(user.getUsername()) diff --git a/src/main/java/org/ezcode/codetest/domain/user/model/entity/User.java b/src/main/java/org/ezcode/codetest/domain/user/model/entity/User.java index 34757119..f09709e1 100644 --- a/src/main/java/org/ezcode/codetest/domain/user/model/entity/User.java +++ b/src/main/java/org/ezcode/codetest/domain/user/model/entity/User.java @@ -216,4 +216,8 @@ public void modifyProfileImage(String profileImageUrl) { public void modifyUserRole(UserRole userRole) { this.role = userRole; } + + public void setLanguage(Language userLanguage) { + this.language = userLanguage; + } } From 3d4b88c01c800ba1f6cb02d2fd456e4959ebe071 Mon Sep 17 00:00:00 2001 From: minjee2758 Date: Fri, 5 Sep 2025 08:51:34 +0900 Subject: [PATCH 2/7] =?UTF-8?q?refactor=20:=20=EC=9C=A0=EC=A0=80=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=EB=B3=80=EA=B2=BD=20=EC=8B=9C,=20?= =?UTF-8?q?=EB=8B=89=EB=84=A4=EC=9E=84=20=EC=A4=91=EB=B3=B5=20=EB=B0=A9?= =?UTF-8?q?=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/service/UserService.java | 6 +++++ .../exception/code/UserExceptionCode.java | 3 +-- .../user/repository/UserRepository.java | 1 + .../domain/user/service/MailService.java | 2 +- .../user/service/UserDomainService.java | 7 +++++ .../repository/user/UserJpaRepository.java | 3 +++ .../repository/user/UserRepositoryImpl.java | 5 +++- .../usermanagement/UserController.java | 3 ++- .../usermanagement/UserVerifyController.java | 26 +++++++++++++++++++ src/main/resources/application.properties | 10 ++++++- 10 files changed, 60 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/ezcode/codetest/application/usermanagement/user/service/UserService.java b/src/main/java/org/ezcode/codetest/application/usermanagement/user/service/UserService.java index 539af15f..dd6d5108 100644 --- a/src/main/java/org/ezcode/codetest/application/usermanagement/user/service/UserService.java +++ b/src/main/java/org/ezcode/codetest/application/usermanagement/user/service/UserService.java @@ -91,6 +91,12 @@ public UserInfoResponse getUserInfo(AuthUser authUser) { public UserInfoResponse modifyUserInfo(AuthUser authUser, ModifyUserInfoRequest request, MultipartFile image) { User user = userDomainService.getUserById(authUser.getId()); Language findLangauge = languageDomainService.getLanguage(request.languageId()); + if (request.nickname() != null && !request.nickname().equals(user.getNickname())) { + if (userDomainService.existsByNickname(request.nickname())) { + log.info("중복 닉네임"); + throw new UserException(UserExceptionCode.ALREADY_EXIST_NICKNAME); + } + } user.modifyUserInfo( request.nickname(), diff --git a/src/main/java/org/ezcode/codetest/domain/user/exception/code/UserExceptionCode.java b/src/main/java/org/ezcode/codetest/domain/user/exception/code/UserExceptionCode.java index d9638efb..fc2825e5 100644 --- a/src/main/java/org/ezcode/codetest/domain/user/exception/code/UserExceptionCode.java +++ b/src/main/java/org/ezcode/codetest/domain/user/exception/code/UserExceptionCode.java @@ -15,8 +15,7 @@ public enum UserExceptionCode implements ResponseCode { NO_GITHUB_INFO(false, HttpStatus.BAD_REQUEST, "깃허브 정보가 없습니다."), NO_GITHUB_REPO(false, HttpStatus.BAD_REQUEST, "해당하는 Repository를 찾을 수 없습니다."), - - ; + ALREADY_EXIST_NICKNAME(false, HttpStatus.BAD_REQUEST, "이미 존재하는 닉네임입니다"); private final boolean success; private final HttpStatus status; private final String message; diff --git a/src/main/java/org/ezcode/codetest/domain/user/repository/UserRepository.java b/src/main/java/org/ezcode/codetest/domain/user/repository/UserRepository.java index 9eea7b4d..6a2079bc 100644 --- a/src/main/java/org/ezcode/codetest/domain/user/repository/UserRepository.java +++ b/src/main/java/org/ezcode/codetest/domain/user/repository/UserRepository.java @@ -22,4 +22,5 @@ public interface UserRepository { void updateUserGithubAccessToken(User loginUser); + List getUserNicknames(); } diff --git a/src/main/java/org/ezcode/codetest/domain/user/service/MailService.java b/src/main/java/org/ezcode/codetest/domain/user/service/MailService.java index 683149cc..0d6bff88 100644 --- a/src/main/java/org/ezcode/codetest/domain/user/service/MailService.java +++ b/src/main/java/org/ezcode/codetest/domain/user/service/MailService.java @@ -51,7 +51,7 @@ public MimeMessage CreateButtonMail(Long userId, String email, String redirectUr String body = ""; body += "

" + "아래 버튼을 클릭하여 이메일 인증을 완료해 주세요" + "

"; // 이메일 버튼 - body += "이메일 인증 확인"; + body += "이메일 인증 확인"; body += "

" + "감사합니다." + "

"; message.setText(body,"UTF-8", "html"); } catch (MessagingException e) { diff --git a/src/main/java/org/ezcode/codetest/domain/user/service/UserDomainService.java b/src/main/java/org/ezcode/codetest/domain/user/service/UserDomainService.java index d3fcf3d4..e01ce696 100644 --- a/src/main/java/org/ezcode/codetest/domain/user/service/UserDomainService.java +++ b/src/main/java/org/ezcode/codetest/domain/user/service/UserDomainService.java @@ -132,4 +132,11 @@ public List getUserAuthTypesByUser(User user) { return userAuthTypeRepository.getUserAuthTypesByUser(user); } + public List getUserNicknames() { + return userRepository.getUserNicknames(); + } + + public boolean existsByNickname(String nickname) { + return userRepository.existsByNickname(nickname); + } } diff --git a/src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/user/UserJpaRepository.java b/src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/user/UserJpaRepository.java index a7e559c2..533e92e9 100644 --- a/src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/user/UserJpaRepository.java +++ b/src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/user/UserJpaRepository.java @@ -24,4 +24,7 @@ void updateReviewTokens( @Param("ids") List ids, @Param("newToken") int newToken ); + + @Query("select u.nickname from User u ") + List findAllNicknames(); } diff --git a/src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/user/UserRepositoryImpl.java b/src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/user/UserRepositoryImpl.java index a9090b38..765cd5b6 100644 --- a/src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/user/UserRepositoryImpl.java +++ b/src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/user/UserRepositoryImpl.java @@ -53,6 +53,9 @@ public void updateUserGithubAccessToken(User loginUser) { userJpaRepository.save(loginUser); } - + @Override + public List getUserNicknames() { + return userJpaRepository.findAllNicknames(); + } } diff --git a/src/main/java/org/ezcode/codetest/presentation/usermanagement/UserController.java b/src/main/java/org/ezcode/codetest/presentation/usermanagement/UserController.java index 9dc7e60b..bd5d641b 100644 --- a/src/main/java/org/ezcode/codetest/presentation/usermanagement/UserController.java +++ b/src/main/java/org/ezcode/codetest/presentation/usermanagement/UserController.java @@ -13,6 +13,7 @@ import org.ezcode.codetest.application.usermanagement.user.service.UserService; import org.ezcode.codetest.domain.user.model.entity.AuthUser; import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.DeleteMapping; @@ -46,7 +47,7 @@ public ResponseEntity getUserInfo(@AuthenticationPrincipal Aut } @Operation(summary = "내 정보 수정", description = "닉네임, 블로그, 깃허브, 소개 등 개인 정보를 추가하거나 수정합니다.") - @PutMapping("/users") + @PutMapping(value = "/users", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public ResponseEntity modifyUserInfo( @AuthenticationPrincipal AuthUser authUser, @Valid @RequestPart("request") ModifyUserInfoRequest request, diff --git a/src/main/java/org/ezcode/codetest/presentation/usermanagement/UserVerifyController.java b/src/main/java/org/ezcode/codetest/presentation/usermanagement/UserVerifyController.java index 7b2b640a..75d7f7b7 100644 --- a/src/main/java/org/ezcode/codetest/presentation/usermanagement/UserVerifyController.java +++ b/src/main/java/org/ezcode/codetest/presentation/usermanagement/UserVerifyController.java @@ -1,5 +1,7 @@ package org.ezcode.codetest.presentation.usermanagement; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpHeaders; import org.ezcode.codetest.application.usermanagement.auth.dto.request.FindPasswordRequest; import org.ezcode.codetest.application.usermanagement.user.dto.request.ResetPasswordRequest; import org.ezcode.codetest.application.usermanagement.auth.dto.request.SendEmailRequest; @@ -34,6 +36,12 @@ public class UserVerifyController { private final AuthService authService; + @Value("${app.redirect.verify.success:/}") + private String verifySuccessRedirect; + + @Value("${app.redirect.verify.failure:/}") + private String verifyFailureRedirect; + @Operation(summary = "이메일 인증 코드 전송", description = "현재 로그인된 회원의 이메일로 인증 코드를 전송합니다.") @PostMapping("/email/send") public ResponseEntity sendMailCode( @@ -53,6 +61,24 @@ public ResponseEntity verifyEmailCode( return ResponseEntity.status(HttpStatus.OK).body(authService.verifyEmailCode(email, key)); } + @Operation(summary = "이메일 코드 인증 후 페이지 리다이렉트", description = "이메일의 '인증하기' 버튼 클릭 시 성공/실패 페이지로 리다이렉트합니다.") + @GetMapping("/auth/verify-page") + public ResponseEntity verifyEmailCodeAndRedirect( + @RequestParam String email, + @RequestParam String key + ){ + try { + authService.verifyEmailCode(email, key); + return ResponseEntity.status(HttpStatus.FOUND) + .header(HttpHeaders.LOCATION, verifySuccessRedirect) + .build(); + } catch (Exception e) { + return ResponseEntity.status(HttpStatus.FOUND) + .header(HttpHeaders.LOCATION, verifyFailureRedirect) + .build(); + } + } + //비밀번호 찾기 요청 @Operation(summary = "비밀번호 찾기 요청", description = "비밀번호를 찾기 위해 이메일로 인증코드를 전송합니다.") diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index bf1c9786..3ac0c698 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -159,4 +159,12 @@ spring.datasource.hikari.minimum-idle=10 spring.datasource.hikari.idle-timeout=30000 spring.datasource.hikari.max-lifetime=600000 spring.datasource.hikari.connection-timeout=30000 -spring.datasource.hikari.validation-timeout=5000 \ No newline at end of file +spring.datasource.hikari.validation-timeout=5000 + +# ======================== +# App Redirects (Email Verify) +# ======================== +# 인증 성공 시 이동할 페이지 URL (예: 프론트의 성공 안내 페이지) +app.redirect.verify.success=${APP_REDIRECT_VERIFY_SUCCESS:https://your-frontend.example.com/verify/success} +# 인증 실패 시 이동할 페이지 URL (예: 프론트의 실패 안내 페이지) +app.redirect.verify.failure=${APP_REDIRECT_VERIFY_FAILURE:https://your-frontend.example.com/verify/failure} \ No newline at end of file From 36a7244b31dad982e837381e0acc8107df347884 Mon Sep 17 00:00:00 2001 From: minjee2758 Date: Fri, 5 Sep 2025 21:44:04 +0900 Subject: [PATCH 3/7] =?UTF-8?q?refactor=20:=20/api/users/daily-solved=20?= =?UTF-8?q?=EC=95=A4=EB=93=9C=ED=8F=AC=EC=9D=B8=ED=8A=B8=EC=97=90=20?= =?UTF-8?q?=EB=AC=B8=EC=A0=9C=20=EB=B2=88=ED=98=B8=20=EB=A6=AC=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=ED=8F=AC=ED=95=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .DS_Store | Bin 6148 -> 6148 bytes src/.DS_Store | Bin 6148 -> 6148 bytes src/main/.DS_Store | Bin 6148 -> 6148 bytes src/main/java/.DS_Store | Bin 6148 -> 6148 bytes src/main/java/org/.DS_Store | Bin 6148 -> 6148 bytes .../user/service/UserService.java | 1 + .../submission/dto/DailyCorrectCount.java | 15 ++++++++++++--- .../service/SubmissionDomainService.java | 2 ++ .../UserProblemResultQueryRepositoryImpl.java | 16 ++++++++++------ .../usermanagement/UserController.java | 1 + 10 files changed, 26 insertions(+), 9 deletions(-) diff --git a/.DS_Store b/.DS_Store index e82ca7eda7168ef6f444c37d8a901c3e69b405be..1bea640efb2d3199115e30f7f95ccdf9a64b4228 100644 GIT binary patch delta 32 ncmZoMXffDumQC2uOh>`c#GqD3q1w{OKu5vU%y{zyHWfhtn<5C_ delta 32 ncmZoMXffDumQC2eP)EVo!lYJ5q1w{OKu5vE*lhCyHWfhtn@9-Z diff --git a/src/.DS_Store b/src/.DS_Store index 83a4c15f4588375cf172e886c7011714a35c656d..97314535d4c19e181251fd583d82a999632d7fb2 100644 GIT binary patch delta 32 ncmZoMXffDukV)9kOh>`c#GqD3q1w{OKu5vU%y{z^CIe9bnN|qS delta 32 ncmZoMXffDukV)9UP)EVo!lYJ5q1w{OKu5vE*lhC^CIe9bnS2P* diff --git a/src/main/.DS_Store b/src/main/.DS_Store index a068fe572999b6dad53e0c061e804bc5e81b6b56..b3d027d063d8d5fc5bd9645161d962d0a19f8373 100644 GIT binary patch delta 36 rcmZoMXffDukVV+gOh>`c#GqD3q1w{OKu5vU%y{w-R^!d=tbc_7!afR< delta 24 fcmZoMXffDukcHjAP)EVo!esIrR{PEDtbc_7VS5L{ diff --git a/src/main/java/.DS_Store b/src/main/java/.DS_Store index 419e452f2f1acfa0be6ccee394503e87e861421c..ef52379d4b7f86771089725df4fe6853e4676286 100644 GIT binary patch delta 32 ncmZoMXffEZmr2;rOh>`c#GqD3q1w{OKu5vU%y{z!CKFKrnBoY^ delta 32 ncmZoMXffEZmr2;bP)EVo!lYJ5q1w{OKu5vE*lhC!CKFKrnFt8Y diff --git a/src/main/java/org/.DS_Store b/src/main/java/org/.DS_Store index e6675bd3ceae347ba96fff36f1fb0ac656424034..fcb8f060e07bd6b0456347ca65d9cc23915f53a0 100644 GIT binary patch delta 32 ncmZoMXffDul1bRmOh>`c#GqD3q1w{OKu5vU%y{!1CJj*lnm!2D delta 32 ncmZoMXffDul1bRWP)EVo!lYJ5q1w{OKu5vE*lhD1CJj*lnq&ys diff --git a/src/main/java/org/ezcode/codetest/application/usermanagement/user/service/UserService.java b/src/main/java/org/ezcode/codetest/application/usermanagement/user/service/UserService.java index dd6d5108..bf4ea115 100644 --- a/src/main/java/org/ezcode/codetest/application/usermanagement/user/service/UserService.java +++ b/src/main/java/org/ezcode/codetest/application/usermanagement/user/service/UserService.java @@ -1,5 +1,6 @@ package org.ezcode.codetest.application.usermanagement.user.service; +import java.time.LocalDate; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; import java.util.List; diff --git a/src/main/java/org/ezcode/codetest/domain/submission/dto/DailyCorrectCount.java b/src/main/java/org/ezcode/codetest/domain/submission/dto/DailyCorrectCount.java index 957c3c7c..fc8263c2 100644 --- a/src/main/java/org/ezcode/codetest/domain/submission/dto/DailyCorrectCount.java +++ b/src/main/java/org/ezcode/codetest/domain/submission/dto/DailyCorrectCount.java @@ -1,12 +1,21 @@ package org.ezcode.codetest.domain.submission.dto; import java.time.LocalDate; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; public record DailyCorrectCount( LocalDate date, - int count + int count, + List problemIds ) { - public DailyCorrectCount(java.sql.Date date, int count) { - this(date.toLocalDate(), count); + + public DailyCorrectCount(java.sql.Date date, Set problemIds) { + this( + date.toLocalDate(), + problemIds.size(), + new ArrayList<>(problemIds) + ); } } diff --git a/src/main/java/org/ezcode/codetest/domain/submission/service/SubmissionDomainService.java b/src/main/java/org/ezcode/codetest/domain/submission/service/SubmissionDomainService.java index 76069406..a41cfc38 100644 --- a/src/main/java/org/ezcode/codetest/domain/submission/service/SubmissionDomainService.java +++ b/src/main/java/org/ezcode/codetest/domain/submission/service/SubmissionDomainService.java @@ -1,5 +1,6 @@ package org.ezcode.codetest.domain.submission.service; +import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; import java.util.Optional; @@ -120,4 +121,5 @@ private void modifyUserProblemResult(UserProblemResult userProblemResult, boolea public int findSubmissionCountByUserId(Long userId) { return submissionRepository.findSubmissionCountByUserId(userId); } + } diff --git a/src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/submission/query/UserProblemResultQueryRepositoryImpl.java b/src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/submission/query/UserProblemResultQueryRepositoryImpl.java index 195c6f26..b4b20fa9 100644 --- a/src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/submission/query/UserProblemResultQueryRepositoryImpl.java +++ b/src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/submission/query/UserProblemResultQueryRepositoryImpl.java @@ -7,6 +7,7 @@ import org.ezcode.codetest.domain.submission.model.entity.QUserProblemResult; import org.springframework.stereotype.Repository; +import com.querydsl.core.group.GroupBy; import com.querydsl.core.types.Projections; import com.querydsl.core.types.dsl.Expressions; import com.querydsl.jpa.impl.JPAQueryFactory; @@ -27,17 +28,20 @@ public List countCorrectByUserGroupedByDate(Long userId) { var date = Expressions.dateTemplate(java.sql.Date.class, "DATE({0})", upr.modifiedAt); return queryFactory - .select(Projections.constructor(DailyCorrectCount.class, - date, - upr.count().intValue() - )) .from(upr) .where( upr.user.id.eq(userId), upr.isCorrect.eq(true) ) - .groupBy(date) .orderBy(date.asc()) - .fetch(); + .transform( + GroupBy.groupBy(date).list( + Projections.constructor( + DailyCorrectCount.class, + date, + GroupBy.set(upr.problem.id) + ) + ) + ); } } diff --git a/src/main/java/org/ezcode/codetest/presentation/usermanagement/UserController.java b/src/main/java/org/ezcode/codetest/presentation/usermanagement/UserController.java index bd5d641b..27f2c0f4 100644 --- a/src/main/java/org/ezcode/codetest/presentation/usermanagement/UserController.java +++ b/src/main/java/org/ezcode/codetest/presentation/usermanagement/UserController.java @@ -91,6 +91,7 @@ public ResponseEntity getReviewToken( return ResponseEntity.status(HttpStatus.OK).body(userService.getReviewToken(authUser)); } + @Operation(summary = "회원의 푼 문제 수 조회", description = "날짜, 날짜마다 푼 문제 번호 리스트, 푼 문제 개수") @GetMapping("/users/daily-solved") public ResponseEntity getUserDailySolvedHistory( @AuthenticationPrincipal AuthUser authUser From 1258cfbf1ada7f54ce13000d0114c4f974e1c15b Mon Sep 17 00:00:00 2001 From: minjee2758 Date: Sat, 6 Sep 2025 13:50:01 +0900 Subject: [PATCH 4/7] =?UTF-8?q?refactor=20:=20=EB=A9=94=EC=9D=BC=20?= =?UTF-8?q?=EC=84=9C=EB=B9=84=EC=8A=A4=20undo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../submission/dto/DailyCorrectCount.java | 17 +++---------- .../domain/user/service/MailService.java | 2 +- .../UserProblemResultQueryRepositoryImpl.java | 4 ++++ .../usermanagement/UserVerifyController.java | 24 ------------------- 4 files changed, 8 insertions(+), 39 deletions(-) diff --git a/src/main/java/org/ezcode/codetest/domain/submission/dto/DailyCorrectCount.java b/src/main/java/org/ezcode/codetest/domain/submission/dto/DailyCorrectCount.java index fc8263c2..fa3813e0 100644 --- a/src/main/java/org/ezcode/codetest/domain/submission/dto/DailyCorrectCount.java +++ b/src/main/java/org/ezcode/codetest/domain/submission/dto/DailyCorrectCount.java @@ -1,21 +1,10 @@ package org.ezcode.codetest.domain.submission.dto; import java.time.LocalDate; -import java.util.ArrayList; -import java.util.List; import java.util.Set; public record DailyCorrectCount( LocalDate date, - int count, - List problemIds -) { - - public DailyCorrectCount(java.sql.Date date, Set problemIds) { - this( - date.toLocalDate(), - problemIds.size(), - new ArrayList<>(problemIds) - ); - } -} + long count, + Set problemIds +) { } diff --git a/src/main/java/org/ezcode/codetest/domain/user/service/MailService.java b/src/main/java/org/ezcode/codetest/domain/user/service/MailService.java index 0d6bff88..683149cc 100644 --- a/src/main/java/org/ezcode/codetest/domain/user/service/MailService.java +++ b/src/main/java/org/ezcode/codetest/domain/user/service/MailService.java @@ -51,7 +51,7 @@ public MimeMessage CreateButtonMail(Long userId, String email, String redirectUr String body = ""; body += "

" + "아래 버튼을 클릭하여 이메일 인증을 완료해 주세요" + "

"; // 이메일 버튼 - body += "이메일 인증 확인"; + body += "이메일 인증 확인"; body += "

" + "감사합니다." + "

"; message.setText(body,"UTF-8", "html"); } catch (MessagingException e) { diff --git a/src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/submission/query/UserProblemResultQueryRepositoryImpl.java b/src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/submission/query/UserProblemResultQueryRepositoryImpl.java index b4b20fa9..3ec9f236 100644 --- a/src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/submission/query/UserProblemResultQueryRepositoryImpl.java +++ b/src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/submission/query/UserProblemResultQueryRepositoryImpl.java @@ -2,6 +2,7 @@ import java.util.List; +import java.util.Set; import org.ezcode.codetest.domain.submission.dto.DailyCorrectCount; import org.ezcode.codetest.domain.submission.model.entity.QUserProblemResult; @@ -9,6 +10,7 @@ import com.querydsl.core.group.GroupBy; import com.querydsl.core.types.Projections; +import com.querydsl.core.types.dsl.NumberExpression; import com.querydsl.core.types.dsl.Expressions; import com.querydsl.jpa.impl.JPAQueryFactory; @@ -26,6 +28,7 @@ public List countCorrectByUserGroupedByDate(Long userId) { QUserProblemResult upr = QUserProblemResult.userProblemResult; var date = Expressions.dateTemplate(java.sql.Date.class, "DATE({0})", upr.modifiedAt); + NumberExpression countDistinctProblem = upr.problem.id.countDistinct(); return queryFactory .from(upr) @@ -39,6 +42,7 @@ public List countCorrectByUserGroupedByDate(Long userId) { Projections.constructor( DailyCorrectCount.class, date, + countDistinctProblem, GroupBy.set(upr.problem.id) ) ) diff --git a/src/main/java/org/ezcode/codetest/presentation/usermanagement/UserVerifyController.java b/src/main/java/org/ezcode/codetest/presentation/usermanagement/UserVerifyController.java index 75d7f7b7..89e94a09 100644 --- a/src/main/java/org/ezcode/codetest/presentation/usermanagement/UserVerifyController.java +++ b/src/main/java/org/ezcode/codetest/presentation/usermanagement/UserVerifyController.java @@ -36,12 +36,6 @@ public class UserVerifyController { private final AuthService authService; - @Value("${app.redirect.verify.success:/}") - private String verifySuccessRedirect; - - @Value("${app.redirect.verify.failure:/}") - private String verifyFailureRedirect; - @Operation(summary = "이메일 인증 코드 전송", description = "현재 로그인된 회원의 이메일로 인증 코드를 전송합니다.") @PostMapping("/email/send") public ResponseEntity sendMailCode( @@ -61,24 +55,6 @@ public ResponseEntity verifyEmailCode( return ResponseEntity.status(HttpStatus.OK).body(authService.verifyEmailCode(email, key)); } - @Operation(summary = "이메일 코드 인증 후 페이지 리다이렉트", description = "이메일의 '인증하기' 버튼 클릭 시 성공/실패 페이지로 리다이렉트합니다.") - @GetMapping("/auth/verify-page") - public ResponseEntity verifyEmailCodeAndRedirect( - @RequestParam String email, - @RequestParam String key - ){ - try { - authService.verifyEmailCode(email, key); - return ResponseEntity.status(HttpStatus.FOUND) - .header(HttpHeaders.LOCATION, verifySuccessRedirect) - .build(); - } catch (Exception e) { - return ResponseEntity.status(HttpStatus.FOUND) - .header(HttpHeaders.LOCATION, verifyFailureRedirect) - .build(); - } - } - //비밀번호 찾기 요청 @Operation(summary = "비밀번호 찾기 요청", description = "비밀번호를 찾기 위해 이메일로 인증코드를 전송합니다.") From 1cbb68a0a9b12887c2f937c0c949be2e765d103e Mon Sep 17 00:00:00 2001 From: minjee2758 Date: Sun, 7 Sep 2025 00:26:44 +0900 Subject: [PATCH 5/7] refactor :type --- .../codetest/domain/submission/dto/DailyCorrectCount.java | 2 +- .../submission/query/UserProblemResultQueryRepositoryImpl.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/ezcode/codetest/domain/submission/dto/DailyCorrectCount.java b/src/main/java/org/ezcode/codetest/domain/submission/dto/DailyCorrectCount.java index fa3813e0..b30b8651 100644 --- a/src/main/java/org/ezcode/codetest/domain/submission/dto/DailyCorrectCount.java +++ b/src/main/java/org/ezcode/codetest/domain/submission/dto/DailyCorrectCount.java @@ -5,6 +5,6 @@ public record DailyCorrectCount( LocalDate date, - long count, + Long count, Set problemIds ) { } diff --git a/src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/submission/query/UserProblemResultQueryRepositoryImpl.java b/src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/submission/query/UserProblemResultQueryRepositoryImpl.java index 3ec9f236..2bc42544 100644 --- a/src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/submission/query/UserProblemResultQueryRepositoryImpl.java +++ b/src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/submission/query/UserProblemResultQueryRepositoryImpl.java @@ -1,6 +1,7 @@ package org.ezcode.codetest.infrastructure.persistence.repository.submission.query; +import java.time.LocalDate; import java.util.List; import java.util.Set; @@ -27,7 +28,7 @@ public List countCorrectByUserGroupedByDate(Long userId) { QUserProblemResult upr = QUserProblemResult.userProblemResult; - var date = Expressions.dateTemplate(java.sql.Date.class, "DATE({0})", upr.modifiedAt); + var date = Expressions.dateTemplate(LocalDate.class, "DATE({0})", upr.modifiedAt); NumberExpression countDistinctProblem = upr.problem.id.countDistinct(); return queryFactory From 496566d52de9d0de6c08c503ce2d91968071312f Mon Sep 17 00:00:00 2001 From: minjee2758 Date: Thu, 11 Sep 2025 16:50:36 +0900 Subject: [PATCH 6/7] =?UTF-8?q?=EC=BF=BC=EB=A6=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UserProblemResultQueryRepositoryImpl.java | 45 ++++++++++++++----- 1 file changed, 33 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/submission/query/UserProblemResultQueryRepositoryImpl.java b/src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/submission/query/UserProblemResultQueryRepositoryImpl.java index 2bc42544..c6e49bd9 100644 --- a/src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/submission/query/UserProblemResultQueryRepositoryImpl.java +++ b/src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/submission/query/UserProblemResultQueryRepositoryImpl.java @@ -2,8 +2,12 @@ import java.time.LocalDate; +import java.util.HashSet; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; import java.util.Set; +import java.util.stream.Collectors; import org.ezcode.codetest.domain.submission.dto.DailyCorrectCount; import org.ezcode.codetest.domain.submission.model.entity.QUserProblemResult; @@ -29,24 +33,41 @@ public List countCorrectByUserGroupedByDate(Long userId) { QUserProblemResult upr = QUserProblemResult.userProblemResult; var date = Expressions.dateTemplate(LocalDate.class, "DATE({0})", upr.modifiedAt); - NumberExpression countDistinctProblem = upr.problem.id.countDistinct(); - return queryFactory + // transform() 대신 일반 쿼리로 변경 + var results = queryFactory + .select( + date, + upr.problem.id.countDistinct(), + upr.problem.id + ) .from(upr) .where( upr.user.id.eq(userId), upr.isCorrect.eq(true) ) + .groupBy(date) .orderBy(date.asc()) - .transform( - GroupBy.groupBy(date).list( - Projections.constructor( - DailyCorrectCount.class, - date, - countDistinctProblem, - GroupBy.set(upr.problem.id) - ) - ) - ); + .fetch(); + + // 결과를 수동으로 그룹화해야함 + Map> problemIdsByDate = new LinkedHashMap<>(); + Map countsByDate = new LinkedHashMap<>(); + + for (var result : results) { + LocalDate resultDate = result.get(0, LocalDate.class); + Long problemId = result.get(2, Long.class); + + problemIdsByDate.computeIfAbsent(resultDate, k -> new HashSet<>()).add(problemId); + countsByDate.put(resultDate, (long) problemIdsByDate.get(resultDate).size()); + } + + return problemIdsByDate.entrySet().stream() + .map(entry -> new DailyCorrectCount( + entry.getKey(), + countsByDate.get(entry.getKey()), + entry.getValue() + )) + .collect(Collectors.toList()); } } From ca08a7705c294de0759e7fd679939a74478fccf5 Mon Sep 17 00:00:00 2001 From: minjee2758 Date: Thu, 11 Sep 2025 16:54:30 +0900 Subject: [PATCH 7/7] =?UTF-8?q?=EC=98=A4=ED=83=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../query/UserProblemResultQueryRepositoryImpl.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/submission/query/UserProblemResultQueryRepositoryImpl.java b/src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/submission/query/UserProblemResultQueryRepositoryImpl.java index a83c0456..174e31eb 100644 --- a/src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/submission/query/UserProblemResultQueryRepositoryImpl.java +++ b/src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/submission/query/UserProblemResultQueryRepositoryImpl.java @@ -8,15 +8,10 @@ import java.util.Map; import java.util.Set; import java.util.stream.Collectors; -] import org.ezcode.codetest.domain.submission.dto.DailyCorrectCount; import org.ezcode.codetest.domain.submission.model.entity.QUserProblemResult; import org.springframework.stereotype.Repository; - -import com.querydsl.core.group.GroupBy; -import com.querydsl.core.types.Projections; -import com.querydsl.core.types.dsl.NumberExpression; import com.querydsl.core.types.dsl.Expressions; import com.querydsl.jpa.impl.JPAQueryFactory;