diff --git a/src/main/java/org/sopt/makers/global/util/EnvUtil.java b/src/main/java/org/sopt/makers/global/util/EnvUtil.java index f2ed147..170a9a3 100644 --- a/src/main/java/org/sopt/makers/global/util/EnvUtil.java +++ b/src/main/java/org/sopt/makers/global/util/EnvUtil.java @@ -15,9 +15,7 @@ public final class EnvUtil { private static final String SLACK_WEBHOOK_PREFIX = "SLACK_WEBHOOK_"; private static final String DISCORD_WEBHOOK_PREFIX = "DISCORD_WEBHOOK_"; - private static final Dotenv dotenv = Dotenv.configure() - .directory("src/main/resources") // .env 파일 경로 지정 - .load(); + private static final Dotenv dotenv = Dotenv.configure().load(); /** * 서비스 유형에 맞는 웹훅 URL 반환 diff --git a/src/test/java/org/sopt/makers/global/util/EnvUtilTest.java b/src/test/java/org/sopt/makers/global/util/EnvUtilTest.java index 9bc85e2..0a00eb6 100644 --- a/src/test/java/org/sopt/makers/global/util/EnvUtilTest.java +++ b/src/test/java/org/sopt/makers/global/util/EnvUtilTest.java @@ -22,7 +22,7 @@ @DisplayName("EnvUtil 테스트") class EnvUtilTest { - private static final String ENV_FILE_PATH = "src/main/resources/.env"; + private static final String ENV_FILE_PATH = "src/test/resources/.env"; @BeforeAll static void setUp() throws IOException { @@ -30,7 +30,7 @@ static void setUp() throws IOException { SLACK_WEBHOOK_CREW_DEV_BE=https://hooks.slack.com/services/crew/dev/be SLACK_WEBHOOK_APP_PROD_FE=https://hooks.slack.com/services/app/prod/fe """; - Files.createDirectories(Paths.get("src/main/resources")); + Files.createDirectories(Paths.get("src/test/resources")); Files.write(Paths.get(ENV_FILE_PATH), content.getBytes()); } @@ -43,7 +43,7 @@ static void tearDown() throws IOException { @Test void testGetWebhookUrl_valid() { String expectedUrl = "https://hooks.slack.com/services/crew/dev/be"; - String actualUrl = EnvUtil.getWebhookUrl("slack", "crew", "dev", "be"); + String actualUrl = TestEnvUtil.getWebhookUrl("slack", "crew", "dev", "be"); assertEquals(expectedUrl, actualUrl); } @@ -52,7 +52,7 @@ void testGetWebhookUrl_valid() { @Test void testGetWebhookUrl_notFound() { WebhookUrlNotFoundException exception = assertThrows(WebhookUrlNotFoundException.class, () -> - EnvUtil.getWebhookUrl("slack", "crew", "prod", "be") + TestEnvUtil.getWebhookUrl("slack", "crew", "prod", "be") ); assertTrue(exception.getMessage().contains("Webhook URL을 찾을 수 없습니다.")); @@ -62,7 +62,7 @@ void testGetWebhookUrl_notFound() { @Test void testGetWebhookUrl_unsupportedServiceType() { assertThrows(UnsupportedServiceTypeException.class, () -> - EnvUtil.getWebhookUrl("telegram", "crew", "dev", "be") + TestEnvUtil.getWebhookUrl("telegram", "crew", "dev", "be") ); } @@ -71,7 +71,7 @@ void testGetWebhookUrl_unsupportedServiceType() { @MethodSource("provideNullParameters") void testGetWebhookUrl_withNullParameters_shouldThrow(String service, String team, String stage, String type) { assertThrows(InvalidEnvParameterException.class, () -> - EnvUtil.getWebhookUrl(service, team, stage, type) + TestEnvUtil.getWebhookUrl(service, team, stage, type) ); } @@ -87,12 +87,12 @@ void testGetWebhookUrl_withNullParameters_shouldThrow(String service, String tea }) void testGetWebhookUrl_caseInsensitive(String service, String team, String stage, String type) { if (team.equalsIgnoreCase("app")) { - String actualUrl = EnvUtil.getWebhookUrl(service, team, stage, type); + String actualUrl = TestEnvUtil.getWebhookUrl(service, team, stage, type); assertEquals("https://hooks.slack.com/services/app/prod/fe", actualUrl); return; } - String actualUrl = EnvUtil.getWebhookUrl(service, team, stage, type); + String actualUrl = TestEnvUtil.getWebhookUrl(service, team, stage, type); assertEquals("https://hooks.slack.com/services/crew/dev/be", actualUrl); } private static Stream provideNullParameters() { diff --git a/src/test/java/org/sopt/makers/global/util/TestEnvUtil.java b/src/test/java/org/sopt/makers/global/util/TestEnvUtil.java new file mode 100644 index 0000000..2c8302b --- /dev/null +++ b/src/test/java/org/sopt/makers/global/util/TestEnvUtil.java @@ -0,0 +1,56 @@ +package org.sopt.makers.global.util; + +import org.sopt.makers.global.exception.message.ErrorMessage; +import org.sopt.makers.global.exception.unchecked.InvalidEnvParameterException; +import org.sopt.makers.global.exception.unchecked.UnsupportedServiceTypeException; +import org.sopt.makers.global.exception.unchecked.WebhookUrlNotFoundException; + +import io.github.cdimascio.dotenv.Dotenv; + +class TestEnvUtil { + private static final String SLACK_WEBHOOK_PREFIX = "SLACK_WEBHOOK_"; + private static final String DISCORD_WEBHOOK_PREFIX = "DISCORD_WEBHOOK_"; + private static final Dotenv dotenv = Dotenv.configure() + .directory("src/test/resources") + .load(); + + /** + * 서비스 유형에 맞는 웹훅 URL 반환 + * + * @param service 서비스 유형 (slack, discord 등) + * @param team 팀 이름 (crew, app 등) + * @param stage 환경 (dev, prod) + * @param type 서버 유형 (be, fe) + * @return 웹훅 URL + * @throws UnsupportedServiceTypeException 지원하지 않는 서비스 유형인 경우 + * @throws WebhookUrlNotFoundException 환경 변수를 찾을 수 없는 경우 + */ + public static String getWebhookUrl(String service, String team, String stage, String type) { + if (service == null || team == null || stage == null || type == null) { + throw InvalidEnvParameterException.from(ErrorMessage.INVALID_ENV_PARAMETER); + } + + String prefix = resolvePrefix(service.toLowerCase()); + String envKey = String.format("%s%s_%s_%s", + prefix, + team.toUpperCase(), + stage.toUpperCase(), + type.toUpperCase()); + + String webhookUrl = dotenv.get(envKey); + + if (webhookUrl == null || webhookUrl.isBlank()) { + throw new WebhookUrlNotFoundException(ErrorMessage.WEBHOOK_URL_NOT_FOUND); + } + + return webhookUrl; + } + + private static String resolvePrefix(String service) { + return switch (service) { + case "slack" -> SLACK_WEBHOOK_PREFIX; + case "discord" -> DISCORD_WEBHOOK_PREFIX; + default -> throw new UnsupportedServiceTypeException(ErrorMessage.UNSUPPORTED_SERVICE_TYPE); + }; + } +}