From 295c99cdbb0d90ff2ac77d323453184fa3b87257 Mon Sep 17 00:00:00 2001 From: sejinmac Date: Wed, 3 Dec 2025 12:44:26 +0900 Subject: [PATCH 1/8] =?UTF-8?q?fix:=20yml=20=ED=8C=8C=EC=9D=BC=EA=B3=BC=20?= =?UTF-8?q?build.gradle=20=EC=9D=98=EC=A1=B4=EC=84=B1=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=20-=20yml=20=ED=8C=8C=EC=9D=BC=20=EC=B6=94=EA=B0=80=20,=20jwt?= =?UTF-8?q?=20=EC=8B=9C=ED=81=AC=EB=A6=BF=20=ED=82=A4=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=20-=20h2=20database=20=EC=9D=98=EC=A1=B4=EC=84=B1=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 +- src/main/java/resources/application.yml | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 src/main/java/resources/application.yml diff --git a/build.gradle b/build.gradle index 02cdc00bb..f87def171 100644 --- a/build.gradle +++ b/build.gradle @@ -32,7 +32,7 @@ dependencies { annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' - + runtimeOnly 'com.h2database:h2' // bcrypt implementation 'at.favre.lib:bcrypt:0.10.2' diff --git a/src/main/java/resources/application.yml b/src/main/java/resources/application.yml new file mode 100644 index 000000000..0d70066de --- /dev/null +++ b/src/main/java/resources/application.yml @@ -0,0 +1,20 @@ +spring: + datasource: + driver-class-name: com.mysql.cj.jdbc.Driver + username: root + url: jdbc:mysql://localhost:3306/expert + password: '12345678' + jpa: + open-in-view: false + properties: + hibernate: + dialect: org.hibernate.dialect.MySQLDialect + format_sql: 'true' + hibernate: + ddl-auto: create + show-sql: 'true' + application: + name: expert +jwt: + secret: ${jwt.secret.key} + expirationMs: 86400000 From fc54fb984c20567df6b2088ce8f6697b256a3e08 Mon Sep 17 00:00:00 2001 From: sejinmac Date: Wed, 3 Dec 2025 20:48:10 +0900 Subject: [PATCH 2/8] =?UTF-8?q?fix:=20AuthUserArgumentResolver=20=EB=B3=B5?= =?UTF-8?q?=EA=B5=AC=20-=20AuthUserArgumentResolver=EC=97=90=20@Component?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80=20-=20WebConfig=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/AuthUserArgumentResolver.java | 4 +++- .../org/example/expert/config/WebConfig.java | 20 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/example/expert/config/WebConfig.java diff --git a/src/main/java/org/example/expert/config/AuthUserArgumentResolver.java b/src/main/java/org/example/expert/config/AuthUserArgumentResolver.java index db00211de..ebf4cc195 100644 --- a/src/main/java/org/example/expert/config/AuthUserArgumentResolver.java +++ b/src/main/java/org/example/expert/config/AuthUserArgumentResolver.java @@ -1,17 +1,19 @@ package org.example.expert.config; import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; import org.example.expert.domain.auth.exception.AuthException; import org.example.expert.domain.common.annotation.Auth; import org.example.expert.domain.common.dto.AuthUser; import org.example.expert.domain.user.enums.UserRole; import org.springframework.core.MethodParameter; import org.springframework.lang.Nullable; +import org.springframework.stereotype.Component; import org.springframework.web.bind.support.WebDataBinderFactory; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.method.support.ModelAndViewContainer; - +@Component public class AuthUserArgumentResolver implements HandlerMethodArgumentResolver { @Override diff --git a/src/main/java/org/example/expert/config/WebConfig.java b/src/main/java/org/example/expert/config/WebConfig.java new file mode 100644 index 000000000..5fafb996f --- /dev/null +++ b/src/main/java/org/example/expert/config/WebConfig.java @@ -0,0 +1,20 @@ +package org.example.expert.config; + +import lombok.RequiredArgsConstructor; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.method.support.HandlerMethodArgumentResolver; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import java.util.List; + +@Configuration +@RequiredArgsConstructor +public class WebConfig implements WebMvcConfigurer { + + private final AuthUserArgumentResolver authUserArgumentResolver; + + @Override + public void addArgumentResolvers(List resolvers) { + resolvers.add(authUserArgumentResolver); + } +} \ No newline at end of file From 69630ea1c05c464db0ddc8e3fd75a277ff1ab80e Mon Sep 17 00:00:00 2001 From: sejinmac Date: Thu, 4 Dec 2025 12:02:20 +0900 Subject: [PATCH 3/8] =?UTF-8?q?refactor:=20SignupResponse=20if=20=EB=AC=B8?= =?UTF-8?q?=20=EC=9C=84=EC=B9=98=20=EB=A6=AC=ED=8E=99=ED=84=B0=EB=A7=81=20?= =?UTF-8?q?-=20=EC=9D=B4=EC=97=90=EC=9D=BC=20=EA=B2=80=EC=A6=9D=EC=97=90?= =?UTF-8?q?=20=EB=8C=80=ED=95=9C=20=EC=9C=84=EC=B9=98=EB=A5=BC=20encodedPa?= =?UTF-8?q?ssword=20=EC=9C=84=EB=A1=9C=20=EC=98=AE=EA=B9=80.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/expert/domain/auth/service/AuthService.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/example/expert/domain/auth/service/AuthService.java b/src/main/java/org/example/expert/domain/auth/service/AuthService.java index 3dd3bb7c1..c573dcb9e 100644 --- a/src/main/java/org/example/expert/domain/auth/service/AuthService.java +++ b/src/main/java/org/example/expert/domain/auth/service/AuthService.java @@ -26,14 +26,14 @@ public class AuthService { @Transactional public SignupResponse signup(SignupRequest signupRequest) { - String encodedPassword = passwordEncoder.encode(signupRequest.getPassword()); - - UserRole userRole = UserRole.of(signupRequest.getUserRole()); - if (userRepository.existsByEmail(signupRequest.getEmail())) { throw new InvalidRequestException("이미 존재하는 이메일입니다."); } + String encodedPassword = passwordEncoder.encode(signupRequest.getPassword()); + + UserRole userRole = UserRole.of(signupRequest.getUserRole()); + User newUser = new User( signupRequest.getEmail(), encodedPassword, From c6193ae0703a550aa036e37fb472812a8271dbcf Mon Sep 17 00:00:00 2001 From: sejinmac Date: Thu, 4 Dec 2025 12:41:49 +0900 Subject: [PATCH 4/8] =?UTF-8?q?refactor:=20WeatherClient=20=EC=9D=98=20if?= =?UTF-8?q?=EB=AC=B8=20=EB=A6=AC=ED=8E=99=ED=84=B0=EB=A7=81=20-=20else=20?= =?UTF-8?q?=EB=AC=B8=EC=9D=80=20=EC=A0=9C=EA=B1=B0=ED=95=98=EA=B3=A0=20if?= =?UTF-8?q?=EB=AC=B8=EC=9D=84=20=EB=B6=84=EB=A6=AC=20=EC=8B=9C=EC=BC=9C?= =?UTF-8?q?=EB=86=93=EC=95=84=20=EA=B0=80=EB=8F=85=EC=84=B1=EC=9D=B4=20?= =?UTF-8?q?=EC=A2=8B=EC=95=84=EC=A1=8C=EC=9D=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/example/expert/client/WeatherClient.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/example/expert/client/WeatherClient.java b/src/main/java/org/example/expert/client/WeatherClient.java index d8ec223e7..166a4b741 100644 --- a/src/main/java/org/example/expert/client/WeatherClient.java +++ b/src/main/java/org/example/expert/client/WeatherClient.java @@ -29,10 +29,10 @@ public String getTodayWeather() { WeatherDto[] weatherArray = responseEntity.getBody(); if (!HttpStatus.OK.equals(responseEntity.getStatusCode())) { throw new ServerException("날씨 데이터를 가져오는데 실패했습니다. 상태 코드: " + responseEntity.getStatusCode()); - } else { - if (weatherArray == null || weatherArray.length == 0) { - throw new ServerException("날씨 데이터가 없습니다."); - } + } + + if (weatherArray == null || weatherArray.length == 0) { + throw new ServerException("날씨 데이터가 없습니다."); } String today = getCurrentDate(); From 750ab70a055102a903e9f331587a91ac056d1ce1 Mon Sep 17 00:00:00 2001 From: sejinmac Date: Thu, 4 Dec 2025 14:39:40 +0900 Subject: [PATCH 5/8] =?UTF-8?q?refactor:=20UserService=20=EC=9D=B4?= =?UTF-8?q?=EB=A9=94=EC=9D=BC=20=EA=B2=80=EC=A6=9D=20=EB=B3=80=EA=B2=BD=20?= =?UTF-8?q?-=20=EC=84=9C=EB=B9=84=EC=8A=A4=EB=8B=A8=EC=9D=98=20if=EB=AC=B8?= =?UTF-8?q?=20=EA=B2=80=EC=A6=9D=EC=97=90=EC=84=9C=20UserChangePasswordReq?= =?UTF-8?q?uest=20=EC=97=90=EC=84=9C=20=EA=B2=80=EC=A6=9D=ED=95=A0=20?= =?UTF-8?q?=EC=88=98=20=EC=9E=88=EB=8F=84=EB=A1=9D=20@Pattern=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20-=20UserController=20=EC=97=90=EC=84=9C=20RequrstBo?= =?UTF-8?q?dy=20=EC=97=90=20@Vaild=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../expert/domain/user/controller/UserController.java | 3 ++- .../domain/user/dto/request/UserChangePasswordRequest.java | 7 +++++++ .../example/expert/domain/user/service/UserService.java | 5 ----- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/example/expert/domain/user/controller/UserController.java b/src/main/java/org/example/expert/domain/user/controller/UserController.java index bb1ef7a95..5ae291070 100644 --- a/src/main/java/org/example/expert/domain/user/controller/UserController.java +++ b/src/main/java/org/example/expert/domain/user/controller/UserController.java @@ -1,5 +1,6 @@ package org.example.expert.domain.user.controller; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.example.expert.domain.common.annotation.Auth; import org.example.expert.domain.common.dto.AuthUser; @@ -21,7 +22,7 @@ public ResponseEntity getUser(@PathVariable long userId) { } @PutMapping("/users") - public void changePassword(@Auth AuthUser authUser, @RequestBody UserChangePasswordRequest userChangePasswordRequest) { + public void changePassword(@Auth AuthUser authUser, @Valid @RequestBody UserChangePasswordRequest userChangePasswordRequest) { userService.changePassword(authUser.getId(), userChangePasswordRequest); } } diff --git a/src/main/java/org/example/expert/domain/user/dto/request/UserChangePasswordRequest.java b/src/main/java/org/example/expert/domain/user/dto/request/UserChangePasswordRequest.java index 3ba93dde5..ff3c31b82 100644 --- a/src/main/java/org/example/expert/domain/user/dto/request/UserChangePasswordRequest.java +++ b/src/main/java/org/example/expert/domain/user/dto/request/UserChangePasswordRequest.java @@ -1,9 +1,11 @@ package org.example.expert.domain.user.dto.request; import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Pattern; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; +import org.example.expert.domain.common.exception.InvalidRequestException; @Getter @NoArgsConstructor @@ -13,5 +15,10 @@ public class UserChangePasswordRequest { @NotBlank private String oldPassword; @NotBlank + @Pattern(regexp = "^(?=.*[A-Z])(?=.*\\d).{8,}$", + message = "새 비밀번호는 8자 이상이어야 하고, 숫자와 대문자를 포함해야 합니다." + ) private String newPassword; + + } diff --git a/src/main/java/org/example/expert/domain/user/service/UserService.java b/src/main/java/org/example/expert/domain/user/service/UserService.java index 565c213f9..04a16b710 100644 --- a/src/main/java/org/example/expert/domain/user/service/UserService.java +++ b/src/main/java/org/example/expert/domain/user/service/UserService.java @@ -25,11 +25,6 @@ public UserResponse getUser(long userId) { @Transactional public void changePassword(long userId, UserChangePasswordRequest userChangePasswordRequest) { - if (userChangePasswordRequest.getNewPassword().length() < 8 || - !userChangePasswordRequest.getNewPassword().matches(".*\\d.*") || - !userChangePasswordRequest.getNewPassword().matches(".*[A-Z].*")) { - throw new InvalidRequestException("새 비밀번호는 8자 이상이어야 하고, 숫자와 대문자를 포함해야 합니다."); - } User user = userRepository.findById(userId) .orElseThrow(() -> new InvalidRequestException("User not found")); From 9b6ada607c5fd44d5a423132325cb18701423f32 Mon Sep 17 00:00:00 2001 From: sejinmac Date: Thu, 4 Dec 2025 16:34:06 +0900 Subject: [PATCH 6/8] =?UTF-8?q?refactor:=20TodoRepository=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20-=20@Query=20=EC=97=90=EC=84=9C=20=20@EntityGraph?= =?UTF-8?q?=20=EB=A1=9C=20=EB=B3=80=EA=B2=BD=20-=20=EB=8D=94=EB=AF=B8?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=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 --- .../java/org/example/expert/InitData.java | 146 ++++++++++++++++++ .../todo/repository/TodoRepository.java | 4 +- 2 files changed, 149 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/example/expert/InitData.java diff --git a/src/main/java/org/example/expert/InitData.java b/src/main/java/org/example/expert/InitData.java new file mode 100644 index 000000000..5af5fb9b3 --- /dev/null +++ b/src/main/java/org/example/expert/InitData.java @@ -0,0 +1,146 @@ +package org.example.expert; + +import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; +import org.example.expert.client.WeatherClient; +import org.example.expert.config.PasswordEncoder; +import org.example.expert.domain.comment.entity.Comment; +import org.example.expert.domain.comment.repository.CommentRepository; +import org.example.expert.domain.todo.entity.Todo; +import org.example.expert.domain.todo.repository.TodoRepository; +import org.example.expert.domain.user.entity.User; +import org.example.expert.domain.user.enums.UserRole; +import org.example.expert.domain.user.repository.UserRepository; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class InitData { + + private final UserRepository userRepository; + private final PasswordEncoder passwordEncoder; + private final TodoRepository todoRepository; + private final WeatherClient weatherClient; + private final CommentRepository commentRepository; + + @PostConstruct + public void init() { + + String encodedPassword = passwordEncoder.encode("TestTest1"); + + UserRole userRole1 = UserRole.of("ADMIN"); + UserRole userRole2 = UserRole.of("USER"); + + User newUser = new User( + "lee@seo.jun", + encodedPassword, + userRole1 + ); + + User newUser1 = new User( + "lee@jun.beum", + encodedPassword, + userRole2 + ); + + User savedUser = userRepository.save(newUser); + User savedUser1 = userRepository.save(newUser1); + + + String weather = weatherClient.getTodayWeather(); + + Todo newTodo = new Todo( + "TODO 테스트", + "TODO 내용인가요", + weather, + savedUser + ); + + Todo newTodo2 = new Todo( + "TODO 테스트", + "TODO 내용인가요", + weather, + savedUser + ); + + Todo newTodo3 = new Todo( + "TODO 테스트", + "TODO 내용인가요", + weather, + savedUser1 + ); + Todo newTodo4 = new Todo( + "TODO 테스트", + "TODO 내용인가요", + weather, + savedUser1 + ); + Todo newTodo5 = new Todo( + "TODO 테스트", + "TODO 내용인가요", + weather, + savedUser + ); + + Todo savedTodo = todoRepository.save(newTodo); + Todo savedTodo1 = todoRepository.save(newTodo2); + Todo savedTodo2 = todoRepository.save(newTodo3); + Todo savedTodo3 = todoRepository.save(newTodo4); + Todo savedTodo4 = todoRepository.save(newTodo5); + + Comment newComment = new Comment( + "댓글 내용입니다.", + newUser, + savedTodo + ); + Comment newComment1 = new Comment( + "댓글 내용입니다.", + newUser1, + savedTodo + );Comment newComment2 = new Comment( + "댓글 내용입니다.", + newUser1, + savedTodo + );Comment newComment3 = new Comment( + "댓글 내용입니다.", + newUser, + savedTodo2 + );Comment newComment4 = new Comment( + "댓글 내용입니다.", + newUser, + savedTodo3 + );Comment newComment5 = new Comment( + "댓글 내용입니다.", + newUser, + savedTodo4 + );Comment newComment6 = new Comment( + "댓글 내용입니다.", + newUser, + savedTodo1 + );Comment newComment7 = new Comment( + "댓글 내용입니다.", + newUser, + savedTodo + );Comment newComment8 = new Comment( + "댓글 내용입니다.", + newUser, + savedTodo + );Comment newComment9 = new Comment( + "댓글 내용입니다.", + newUser, + savedTodo + ); + + Comment savedComment = commentRepository.save(newComment); + Comment savedComment1 = commentRepository.save(newComment1); + Comment savedComment2 = commentRepository.save(newComment2); + Comment savedComment3 = commentRepository.save(newComment3); + Comment savedComment4 = commentRepository.save(newComment4); + Comment savedComment5 = commentRepository.save(newComment5); + Comment savedComment6 = commentRepository.save(newComment6); + Comment savedComment7 = commentRepository.save(newComment7); + Comment savedComment8 = commentRepository.save(newComment8); + Comment savedComment9 = commentRepository.save(newComment9); + + } +} \ No newline at end of file diff --git a/src/main/java/org/example/expert/domain/todo/repository/TodoRepository.java b/src/main/java/org/example/expert/domain/todo/repository/TodoRepository.java index 064e74f9a..0b0b1b7ff 100644 --- a/src/main/java/org/example/expert/domain/todo/repository/TodoRepository.java +++ b/src/main/java/org/example/expert/domain/todo/repository/TodoRepository.java @@ -3,6 +3,7 @@ import org.example.expert.domain.todo.entity.Todo; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.EntityGraph; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; @@ -11,7 +12,8 @@ public interface TodoRepository extends JpaRepository { - @Query("SELECT t FROM Todo t LEFT JOIN FETCH t.user u ORDER BY t.modifiedAt DESC") + + @EntityGraph(attributePaths = "user") Page findAllByOrderByModifiedAtDesc(Pageable pageable); @Query("SELECT t FROM Todo t " + From db026a2f883a262e0a33e3b12b10664677ff6ca0 Mon Sep 17 00:00:00 2001 From: sejinmac Date: Thu, 4 Dec 2025 23:44:57 +0900 Subject: [PATCH 7/8] =?UTF-8?q?refactor:=20PasswordEncoderTest=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EB=B3=80=EA=B2=BD=20-=20match=20=EC=95=88?= =?UTF-8?q?=20=EC=9D=B8=EC=9E=90=EA=B0=92=20=EC=88=9C=EC=84=9C=20=EB=B0=94?= =?UTF-8?q?=EA=BF=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/example/expert/config/PasswordEncoderTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/org/example/expert/config/PasswordEncoderTest.java b/src/test/java/org/example/expert/config/PasswordEncoderTest.java index 694643d7e..c02d75089 100644 --- a/src/test/java/org/example/expert/config/PasswordEncoderTest.java +++ b/src/test/java/org/example/expert/config/PasswordEncoderTest.java @@ -20,7 +20,7 @@ class PasswordEncoderTest { String encodedPassword = passwordEncoder.encode(rawPassword); // when - boolean matches = passwordEncoder.matches(encodedPassword, rawPassword); + boolean matches = passwordEncoder.matches(rawPassword, encodedPassword); // then assertTrue(matches); From fffc28ddbc42910aab9c67cae8e393f6187c30d4 Mon Sep 17 00:00:00 2001 From: sejinmac Date: Fri, 5 Dec 2025 11:00:48 +0900 Subject: [PATCH 8/8] =?UTF-8?q?refactor:=20=EC=98=88=EC=99=B8=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=EB=A6=AC=ED=8E=99=ED=84=B0=EB=A7=81=20-CommentServ?= =?UTF-8?q?ice=EC=9D=98=20CommentSaveResponse=20=EC=98=88=EC=99=B8?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20=EC=88=98=EC=A0=95=20-MangerService=20Tset?= =?UTF-8?q?=20=20=EC=97=90=EC=84=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=9D=B4=EB=A6=84=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD,=20then=20=20=EC=97=90=EC=84=9C=20=EB=B9=84=EA=B5=90?= =?UTF-8?q?=EC=A1=B0=EA=B1=B4=20=EC=88=98=EC=A0=95=20-MangerService=20?= =?UTF-8?q?=EC=97=90=EC=84=9C=20if=EB=AC=B8=20todo=EC=9E=91=EC=84=B1?= =?UTF-8?q?=ED=95=9C=20=EC=9C=A0=EC=A0=80=EA=B0=80=20null=20=20=EC=9D=B8?= =?UTF-8?q?=EC=A7=80=20=20=EC=A1=B0=EA=B1=B4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../example/expert/domain/comment/service/CommentService.java | 3 ++- .../example/expert/domain/manager/service/ManagerService.java | 3 ++- .../expert/domain/manager/service/ManagerServiceTest.java | 4 ++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/example/expert/domain/comment/service/CommentService.java b/src/main/java/org/example/expert/domain/comment/service/CommentService.java index aec0bf03c..70b28f103 100644 --- a/src/main/java/org/example/expert/domain/comment/service/CommentService.java +++ b/src/main/java/org/example/expert/domain/comment/service/CommentService.java @@ -8,6 +8,7 @@ import org.example.expert.domain.comment.repository.CommentRepository; import org.example.expert.domain.common.dto.AuthUser; import org.example.expert.domain.common.exception.InvalidRequestException; +import org.example.expert.domain.common.exception.ServerException; import org.example.expert.domain.todo.entity.Todo; import org.example.expert.domain.todo.repository.TodoRepository; import org.example.expert.domain.user.dto.response.UserResponse; @@ -29,7 +30,7 @@ public class CommentService { public CommentSaveResponse saveComment(AuthUser authUser, long todoId, CommentSaveRequest commentSaveRequest) { User user = User.fromAuthUser(authUser); Todo todo = todoRepository.findById(todoId).orElseThrow(() -> - new InvalidRequestException("Todo not found")); + new ServerException("Todo not found")); Comment newComment = new Comment( commentSaveRequest.getContents(), diff --git a/src/main/java/org/example/expert/domain/manager/service/ManagerService.java b/src/main/java/org/example/expert/domain/manager/service/ManagerService.java index ad3c08ce4..781b9cafc 100644 --- a/src/main/java/org/example/expert/domain/manager/service/ManagerService.java +++ b/src/main/java/org/example/expert/domain/manager/service/ManagerService.java @@ -35,7 +35,8 @@ public ManagerSaveResponse saveManager(AuthUser authUser, long todoId, ManagerSa Todo todo = todoRepository.findById(todoId) .orElseThrow(() -> new InvalidRequestException("Todo not found")); - if (!ObjectUtils.nullSafeEquals(user.getId(), todo.getUser().getId())) { + User todoCreateUser = todo.getUser(); + if (todoCreateUser == null || !ObjectUtils.nullSafeEquals(user.getId(), todo.getUser().getId())) { throw new InvalidRequestException("일정을 생성한 유저만 담당자를 지정할 수 있습니다."); } diff --git a/src/test/java/org/example/expert/domain/manager/service/ManagerServiceTest.java b/src/test/java/org/example/expert/domain/manager/service/ManagerServiceTest.java index 47ddd6205..b2b998fe5 100644 --- a/src/test/java/org/example/expert/domain/manager/service/ManagerServiceTest.java +++ b/src/test/java/org/example/expert/domain/manager/service/ManagerServiceTest.java @@ -39,14 +39,14 @@ class ManagerServiceTest { private ManagerService managerService; @Test - public void manager_목록_조회_시_Todo가_없다면_NPE_에러를_던진다() { + public void manager_목록_조회_시_Todo가_없다면_IRE_에러를_던진다() { // given long todoId = 1L; given(todoRepository.findById(todoId)).willReturn(Optional.empty()); // when & then InvalidRequestException exception = assertThrows(InvalidRequestException.class, () -> managerService.getManagers(todoId)); - assertEquals("Manager not found", exception.getMessage()); + assertEquals("Todo not found", exception.getMessage()); } @Test