diff --git a/build.gradle b/build.gradle index 02cdc00bb..46d9ab916 100644 --- a/build.gradle +++ b/build.gradle @@ -32,6 +32,7 @@ dependencies { annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' + implementation 'org.springframework.boot:spring-boot-starter-security' // bcrypt implementation 'at.favre.lib:bcrypt:0.10.2' diff --git a/src/main/java/org/example/expert/client/WeatherClient.java b/src/main/java/org/example/expert/client/WeatherClient.java index d8ec223e7..a4fefc2bd 100644 --- a/src/main/java/org/example/expert/client/WeatherClient.java +++ b/src/main/java/org/example/expert/client/WeatherClient.java @@ -3,7 +3,6 @@ import org.example.expert.client.dto.WeatherDto; import org.example.expert.domain.common.exception.ServerException; import org.springframework.boot.web.client.RestTemplateBuilder; -import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; @@ -26,13 +25,16 @@ public String getTodayWeather() { ResponseEntity responseEntity = restTemplate.getForEntity(buildWeatherApiUri(), WeatherDto[].class); + if (!responseEntity.getStatusCode().is2xxSuccessful()) { + throw new ServerException( + "날씨 데이터를 가져오는데 실패했습니다. 상태 코드: " + responseEntity.getStatusCode() + ); + } + 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(); diff --git a/src/main/java/org/example/expert/config/AuthUserArgumentResolver.java b/src/main/java/org/example/expert/config/AuthUserArgumentResolver.java index db00211de..a60772a9c 100644 --- a/src/main/java/org/example/expert/config/AuthUserArgumentResolver.java +++ b/src/main/java/org/example/expert/config/AuthUserArgumentResolver.java @@ -7,11 +7,13 @@ 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/SecurityConfig.java b/src/main/java/org/example/expert/config/SecurityConfig.java new file mode 100644 index 000000000..01c413115 --- /dev/null +++ b/src/main/java/org/example/expert/config/SecurityConfig.java @@ -0,0 +1,20 @@ +package org.example.expert.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; +import org.springframework.security.web.SecurityFilterChain; + +@Configuration +public class SecurityConfig { + + @Bean + public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { + http + .csrf(AbstractHttpConfigurer::disable) + .authorizeHttpRequests(auth -> auth.anyRequest().permitAll()); + + return http.build(); + } +} \ No newline at end of file diff --git a/src/main/java/org/example/expert/config/WebMvcConfig.java b/src/main/java/org/example/expert/config/WebMvcConfig.java new file mode 100644 index 000000000..3e6bdc644 --- /dev/null +++ b/src/main/java/org/example/expert/config/WebMvcConfig.java @@ -0,0 +1,31 @@ +package org.example.expert.config; + +import lombok.RequiredArgsConstructor; +import org.example.expert.domain.common.interceptor.CheckAdminInterceptor; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.method.support.HandlerMethodArgumentResolver; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import java.util.List; + +@Configuration +@RequiredArgsConstructor +public class WebMvcConfig implements WebMvcConfigurer { + + private final AuthUserArgumentResolver authUserArgumentResolver; + private final CheckAdminInterceptor checkAdminInterceptor; + + @Override + public void addArgumentResolvers(List resolvers) { + resolvers.add(authUserArgumentResolver); + } + + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(checkAdminInterceptor) + .addPathPatterns("/admin/**"); + } + + +} \ No newline at end of file diff --git a/src/main/java/org/example/expert/domain/admin/AdminFacade.java b/src/main/java/org/example/expert/domain/admin/AdminFacade.java new file mode 100644 index 000000000..a0d5391d3 --- /dev/null +++ b/src/main/java/org/example/expert/domain/admin/AdminFacade.java @@ -0,0 +1,24 @@ +package org.example.expert.domain.admin; + +import lombok.RequiredArgsConstructor; +import org.example.expert.domain.admin.service.CommentAdminService; +import org.example.expert.domain.admin.dto.UserRoleChangeRequest; +import org.example.expert.domain.admin.service.UserAdminService; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class AdminFacade { + + private final CommentAdminService commentAdminService; + private final UserAdminService userAdminService; + + public void deleteComment(long commentId) { + commentAdminService.deleteComment(commentId); + } + + public void changeUserRole(long userId, UserRoleChangeRequest request) { + userAdminService.changeUserRole(userId, request); + } + +} diff --git a/src/main/java/org/example/expert/domain/admin/controller/AdminController.java b/src/main/java/org/example/expert/domain/admin/controller/AdminController.java new file mode 100644 index 000000000..c337cda1e --- /dev/null +++ b/src/main/java/org/example/expert/domain/admin/controller/AdminController.java @@ -0,0 +1,25 @@ +package org.example.expert.domain.admin.controller; + +import lombok.RequiredArgsConstructor; +import org.example.expert.domain.admin.AdminFacade; +import org.example.expert.domain.admin.dto.UserRoleChangeRequest; +import org.springframework.web.bind.annotation.*; + +@RequestMapping("/admin") +@RestController +@RequiredArgsConstructor +public class AdminController { + + private final AdminFacade adminFacade; + + @DeleteMapping("/comments/{commentId}") + public void deleteComment(@PathVariable long commentId) { + adminFacade.deleteComment(commentId); + } + + @PatchMapping("/users/{userId}") + public void changeUserRole(@PathVariable long userId, + @RequestBody UserRoleChangeRequest request) { + adminFacade.changeUserRole(userId, request); + } +} diff --git a/src/main/java/org/example/expert/domain/user/dto/request/UserRoleChangeRequest.java b/src/main/java/org/example/expert/domain/admin/dto/UserRoleChangeRequest.java similarity index 79% rename from src/main/java/org/example/expert/domain/user/dto/request/UserRoleChangeRequest.java rename to src/main/java/org/example/expert/domain/admin/dto/UserRoleChangeRequest.java index 0d8061fa2..d67518dfa 100644 --- a/src/main/java/org/example/expert/domain/user/dto/request/UserRoleChangeRequest.java +++ b/src/main/java/org/example/expert/domain/admin/dto/UserRoleChangeRequest.java @@ -1,4 +1,4 @@ -package org.example.expert.domain.user.dto.request; +package org.example.expert.domain.admin.dto; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/src/main/java/org/example/expert/domain/comment/service/CommentAdminService.java b/src/main/java/org/example/expert/domain/admin/service/CommentAdminService.java similarity index 90% rename from src/main/java/org/example/expert/domain/comment/service/CommentAdminService.java rename to src/main/java/org/example/expert/domain/admin/service/CommentAdminService.java index 5b0c4666a..412958bb4 100644 --- a/src/main/java/org/example/expert/domain/comment/service/CommentAdminService.java +++ b/src/main/java/org/example/expert/domain/admin/service/CommentAdminService.java @@ -1,4 +1,4 @@ -package org.example.expert.domain.comment.service; +package org.example.expert.domain.admin.service; import lombok.RequiredArgsConstructor; import org.example.expert.domain.comment.repository.CommentRepository; diff --git a/src/main/java/org/example/expert/domain/user/service/UserAdminService.java b/src/main/java/org/example/expert/domain/admin/service/UserAdminService.java similarity index 87% rename from src/main/java/org/example/expert/domain/user/service/UserAdminService.java rename to src/main/java/org/example/expert/domain/admin/service/UserAdminService.java index a0040471c..4c3fbb4b4 100644 --- a/src/main/java/org/example/expert/domain/user/service/UserAdminService.java +++ b/src/main/java/org/example/expert/domain/admin/service/UserAdminService.java @@ -1,8 +1,8 @@ -package org.example.expert.domain.user.service; +package org.example.expert.domain.admin.service; import lombok.RequiredArgsConstructor; import org.example.expert.domain.common.exception.InvalidRequestException; -import org.example.expert.domain.user.dto.request.UserRoleChangeRequest; +import org.example.expert.domain.admin.dto.UserRoleChangeRequest; import org.example.expert.domain.user.entity.User; import org.example.expert.domain.user.enums.UserRole; import org.example.expert.domain.user.repository.UserRepository; 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..1b1757d57 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,13 +26,15 @@ public class AuthService { @Transactional public SignupResponse signup(SignupRequest signupRequest) { + if (userRepository.existsByEmail(signupRequest.getEmail())) { + throw new InvalidRequestException("이미 존재하는 이메일입니다."); + } + String encodedPassword = passwordEncoder.encode(signupRequest.getPassword()); UserRole userRole = UserRole.of(signupRequest.getUserRole()); - if (userRepository.existsByEmail(signupRequest.getEmail())) { - throw new InvalidRequestException("이미 존재하는 이메일입니다."); - } + User newUser = new User( signupRequest.getEmail(), diff --git a/src/main/java/org/example/expert/domain/comment/controller/CommentAdminController.java b/src/main/java/org/example/expert/domain/comment/controller/CommentAdminController.java deleted file mode 100644 index 33a2a86c0..000000000 --- a/src/main/java/org/example/expert/domain/comment/controller/CommentAdminController.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.example.expert.domain.comment.controller; - -import lombok.RequiredArgsConstructor; -import org.example.expert.domain.comment.service.CommentAdminService; -import org.springframework.web.bind.annotation.DeleteMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequiredArgsConstructor -public class CommentAdminController { - - private final CommentAdminService commentAdminService; - - @DeleteMapping("/admin/comments/{commentId}") - public void deleteComment(@PathVariable long commentId) { - commentAdminService.deleteComment(commentId); - } -} diff --git a/src/main/java/org/example/expert/domain/common/aspect/LoggingAop.java b/src/main/java/org/example/expert/domain/common/aspect/LoggingAop.java new file mode 100644 index 000000000..a9b8c4651 --- /dev/null +++ b/src/main/java/org/example/expert/domain/common/aspect/LoggingAop.java @@ -0,0 +1,55 @@ +package org.example.expert.domain.common.aspect; + +import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +@Aspect +@Slf4j +@Component +@RequiredArgsConstructor +public class LoggingAop { + + private final ObjectMapper objectMapper; + + @Around("execution(* org.example.expert.domain.admin.controller.AdminController.*(..))") + public Object commentAop(ProceedingJoinPoint joinPoint) throws Throwable { + long start = System.currentTimeMillis(); // API 요청 시각 + + ServletRequestAttributes attr = + (ServletRequestAttributes) RequestContextHolder.currentRequestAttributes(); + HttpServletRequest request = attr.getRequest(); + + Object[] args = joinPoint.getArgs(); + String requestBody = objectMapper.writeValueAsString(args); // 요청 본문 + + + Authentication auth = SecurityContextHolder.getContext().getAuthentication(); + String userId = auth.getName(); + + Object result = joinPoint.proceed(); + + String responseBody = objectMapper.writeValueAsString(result); // 응답 본문 + log.info(" 유저 아이디 : {}," + + " API 요청 시각 : {}" + + " API 요청 URL : {}" + + " 요청 본문 : {}" + + " 응답 본문 : {}", + userId, + start, + request.getRequestURI(), + requestBody, + responseBody); + + return result; + } +} \ No newline at end of file diff --git a/src/main/java/org/example/expert/domain/common/interceptor/CheckAdminInterceptor.java b/src/main/java/org/example/expert/domain/common/interceptor/CheckAdminInterceptor.java new file mode 100644 index 000000000..4a9cf8670 --- /dev/null +++ b/src/main/java/org/example/expert/domain/common/interceptor/CheckAdminInterceptor.java @@ -0,0 +1,33 @@ +package org.example.expert.domain.common.interceptor; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.example.expert.domain.user.enums.UserRole; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; + +import java.io.IOException; +import java.time.LocalDateTime; + +@Slf4j +@Component +@RequiredArgsConstructor +public class CheckAdminInterceptor implements HandlerInterceptor { + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException { + UserRole userRole = UserRole.of((String)request.getAttribute("userRole")); + LocalDateTime reqTime = LocalDateTime.now(); + + if(!(userRole == UserRole.ADMIN)) { + log.warn("관리자 아님. 접근 거부"); + response.sendError(HttpServletResponse.SC_FORBIDDEN, "관리자만 접근할 수 있습니다."); + return false; + } + log.info("관리자 인증 성공, 요청 시각 {}, 요청 URL {}", reqTime, request.getRequestURL()); + + return true; + } +} 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..fee150c72 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,6 +35,10 @@ public ManagerSaveResponse saveManager(AuthUser authUser, long todoId, ManagerSa Todo todo = todoRepository.findById(todoId) .orElseThrow(() -> new InvalidRequestException("Todo not found")); + if(todo.getUser() == null) { + throw new InvalidRequestException("일정을 생성한 유저만 담당자를 지정할 수 있습니다."); + } + if (!ObjectUtils.nullSafeEquals(user.getId(), todo.getUser().getId())) { throw new InvalidRequestException("일정을 생성한 유저만 담당자를 지정할 수 있습니다."); } 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..e31c4976c 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,9 +3,9 @@ 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; import java.util.Optional; @@ -14,10 +14,6 @@ public interface TodoRepository extends JpaRepository { @Query("SELECT t FROM Todo t LEFT JOIN FETCH t.user u ORDER BY t.modifiedAt DESC") Page findAllByOrderByModifiedAtDesc(Pageable pageable); - @Query("SELECT t FROM Todo t " + - "LEFT JOIN FETCH t.user " + - "WHERE t.id = :todoId") - Optional findByIdWithUser(@Param("todoId") Long todoId); - - int countById(Long todoId); + @EntityGraph(attributePaths = {"user"}) + Optional findTodoById(Long todoId); } diff --git a/src/main/java/org/example/expert/domain/todo/service/TodoService.java b/src/main/java/org/example/expert/domain/todo/service/TodoService.java index cc63523d1..031e10359 100644 --- a/src/main/java/org/example/expert/domain/todo/service/TodoService.java +++ b/src/main/java/org/example/expert/domain/todo/service/TodoService.java @@ -66,7 +66,7 @@ public Page getTodos(int page, int size) { @Transactional(readOnly = true) public TodoResponse getTodo(long todoId) { - Todo todo = todoRepository.findByIdWithUser(todoId) + Todo todo = todoRepository.findTodoById(todoId) .orElseThrow(() -> new InvalidRequestException("Todo not found")); User user = todo.getUser(); diff --git a/src/main/java/org/example/expert/domain/user/controller/UserAdminController.java b/src/main/java/org/example/expert/domain/user/controller/UserAdminController.java deleted file mode 100644 index 53d45c8b5..000000000 --- a/src/main/java/org/example/expert/domain/user/controller/UserAdminController.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.example.expert.domain.user.controller; - -import lombok.RequiredArgsConstructor; -import org.example.expert.domain.user.dto.request.UserRoleChangeRequest; -import org.example.expert.domain.user.service.UserAdminService; -import org.springframework.web.bind.annotation.PatchMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequiredArgsConstructor -public class UserAdminController { - - private final UserAdminService userAdminService; - - @PatchMapping("/admin/users/{userId}") - public void changeUserRole(@PathVariable long userId, @RequestBody UserRoleChangeRequest userRoleChangeRequest) { - userAdminService.changeUserRole(userId, userRoleChangeRequest); - } -} 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..334e245f4 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,6 +1,7 @@ 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; @@ -12,6 +13,11 @@ public class UserChangePasswordRequest { @NotBlank private String oldPassword; + @NotBlank + @Pattern( + regexp = "^(?=.*[A-Z])(?=.*[a-z])(?=.*\\d).{8,}$", + message = "비밀번호는 8자 이상이며, 대문자/소문자/숫자를 포함해야 합니다." + ) private String newPassword; } diff --git a/src/main/java/org/example/expert/domain/user/enums/UserRole.java b/src/main/java/org/example/expert/domain/user/enums/UserRole.java index 6fe177896..00aebef12 100644 --- a/src/main/java/org/example/expert/domain/user/enums/UserRole.java +++ b/src/main/java/org/example/expert/domain/user/enums/UserRole.java @@ -11,6 +11,6 @@ public static UserRole of(String role) { return Arrays.stream(UserRole.values()) .filter(r -> r.name().equalsIgnoreCase(role)) .findFirst() - .orElseThrow(() -> new InvalidRequestException("유효하지 않은 UerRole")); + .orElseThrow(() -> new InvalidRequestException("유효하지 않은 UserRole")); } } 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..3ca0c117b 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,12 +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")); diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 000000000..6f2436aee --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,18 @@ +spring: + datasource: + url: jdbc:mysql://localhost:3306/nbcam + username: root + password: 12345678 + driver-class-name: com.mysql.cj.jdbc.Driver + jpa: + show-sql: true + hibernate: + ddl-auto: create-drop + properties: + hibernate: + format_sql: true + defer-datasource-initialization: true + +jwt : + secret : + key : c3ByaW5nc2VjcmV0S2V5c3ByaW5nc2VjcmV0S2V5c3ByaW5nc2VjcmV0S2V5 \ No newline at end of file diff --git a/src/test/java/org/example/expert/config/PasswordEncoderTest.java b/src/test/java/org/example/expert/config/PasswordEncoderTest.java index 694643d7e..d73b436fa 100644 --- a/src/test/java/org/example/expert/config/PasswordEncoderTest.java +++ b/src/test/java/org/example/expert/config/PasswordEncoderTest.java @@ -16,11 +16,11 @@ class PasswordEncoderTest { @Test void matches_메서드가_정상적으로_동작한다() { // given - String rawPassword = "testPassword"; + String rawPassword = "springsecretKeyspringsecretKeyspringsecretKey"; String encodedPassword = passwordEncoder.encode(rawPassword); // when - boolean matches = passwordEncoder.matches(encodedPassword, rawPassword); + boolean matches = passwordEncoder.matches(rawPassword, encodedPassword); // then assertTrue(matches); diff --git a/src/test/java/org/example/expert/domain/comment/service/CommentServiceTest.java b/src/test/java/org/example/expert/domain/comment/service/CommentServiceTest.java index ba6797dcd..af14002d2 100644 --- a/src/test/java/org/example/expert/domain/comment/service/CommentServiceTest.java +++ b/src/test/java/org/example/expert/domain/comment/service/CommentServiceTest.java @@ -5,6 +5,7 @@ import org.example.expert.domain.comment.entity.Comment; 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; @@ -43,7 +44,7 @@ class CommentServiceTest { given(todoRepository.findById(anyLong())).willReturn(Optional.empty()); // when - ServerException exception = assertThrows(ServerException.class, () -> { + InvalidRequestException exception = assertThrows(InvalidRequestException.class, () -> { commentService.saveComment(authUser, todoId, request); }); 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..9480bf7b1 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 @@ -12,6 +12,7 @@ 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.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; @@ -38,15 +39,22 @@ class ManagerServiceTest { @InjectMocks private ManagerService managerService; + @BeforeEach + void init() { + todoRepository.save(new Todo()); + } + @Test - public void manager_목록_조회_시_Todo가_없다면_NPE_에러를_던진다() { + public void manager_목록_조회_시_Todo가_없다면_InvalidRequestException_에러를_던진다() { // 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()); + InvalidRequestException exception = assertThrows( + InvalidRequestException.class, + () -> managerService.getManagers(todoId)); + assertEquals("Todo not found", exception.getMessage()); } @Test