diff --git a/src/main/java/clap/server/common/utils/SpringEnvironmentHelper.java b/src/main/java/clap/server/common/utils/SpringEnvironmentHelper.java new file mode 100644 index 00000000..1ed104ae --- /dev/null +++ b/src/main/java/clap/server/common/utils/SpringEnvironmentHelper.java @@ -0,0 +1,46 @@ +package clap.server.common.utils; + +import lombok.RequiredArgsConstructor; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.util.Arrays; +import java.util.List; + +@Component +@RequiredArgsConstructor +public class SpringEnvironmentHelper { + + private final Environment environment; + + private final String PROD = "prod"; + private final String DEV = "dev"; + private final String LOCAL = "local"; + + private final List LOCAL_AND_DEV = List.of("local", "dev"); + + public Boolean isProdProfile() { + String[] activeProfiles = environment.getActiveProfiles(); + List currentProfile = Arrays.stream(activeProfiles).toList(); + return currentProfile.contains(PROD); + } + + public Boolean isLocalProfile() { + String[] activeProfiles = environment.getActiveProfiles(); + List currentProfile = Arrays.stream(activeProfiles).toList(); + return currentProfile.contains(LOCAL); + } + + public Boolean isDevProfile() { + String[] activeProfiles = environment.getActiveProfiles(); + List currentProfile = Arrays.stream(activeProfiles).toList(); + return currentProfile.contains(DEV); + } + + public Boolean isLocalAndDevProfile() { + String[] activeProfiles = environment.getActiveProfiles(); + List currentProfile = Arrays.stream(activeProfiles).toList(); + return CollectionUtils.containsAny(LOCAL_AND_DEV, currentProfile); + } +} diff --git a/src/main/java/clap/server/config/aop/ApiBlockingAspect.java b/src/main/java/clap/server/config/aop/ApiBlockingAspect.java new file mode 100644 index 00000000..d3e7c3e4 --- /dev/null +++ b/src/main/java/clap/server/config/aop/ApiBlockingAspect.java @@ -0,0 +1,29 @@ +package clap.server.config.aop; + +import clap.server.common.utils.SpringEnvironmentHelper; +import clap.server.exception.ApplicationException; +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.stereotype.Component; + +import static clap.server.exception.code.GlobalErrorCode.BLOCKED_API; + +@Aspect +@Component +@Slf4j +@RequiredArgsConstructor +public class ApiBlockingAspect { + + private final SpringEnvironmentHelper springEnvironmentHelper; + + @Around("@annotation(clap.server.common.annotation.swagger.DevelopOnlyApi)") + public Object checkApiAcceptingCondition(ProceedingJoinPoint joinPoint) throws Throwable { + if (springEnvironmentHelper.isProdProfile()) { + throw new ApplicationException(BLOCKED_API) ; + } + return joinPoint.proceed(); + } +} diff --git a/src/main/java/clap/server/exception/code/GlobalErrorCode.java b/src/main/java/clap/server/exception/code/GlobalErrorCode.java index 6980ff9c..63ea7d67 100644 --- a/src/main/java/clap/server/exception/code/GlobalErrorCode.java +++ b/src/main/java/clap/server/exception/code/GlobalErrorCode.java @@ -15,6 +15,7 @@ public enum GlobalErrorCode implements BaseErrorCode { METHOD_ARGUMENT_NOT_VALID(HttpStatus.BAD_REQUEST, "COMMON_002", "올바르지 않은 요청입니다."), METHOD_NOT_ALLOWED(HttpStatus.METHOD_NOT_ALLOWED, "COMMON_005", "지원하지 않은 Http Method 입니다."), INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "COMMON_006", "서버 에러가 발생했습니다."), + BLOCKED_API(HttpStatus.METHOD_NOT_ALLOWED, "COMMON_007", "운영 환경에서 사용할 수 없는 API 입니다."), ; private final HttpStatus httpStatus; diff --git a/src/main/resources/swagger.yml b/src/main/resources/swagger.yml index 2f8c139b..2514d791 100644 --- a/src/main/resources/swagger.yml +++ b/src/main/resources/swagger.yml @@ -35,4 +35,5 @@ springdoc: path: /swagger/v3/api-docs --- -spring.config.activate.on-profile: prod \ No newline at end of file +spring.config.activate.on-profile: prod +swagger.server.url: ${SWAGGER_SERVER_URL:http://localhost:8080} \ No newline at end of file