From 708bc97f2c9326883cb0b16078d75ed1424eb859 Mon Sep 17 00:00:00 2001 From: Anna-Jin Date: Tue, 19 Jul 2022 03:00:56 +0900 Subject: [PATCH] =?UTF-8?q?#18=20[Update]=20=EC=BD=94=EB=93=9C=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 성공 및 에러 응답값 통일 --- .../mpnp/baechelin/BaechelinApplication.java | 4 +- .../api/service/LocationService.java | 2 +- .../api/service/PublicApiService.java | 11 ----- .../{config => common}/QuerydslLocation.java | 2 +- .../baechelin/common/SuccessResponse.java | 21 +++++++++ .../httpclient/HttpConfig.java | 2 +- .../properties/AppProperties.java | 2 +- .../properties/CorsProperties.java | 2 +- .../config/security/SecurityConfig.java | 4 +- .../mpnp/baechelin/exception/ErrorCode.java | 2 - .../baechelin/exception/ErrorResponse.java | 6 +-- .../login/jwt/controller/TokenController.java | 2 +- .../login/jwt/service/TokenService.java | 16 ++++--- .../login/oauth/common/AuthResponse.java | 45 +++++-------------- .../OAuth2AuthenticationSuccessHandler.java | 2 +- .../repository/ReviewQueryRepository.java | 6 +-- .../repository/StoreQueryRepository.java | 8 +--- .../baechelin/store/service/StoreService.java | 2 +- .../baechelin/BaechelinApplicationTests.java | 2 +- 19 files changed, 59 insertions(+), 82 deletions(-) rename src/main/java/com/mpnp/baechelin/{config => common}/QuerydslLocation.java (99%) create mode 100644 src/main/java/com/mpnp/baechelin/common/SuccessResponse.java rename src/main/java/com/mpnp/baechelin/{config => common}/httpclient/HttpConfig.java (95%) rename src/main/java/com/mpnp/baechelin/{config => common}/properties/AppProperties.java (96%) rename src/main/java/com/mpnp/baechelin/{config => common}/properties/CorsProperties.java (90%) diff --git a/src/main/java/com/mpnp/baechelin/BaechelinApplication.java b/src/main/java/com/mpnp/baechelin/BaechelinApplication.java index febcd57..57c44d5 100644 --- a/src/main/java/com/mpnp/baechelin/BaechelinApplication.java +++ b/src/main/java/com/mpnp/baechelin/BaechelinApplication.java @@ -1,7 +1,7 @@ package com.mpnp.baechelin; -import com.mpnp.baechelin.config.properties.AppProperties; -import com.mpnp.baechelin.config.properties.CorsProperties; +import com.mpnp.baechelin.common.properties.AppProperties; +import com.mpnp.baechelin.common.properties.CorsProperties; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; diff --git a/src/main/java/com/mpnp/baechelin/api/service/LocationService.java b/src/main/java/com/mpnp/baechelin/api/service/LocationService.java index 9f2786a..15855cb 100644 --- a/src/main/java/com/mpnp/baechelin/api/service/LocationService.java +++ b/src/main/java/com/mpnp/baechelin/api/service/LocationService.java @@ -2,7 +2,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.mpnp.baechelin.api.model.LocationAddressSearchForm; -import com.mpnp.baechelin.config.httpclient.HttpConfig; +import com.mpnp.baechelin.common.httpclient.HttpConfig; import com.mpnp.baechelin.api.model.LocationKeywordSearchForm; import com.mpnp.baechelin.store.domain.Category; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/com/mpnp/baechelin/api/service/PublicApiService.java b/src/main/java/com/mpnp/baechelin/api/service/PublicApiService.java index b7b5ab4..1556136 100644 --- a/src/main/java/com/mpnp/baechelin/api/service/PublicApiService.java +++ b/src/main/java/com/mpnp/baechelin/api/service/PublicApiService.java @@ -1,33 +1,22 @@ package com.mpnp.baechelin.api.service; -import com.fasterxml.jackson.annotation.JsonAutoDetect; -import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.JsonNode; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.mpnp.baechelin.config.httpclient.HttpConfig; import com.mpnp.baechelin.api.dto.*; import com.mpnp.baechelin.api.model.LocationKeywordSearchForm; import com.mpnp.baechelin.store.domain.Category; import com.mpnp.baechelin.store.domain.Store; import com.mpnp.baechelin.store.repository.StoreRepository; -import lombok.AllArgsConstructor; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.*; -import org.springframework.http.client.reactive.ReactorClientHttpConnector; import org.springframework.stereotype.Service; -import org.springframework.util.StopWatch; import org.springframework.web.client.RestTemplate; -import org.springframework.web.reactive.function.client.WebClient; import org.springframework.web.util.UriComponentsBuilder; import software.amazon.ion.Decimal; import javax.transaction.Transactional; import java.io.IOException; -import java.io.UnsupportedEncodingException; import java.net.URI; -import java.net.URLEncoder; import java.util.*; import java.util.stream.Collectors; diff --git a/src/main/java/com/mpnp/baechelin/config/QuerydslLocation.java b/src/main/java/com/mpnp/baechelin/common/QuerydslLocation.java similarity index 99% rename from src/main/java/com/mpnp/baechelin/config/QuerydslLocation.java rename to src/main/java/com/mpnp/baechelin/common/QuerydslLocation.java index 445bed9..4d6c6bf 100644 --- a/src/main/java/com/mpnp/baechelin/config/QuerydslLocation.java +++ b/src/main/java/com/mpnp/baechelin/common/QuerydslLocation.java @@ -1,4 +1,4 @@ -package com.mpnp.baechelin.config; +package com.mpnp.baechelin.common; import com.mpnp.baechelin.store.domain.Category; import com.querydsl.core.BooleanBuilder; diff --git a/src/main/java/com/mpnp/baechelin/common/SuccessResponse.java b/src/main/java/com/mpnp/baechelin/common/SuccessResponse.java new file mode 100644 index 0000000..df46db6 --- /dev/null +++ b/src/main/java/com/mpnp/baechelin/common/SuccessResponse.java @@ -0,0 +1,21 @@ +package com.mpnp.baechelin.common; + +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.springframework.http.HttpStatus; + +import java.time.LocalDateTime; + +@Getter +@NoArgsConstructor +public class SuccessResponse { + private final LocalDateTime timestamp = LocalDateTime.now(); + private final HttpStatus status = HttpStatus.OK; + private final String code = "S-SUC200"; + private final String result = "SUCCESS"; + private String message; + + public SuccessResponse(String message) { + this.message = message; + } +} diff --git a/src/main/java/com/mpnp/baechelin/config/httpclient/HttpConfig.java b/src/main/java/com/mpnp/baechelin/common/httpclient/HttpConfig.java similarity index 95% rename from src/main/java/com/mpnp/baechelin/config/httpclient/HttpConfig.java rename to src/main/java/com/mpnp/baechelin/common/httpclient/HttpConfig.java index 146fd82..0b85de7 100644 --- a/src/main/java/com/mpnp/baechelin/config/httpclient/HttpConfig.java +++ b/src/main/java/com/mpnp/baechelin/common/httpclient/HttpConfig.java @@ -1,4 +1,4 @@ -package com.mpnp.baechelin.config.httpclient; +package com.mpnp.baechelin.common.httpclient; import io.netty.channel.ChannelOption; import io.netty.handler.timeout.ReadTimeoutHandler; diff --git a/src/main/java/com/mpnp/baechelin/config/properties/AppProperties.java b/src/main/java/com/mpnp/baechelin/common/properties/AppProperties.java similarity index 96% rename from src/main/java/com/mpnp/baechelin/config/properties/AppProperties.java rename to src/main/java/com/mpnp/baechelin/common/properties/AppProperties.java index 271da10..3a243b0 100644 --- a/src/main/java/com/mpnp/baechelin/config/properties/AppProperties.java +++ b/src/main/java/com/mpnp/baechelin/common/properties/AppProperties.java @@ -1,4 +1,4 @@ -package com.mpnp.baechelin.config.properties; +package com.mpnp.baechelin.common.properties; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/src/main/java/com/mpnp/baechelin/config/properties/CorsProperties.java b/src/main/java/com/mpnp/baechelin/common/properties/CorsProperties.java similarity index 90% rename from src/main/java/com/mpnp/baechelin/config/properties/CorsProperties.java rename to src/main/java/com/mpnp/baechelin/common/properties/CorsProperties.java index bee9ab1..398a98a 100644 --- a/src/main/java/com/mpnp/baechelin/config/properties/CorsProperties.java +++ b/src/main/java/com/mpnp/baechelin/common/properties/CorsProperties.java @@ -1,4 +1,4 @@ -package com.mpnp.baechelin.config.properties; +package com.mpnp.baechelin.common.properties; import lombok.Getter; import lombok.Setter; diff --git a/src/main/java/com/mpnp/baechelin/config/security/SecurityConfig.java b/src/main/java/com/mpnp/baechelin/config/security/SecurityConfig.java index 9baf12f..95d9c78 100644 --- a/src/main/java/com/mpnp/baechelin/config/security/SecurityConfig.java +++ b/src/main/java/com/mpnp/baechelin/config/security/SecurityConfig.java @@ -1,7 +1,7 @@ package com.mpnp.baechelin.config.security; -import com.mpnp.baechelin.config.properties.AppProperties; -import com.mpnp.baechelin.config.properties.CorsProperties; +import com.mpnp.baechelin.common.properties.AppProperties; +import com.mpnp.baechelin.common.properties.CorsProperties; import com.mpnp.baechelin.login.oauth.entity.RoleType; import com.mpnp.baechelin.login.jwt.exception.RestAuthenticationEntryPoint; import com.mpnp.baechelin.login.jwt.filter.TokenAuthenticationFilter; diff --git a/src/main/java/com/mpnp/baechelin/exception/ErrorCode.java b/src/main/java/com/mpnp/baechelin/exception/ErrorCode.java index a414047..db5e5f8 100644 --- a/src/main/java/com/mpnp/baechelin/exception/ErrorCode.java +++ b/src/main/java/com/mpnp/baechelin/exception/ErrorCode.java @@ -7,8 +7,6 @@ @RequiredArgsConstructor public enum ErrorCode { - SUCCESS_MESSAGE(200, "S-SUC200","SUCCESS"), -// NOT_FOUND_MESSAGE(500, "BE001", "NOT FOUND"), FAILED_MESSAGE(500, "E-FAI500","서버에서 오류가 발생하였습니다."), INVALID_ACCESS_TOKEN(401, "E-IAT401","유효하지 않은 Access Token입니다."), INVALID_REFRESH_TOKEN(401, "E-IRT401", "유효하지 않은 Refresh Token입니다."), diff --git a/src/main/java/com/mpnp/baechelin/exception/ErrorResponse.java b/src/main/java/com/mpnp/baechelin/exception/ErrorResponse.java index 869bc19..265af2e 100644 --- a/src/main/java/com/mpnp/baechelin/exception/ErrorResponse.java +++ b/src/main/java/com/mpnp/baechelin/exception/ErrorResponse.java @@ -11,8 +11,8 @@ public class ErrorResponse { private final LocalDateTime timestamp = LocalDateTime.now(); private final int status; - private final String error; private final String code; + private final String error; private final String message; public static ResponseEntity toResponseEntity(ErrorCode errorCode) { @@ -20,8 +20,8 @@ public static ResponseEntity toResponseEntity(ErrorCode errorCode .status(errorCode.getStatus()) .body(ErrorResponse.builder() .status(errorCode.getStatus()) - .error(errorCode.getCode()) - .code(errorCode.name()) + .code(errorCode.getCode()) + .error(errorCode.name()) .message(errorCode.getMessage()) .build() ); diff --git a/src/main/java/com/mpnp/baechelin/login/jwt/controller/TokenController.java b/src/main/java/com/mpnp/baechelin/login/jwt/controller/TokenController.java index d31859b..9dbe4ae 100644 --- a/src/main/java/com/mpnp/baechelin/login/jwt/controller/TokenController.java +++ b/src/main/java/com/mpnp/baechelin/login/jwt/controller/TokenController.java @@ -20,7 +20,7 @@ public class TokenController { @ApiOperation(value = "Access Token 만료 시 Refresh Token을 이용하여 재발급 받는 메소드") @GetMapping("/refresh") - public AuthResponse refreshToken (HttpServletRequest request, HttpServletResponse response) { + public AuthResponse refreshToken (HttpServletRequest request, HttpServletResponse response) { return tokenService.refreshToken(request, response); } } diff --git a/src/main/java/com/mpnp/baechelin/login/jwt/service/TokenService.java b/src/main/java/com/mpnp/baechelin/login/jwt/service/TokenService.java index f947391..05f1a2e 100644 --- a/src/main/java/com/mpnp/baechelin/login/jwt/service/TokenService.java +++ b/src/main/java/com/mpnp/baechelin/login/jwt/service/TokenService.java @@ -1,6 +1,8 @@ package com.mpnp.baechelin.login.jwt.service; -import com.mpnp.baechelin.config.properties.AppProperties; +import com.mpnp.baechelin.common.properties.AppProperties; +import com.mpnp.baechelin.exception.CustomException; +import com.mpnp.baechelin.exception.ErrorCode; import com.mpnp.baechelin.login.oauth.common.AuthResponse; import com.mpnp.baechelin.login.oauth.entity.RoleType; import com.mpnp.baechelin.login.jwt.AuthToken; @@ -34,7 +36,7 @@ public class TokenService { private final static String REFRESH_TOKEN = "refresh_token"; - public AuthResponse refreshToken(HttpServletRequest request, HttpServletResponse response) { + public AuthResponse refreshToken(HttpServletRequest request, HttpServletResponse response) { String accessToken = HeaderUtil.getAccessToken(request); AuthToken authToken = tokenProvider.convertAuthToken(accessToken); @@ -46,10 +48,10 @@ public AuthResponse refreshToken(HttpServletRequest request, HttpServletRespo // 유효한 access token 인지, 만료된 token 인지 확인 if (authToken.getExpiredTokenClaims() == null) { - return AuthResponse.invalidAccessToken(); + throw new CustomException(ErrorCode.INVALID_ACCESS_TOKEN); } else { if (AccessValidTime >= FIVE_MINIUTE_MSEC) { - return AuthResponse.notExpiredTokenYet(); + throw new CustomException(ErrorCode.NOT_EXPIRED_TOKEN_YET); } } @@ -63,13 +65,13 @@ public AuthResponse refreshToken(HttpServletRequest request, HttpServletRespo AuthToken authRefreshToken = tokenProvider.convertAuthToken(refreshToken); if (!authRefreshToken.tokenValidate()) { - return AuthResponse.invalidRefreshToken(); + throw new CustomException(ErrorCode.INVALID_REFRESH_TOKEN); } // userId와 refresh token 으로 DB 확인 UserRefreshToken userRefreshToken = userRefreshTokenRepository.findBySocialIdAndRefreshToken(userId, refreshToken); if (userRefreshToken == null) { - return AuthResponse.invalidRefreshToken(); + throw new CustomException(ErrorCode.INVALID_REFRESH_TOKEN); } // Access token 재발급 @@ -102,6 +104,6 @@ public AuthResponse refreshToken(HttpServletRequest request, HttpServletRespo CookieUtil.addCookie(response, REFRESH_TOKEN, authRefreshToken.getToken(), cookieMaxAge); } - return AuthResponse.success("token", newAccessToken.getToken()); + return new AuthResponse(newAccessToken.getToken()); } } diff --git a/src/main/java/com/mpnp/baechelin/login/oauth/common/AuthResponse.java b/src/main/java/com/mpnp/baechelin/login/oauth/common/AuthResponse.java index 24b6324..5bcae5a 100644 --- a/src/main/java/com/mpnp/baechelin/login/oauth/common/AuthResponse.java +++ b/src/main/java/com/mpnp/baechelin/login/oauth/common/AuthResponse.java @@ -3,48 +3,23 @@ import com.mpnp.baechelin.exception.ErrorCode; import lombok.Getter; import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import java.time.LocalDateTime; import java.util.HashMap; import java.util.Map; @Getter @RequiredArgsConstructor -public class AuthResponse { +public class AuthResponse { - private final AuthResponseHeader header; - private final Map body; + private final LocalDateTime timestamp = LocalDateTime.now(); + private final HttpStatus status = HttpStatus.OK; + private final String code = "S-SUC200"; + private final String result = "SUCCESS"; + private String token; - public static AuthResponse success(String name, T body) { - Map map = new HashMap<>(); - map.put(name, body); - - return new AuthResponse<>(new AuthResponseHeader( - ErrorCode.SUCCESS_MESSAGE.getCode(), - ErrorCode.SUCCESS_MESSAGE.getMessage()), map); - } - - // 이 밑에 코드는 전부 exception 으로 빼기 - public static AuthResponse fail() { - return new AuthResponse<>(new AuthResponseHeader( - ErrorCode.FAILED_MESSAGE.getCode(), - ErrorCode.FAILED_MESSAGE.getMessage()), null); - } - - public static AuthResponse invalidAccessToken() { - return new AuthResponse<>(new AuthResponseHeader( - ErrorCode.INVALID_ACCESS_TOKEN.getCode(), - ErrorCode.INVALID_ACCESS_TOKEN.getMessage()), null); - } - - public static AuthResponse invalidRefreshToken() { - return new AuthResponse<>(new AuthResponseHeader( - ErrorCode.INVALID_REFRESH_TOKEN.getCode(), - ErrorCode.INVALID_REFRESH_TOKEN.getMessage()), null); - } - - public static AuthResponse notExpiredTokenYet() { - return new AuthResponse<>(new AuthResponseHeader( - ErrorCode.NOT_EXPIRED_TOKEN_YET.getCode(), - ErrorCode.NOT_EXPIRED_TOKEN_YET.getMessage()), null); + public AuthResponse(String token) { + this.token = token; } } diff --git a/src/main/java/com/mpnp/baechelin/login/oauth/handler/OAuth2AuthenticationSuccessHandler.java b/src/main/java/com/mpnp/baechelin/login/oauth/handler/OAuth2AuthenticationSuccessHandler.java index d521da7..e10a368 100644 --- a/src/main/java/com/mpnp/baechelin/login/oauth/handler/OAuth2AuthenticationSuccessHandler.java +++ b/src/main/java/com/mpnp/baechelin/login/oauth/handler/OAuth2AuthenticationSuccessHandler.java @@ -1,6 +1,6 @@ package com.mpnp.baechelin.login.oauth.handler; -import com.mpnp.baechelin.config.properties.AppProperties; +import com.mpnp.baechelin.common.properties.AppProperties; import com.mpnp.baechelin.login.oauth.entity.ProviderType; import com.mpnp.baechelin.login.oauth.entity.RoleType; import com.mpnp.baechelin.login.oauth.info.OAuth2UserInfo; diff --git a/src/main/java/com/mpnp/baechelin/review/repository/ReviewQueryRepository.java b/src/main/java/com/mpnp/baechelin/review/repository/ReviewQueryRepository.java index 8d90ad4..ddb330f 100644 --- a/src/main/java/com/mpnp/baechelin/review/repository/ReviewQueryRepository.java +++ b/src/main/java/com/mpnp/baechelin/review/repository/ReviewQueryRepository.java @@ -1,12 +1,9 @@ package com.mpnp.baechelin.review.repository; -import com.mpnp.baechelin.config.QuerydslLocation; +import com.mpnp.baechelin.common.QuerydslLocation; import com.mpnp.baechelin.review.domain.Review; -import com.mpnp.baechelin.store.domain.Store; -import com.mpnp.baechelin.user.domain.User; import com.querydsl.core.BooleanBuilder; import com.querydsl.jpa.impl.JPAQueryFactory; -import org.springframework.data.jpa.repository.Query; import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport; import org.springframework.stereotype.Repository; @@ -15,7 +12,6 @@ import java.util.List; import static com.mpnp.baechelin.review.domain.QReview.review; -import static com.mpnp.baechelin.store.domain.QStore.store; @Repository @Transactional diff --git a/src/main/java/com/mpnp/baechelin/store/repository/StoreQueryRepository.java b/src/main/java/com/mpnp/baechelin/store/repository/StoreQueryRepository.java index 32ab7df..bb30b66 100644 --- a/src/main/java/com/mpnp/baechelin/store/repository/StoreQueryRepository.java +++ b/src/main/java/com/mpnp/baechelin/store/repository/StoreQueryRepository.java @@ -1,11 +1,8 @@ package com.mpnp.baechelin.store.repository; -import com.mpnp.baechelin.config.QuerydslLocation; -import com.mpnp.baechelin.review.domain.Review; +import com.mpnp.baechelin.common.QuerydslLocation; import com.mpnp.baechelin.store.domain.Store; import com.mpnp.baechelin.store.dto.StoreCardResponseDto; -import com.mpnp.baechelin.store.dto.StoreResponseDto; -import com.mpnp.baechelin.user.domain.User; import com.querydsl.core.BooleanBuilder; import com.querydsl.jpa.impl.JPAQueryFactory; import lombok.extern.slf4j.Slf4j; @@ -19,9 +16,8 @@ import java.math.BigDecimal; import java.math.RoundingMode; import java.util.List; -import java.util.stream.Collectors; -import static com.mpnp.baechelin.config.QuerydslLocation.locTwoPointAndConditions; +import static com.mpnp.baechelin.common.QuerydslLocation.locTwoPointAndConditions; import static com.mpnp.baechelin.store.domain.QStore.store; @Repository diff --git a/src/main/java/com/mpnp/baechelin/store/service/StoreService.java b/src/main/java/com/mpnp/baechelin/store/service/StoreService.java index 2a36d0e..5ac1d6b 100644 --- a/src/main/java/com/mpnp/baechelin/store/service/StoreService.java +++ b/src/main/java/com/mpnp/baechelin/store/service/StoreService.java @@ -1,7 +1,7 @@ package com.mpnp.baechelin.store.service; import com.mpnp.baechelin.bookmark.repository.BookmarkRepository; -import com.mpnp.baechelin.config.QuerydslLocation; +import com.mpnp.baechelin.common.QuerydslLocation; import com.mpnp.baechelin.review.domain.Review; import com.mpnp.baechelin.review.repository.ReviewRepository; import com.mpnp.baechelin.store.domain.Store; diff --git a/src/test/java/com/mpnp/baechelin/BaechelinApplicationTests.java b/src/test/java/com/mpnp/baechelin/BaechelinApplicationTests.java index 86bf919..d62fb7a 100644 --- a/src/test/java/com/mpnp/baechelin/BaechelinApplicationTests.java +++ b/src/test/java/com/mpnp/baechelin/BaechelinApplicationTests.java @@ -1,6 +1,6 @@ package com.mpnp.baechelin; -import com.mpnp.baechelin.config.httpclient.HttpConfig; +import com.mpnp.baechelin.common.httpclient.HttpConfig; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ContextConfiguration;