From 25b68ef44d9c3eb2953b04659c5add396388cf3c Mon Sep 17 00:00:00 2001 From: Kwak Seong Joon Date: Thu, 23 Jan 2025 07:55:08 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20valid=20=EC=88=98=EC=A0=95=20-=20#136?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cakey-api/build.gradle | 4 +++ .../cakey/cake/controller/CakeController.java | 17 +++++---- .../controller/CakeLikesController.java | 2 ++ .../filter/RequiredAuthenticationFilter.java | 3 +- .../handler/GlobalExceptionHandler.java | 8 ++++- .../store/controller/StoreController.java | 11 +++--- .../cakey/user/controller/UserController.java | 4 +-- .../java/com/cakey/validate/EnumValue.java | 27 -------------- .../cakey/validate/ValueOfEnumValidator.java | 36 ------------------- .../src/main/resources/logback-spring.xml | 2 +- .../java/com/cakey/client/dto/LoginReq.java | 4 +-- .../java/com/cakey/store/domain/Station.java | 6 +++- 12 files changed, 39 insertions(+), 85 deletions(-) delete mode 100644 cakey-api/src/main/java/com/cakey/validate/EnumValue.java delete mode 100644 cakey-api/src/main/java/com/cakey/validate/ValueOfEnumValidator.java diff --git a/cakey-api/build.gradle b/cakey-api/build.gradle index e442738..0963c0d 100644 --- a/cakey-api/build.gradle +++ b/cakey-api/build.gradle @@ -13,6 +13,10 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-actuator' implementation 'org.springframework.boot:spring-boot-starter-security' + //로깅 +// implementation group: "ch.qos.logback", name:"logback-classic", version:"1.4.7" +// implementation 'org.slf4j:slf4j-api:1.7.36' + implementation 'org.springframework.cloud:spring-cloud-starter-openfeign:4.1.0' //feign implementation group: 'io.jsonwebtoken', name: 'jjwt-api', version: '0.11.5' //jwt 의존성 diff --git a/cakey-api/src/main/java/com/cakey/cake/controller/CakeController.java b/cakey-api/src/main/java/com/cakey/cake/controller/CakeController.java index ddfcc90..5611efe 100644 --- a/cakey-api/src/main/java/com/cakey/cake/controller/CakeController.java +++ b/cakey-api/src/main/java/com/cakey/cake/controller/CakeController.java @@ -8,7 +8,6 @@ import com.cakey.common.response.BaseResponse; import com.cakey.rescode.SuccessCode; import com.cakey.store.domain.Station; -import com.cakey.validate.EnumValue; import jakarta.validation.constraints.Min; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; @@ -26,7 +25,7 @@ public class CakeController { @GetMapping("/station/latest") public ResponseEntity> getLatestCakesByStationStore( @UserId final Long userId, - @RequestParam(value = "station", required = true) @EnumValue(enumClass = Station.class, message = "유효하지 않는 station입니다.") final Station station, + @RequestParam(value = "station", required = true) final Station station, @RequestParam(value = "cakeIdCursor", required = false) final Long cakeIdCursor, @RequestParam(value = "size", defaultValue = "10", required = false) final int size ) { @@ -38,7 +37,7 @@ public ResponseEntity> getLatestCakesByStationStore( @GetMapping("/station/popularity") public ResponseEntity> getPopularCakesByStationStore( @UserId final Long userId, - @RequestParam(value = "station", required = true) @EnumValue(enumClass = Station.class, message = "유효하지 않는 station입니다.") final Station station, + @RequestParam(value = "station", required = true) final Station station, @RequestParam(value = "cakeLikesCursor", required = false) final Integer cakeLikesCursor, @RequestParam(value = "cakeIdCursor", required = false) final Long cakeIdCursor, @RequestParam(value = "size", defaultValue = "10", required = false) final int size @@ -62,8 +61,8 @@ public ResponseEntity> getRankCakesByStationStore( public ResponseEntity> getCakeSelect( @UserId final Long userId, @PathVariable(value = "cakeId") @Min(1) final long cakeId, - @RequestParam(value = "dayCategory") @EnumValue(enumClass = DayCategory.class, message = "유효하지 않는 DayCategory입니다.") final DayCategory dayCategory, - @RequestParam(value = "themeName") @EnumValue(enumClass = ThemeName.class, message = "유효하지 않는 ThemeName입니다.") final ThemeName themeName + @RequestParam(value = "dayCategory") final DayCategory dayCategory, + @RequestParam(value = "themeName") final ThemeName themeName ) { return ApiResponseUtil.success( SuccessCode.OK, @@ -75,8 +74,8 @@ public ResponseEntity> getCakeSelect( @GetMapping("/latest") public ResponseEntity> getLatestCakes( @UserId final Long userId, - @RequestParam(value = "dayCategory") @EnumValue(enumClass = DayCategory.class, message = "유효하지 않는 DayCategory입니다.") final DayCategory dayCategory, - @RequestParam(value = "themeName") @EnumValue(enumClass = ThemeName.class, message = "유효하지 않는 ThemeName입니다.") final ThemeName themeName, + @RequestParam(value = "dayCategory") final DayCategory dayCategory, + @RequestParam(value = "themeName") final ThemeName themeName, @RequestParam(value = "cakeIdCursor", required = false) final Long cakeIdCursor, @RequestParam(value = "size", required = false, defaultValue = "10") final int size ) { @@ -90,8 +89,8 @@ public ResponseEntity> getLatestCakes( @GetMapping("/popularity") public ResponseEntity> getPopularCakes( @UserId final Long userId, - @RequestParam(value = "dayCategory") @EnumValue(enumClass = DayCategory.class, message = "유효하지 않는 DayCategory입니다.") final DayCategory dayCategory, - @RequestParam(value = "themeName") @EnumValue(enumClass = ThemeName.class, message = "유효하지 않는 ThemeName입니다.") final ThemeName themeName, + @RequestParam(value = "dayCategory") final DayCategory dayCategory, + @RequestParam(value = "themeName") final ThemeName themeName, @RequestParam(value = "cakeIdCursor", required = false) final Long cakeIdCursor, @RequestParam(value = "cakeLikesCursor", required = false) final Integer cakeLikesCursor, @RequestParam(value = "size", required = false, defaultValue = "10") final int size diff --git a/cakey-api/src/main/java/com/cakey/cakelikes/controller/CakeLikesController.java b/cakey-api/src/main/java/com/cakey/cakelikes/controller/CakeLikesController.java index 7a10619..c970077 100644 --- a/cakey-api/src/main/java/com/cakey/cakelikes/controller/CakeLikesController.java +++ b/cakey-api/src/main/java/com/cakey/cakelikes/controller/CakeLikesController.java @@ -8,9 +8,11 @@ import jakarta.validation.constraints.Min; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @RestController +@Validated @RequiredArgsConstructor @RequestMapping("/api/v1/cake/likes") public class CakeLikesController { diff --git a/cakey-api/src/main/java/com/cakey/common/filter/RequiredAuthenticationFilter.java b/cakey-api/src/main/java/com/cakey/common/filter/RequiredAuthenticationFilter.java index 3e9d6c9..3e8fb1e 100644 --- a/cakey-api/src/main/java/com/cakey/common/filter/RequiredAuthenticationFilter.java +++ b/cakey-api/src/main/java/com/cakey/common/filter/RequiredAuthenticationFilter.java @@ -67,6 +67,7 @@ protected void doFilterInternal( final Long userId = jwtProvider.getUserIdFromSubject(token); SecurityContextHolder.getContext().setAuthentication(new UserAuthentication(userId, null, null)); } catch (Exception e) { + throw new UserBadRequestException(ErrorBaseCode.UNAUTHORIZED); } filterChain.doFilter(request, response); } @@ -80,6 +81,6 @@ private String getAccessTokenFromCookie(final HttpServletRequest request) throws } } } - throw new UserBadRequestException(ErrorBaseCode.BAD_REQUEST_REQUEST_BODY_VALID); + throw new UserBadRequestException(ErrorBaseCode.UNAUTHORIZED); } } \ No newline at end of file diff --git a/cakey-api/src/main/java/com/cakey/exception/handler/GlobalExceptionHandler.java b/cakey-api/src/main/java/com/cakey/exception/handler/GlobalExceptionHandler.java index 5a3777b..6774c2c 100644 --- a/cakey-api/src/main/java/com/cakey/exception/handler/GlobalExceptionHandler.java +++ b/cakey-api/src/main/java/com/cakey/exception/handler/GlobalExceptionHandler.java @@ -206,7 +206,13 @@ public ResponseEntity> handleInvocationTargetException(final Inv */ @ExceptionHandler(Exception.class) public ResponseEntity> handleAllExceptions(final Exception e) { - log.error("e.getMessage() + e.getCause().getMessage()"); + if (e.getCause() == null) { + log.error(e.getMessage()); + } else { + log.error("------------------------------------------------------------------------------------------"); + log.error(e.getMessage() + "\n" + e.getCause().getMessage()); + log.error("------------------------------------------------------------------------------------------"); + } return ApiResponseUtil.failure(ErrorBaseCode.INTERNAL_SERVER_ERROR, e.getMessage()); } } diff --git a/cakey-api/src/main/java/com/cakey/store/controller/StoreController.java b/cakey-api/src/main/java/com/cakey/store/controller/StoreController.java index 82bcd68..5cbc794 100644 --- a/cakey-api/src/main/java/com/cakey/store/controller/StoreController.java +++ b/cakey-api/src/main/java/com/cakey/store/controller/StoreController.java @@ -8,13 +8,14 @@ import com.cakey.store.domain.Station; import com.cakey.store.dto.StoreCoordinateListRes; import com.cakey.store.service.StoreService; -import com.cakey.validate.EnumValue; import jakarta.validation.constraints.Min; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @RestController +@Validated @RequiredArgsConstructor @RequestMapping("/api/v1/store") public class StoreController { @@ -24,7 +25,7 @@ public class StoreController { //스토어 좌표 리스트 조회 @GetMapping("/coordinate-list") public ResponseEntity> getStoreCoordinateList( - @RequestParam(value = "station", required = true) @EnumValue(enumClass = Station.class, message = "유효하지 않는 station입니다.") final Station station + @RequestParam(value = "station", required = true) final Station station ) { return ApiResponseUtil.success( SuccessCode.OK, @@ -35,7 +36,7 @@ public ResponseEntity> getStoreCoordinateList( @GetMapping("/popularity") public ResponseEntity> getStoreInfoListByStationAndLikes( @UserId final Long userId, - @RequestParam(value = "station", required = true) @EnumValue(enumClass = Station.class, message = "유효하지 않는 Station입니다.")final Station station, + @RequestParam(value = "station", required = true) final Station station, @RequestParam(value = "likesCursor", required = false) final Integer likesCursor, @RequestParam(value = "storeIdCursor", required = false) final Long storeIdCursor, @RequestParam(value = "size", defaultValue = "10", required = false) final int size @@ -54,7 +55,7 @@ public ResponseEntity> getStoreInfoListByStationAndLikes( @GetMapping("/latest") public ResponseEntity> getStoreInfoListByStationAndLatest( @UserId final Long userId, - @RequestParam(value = "station", required = true) @EnumValue(enumClass = Station.class, message = "유효하지 않는 Station입니다.")final Station station, + @RequestParam(value = "station", required = true) final Station station, @RequestParam(value = "storeIdCursor", required = false) final Long storeIdCursor, @RequestParam(value = "size", defaultValue = "10", required = false) final int size ) { @@ -121,7 +122,7 @@ public ResponseEntity> getStoreSelectedCoordinate( //선택 스토어 조회 @GetMapping("/select/{storeId}") public ResponseEntity> getStoreSelected( - @UserId @Min(value = 1, message = "userId는 1이상이어야합니다.")final Long userId, + @UserId final Long userId, @PathVariable @Min(value = 1, message = "storeId는 1이상이어야합니다.")final long storeId) { return ApiResponseUtil.success( SuccessCode.OK, diff --git a/cakey-api/src/main/java/com/cakey/user/controller/UserController.java b/cakey-api/src/main/java/com/cakey/user/controller/UserController.java index 68427dc..b546b91 100644 --- a/cakey-api/src/main/java/com/cakey/user/controller/UserController.java +++ b/cakey-api/src/main/java/com/cakey/user/controller/UserController.java @@ -28,8 +28,8 @@ public class UserController { //로그인 @PostMapping("/login") public ResponseEntity> login( - @RequestHeader(value = "Authorization") @NotBlank(message = "authorization이 잘못되었습니다.") final String authorization, - @RequestBody @Valid final LoginReq loginReq, + @RequestHeader(value = "Authorization") final String authorization, + @RequestBody final LoginReq loginReq, HttpServletResponse response ) { final LoginSuccessRes loginSuccessRes = userService.login(authorization, loginReq.socialType(), loginReq.redirectUri(), response); diff --git a/cakey-api/src/main/java/com/cakey/validate/EnumValue.java b/cakey-api/src/main/java/com/cakey/validate/EnumValue.java deleted file mode 100644 index 5c0de27..0000000 --- a/cakey-api/src/main/java/com/cakey/validate/EnumValue.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.cakey.validate; - -import jakarta.validation.Constraint; -import jakarta.validation.Payload; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import static java.lang.annotation.ElementType.*; -import static java.lang.annotation.ElementType.TYPE_USE; -import static java.lang.annotation.RetentionPolicy.RUNTIME; - - -@Documented -@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE }) -@Retention(RUNTIME) -@Constraint(validatedBy = {ValueOfEnumValidator.class}) -public @interface EnumValue { - String message() default "Enum에 없는 값입니다. (대문자만 허용됨)"; - - Class[] groups() default { }; - - Class[] payload() default { }; - - Class> enumClass(); -} \ No newline at end of file diff --git a/cakey-api/src/main/java/com/cakey/validate/ValueOfEnumValidator.java b/cakey-api/src/main/java/com/cakey/validate/ValueOfEnumValidator.java deleted file mode 100644 index 1cafd26..0000000 --- a/cakey-api/src/main/java/com/cakey/validate/ValueOfEnumValidator.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.cakey.validate; - -import jakarta.validation.ConstraintValidator; -import jakarta.validation.ConstraintValidatorContext; - -public class ValueOfEnumValidator implements ConstraintValidator { - - private EnumValue annotation; - - @Override - public void initialize(EnumValue constraintAnnotation) { - this.annotation = constraintAnnotation; - } - - @Override - public boolean isValid(String value, ConstraintValidatorContext context) { - if (value == null || value.isEmpty()) { - return false; // null 또는 빈 값은 유효하지 않음 - } - - Object[] enumValues = this.annotation.enumClass().getEnumConstants(); - if (enumValues != null) { - for (Object enumValue : enumValues) { - // 대소문자 구분하여 비교 - if (value.equals(enumValue.toString())) { - return true; - } - } - } - // 검증 실패 메시지를 설정 - context.disableDefaultConstraintViolation(); - context.buildConstraintViolationWithTemplate(this.annotation.message()) - .addConstraintViolation(); - return false; - } -} diff --git a/cakey-api/src/main/resources/logback-spring.xml b/cakey-api/src/main/resources/logback-spring.xml index e589409..fa8942f 100644 --- a/cakey-api/src/main/resources/logback-spring.xml +++ b/cakey-api/src/main/resources/logback-spring.xml @@ -28,7 +28,7 @@ 3GB - + diff --git a/cakey-auth/src/main/java/com/cakey/client/dto/LoginReq.java b/cakey-auth/src/main/java/com/cakey/client/dto/LoginReq.java index b04a34b..dd22cc7 100644 --- a/cakey-auth/src/main/java/com/cakey/client/dto/LoginReq.java +++ b/cakey-auth/src/main/java/com/cakey/client/dto/LoginReq.java @@ -4,7 +4,7 @@ import jakarta.validation.constraints.NotBlank; public record LoginReq( - @NotBlank(message = "SocialType이 잘못되었습니다.") SocialType socialType, - @NotBlank(message = "redirectUri가 잘못되었습니다.") String redirectUri + SocialType socialType, + String redirectUri ) { } diff --git a/cakey-domain/src/main/java/com/cakey/store/domain/Station.java b/cakey-domain/src/main/java/com/cakey/store/domain/Station.java index a3f2baa..2bb73f6 100644 --- a/cakey-domain/src/main/java/com/cakey/store/domain/Station.java +++ b/cakey-domain/src/main/java/com/cakey/store/domain/Station.java @@ -24,7 +24,11 @@ public enum Station { YEONSINNAE("연신내역", "YEONSINNAE", 37.619001, 126.921008), EWHA("이대역", "EWHA", 37.556733, 126.946013), JUNGGOK("중곡역", "JUNGGOK", 37.565923, 127.084350), - HANSEONGBAEKJE("한성백제역", "HANSEONGBAEKJE", 37.516078, 127.115655) + HANSEONGBAEKJE("한성백제역", "HANSEONGBAEKJE", 37.516078, 127.115655), + + + + HONGDAE("홍대입구역", "HONGDAE", 37.526402, 126.864342) ;