From 320b1019d4c8491b984e36dc0fd57cb2397c171e Mon Sep 17 00:00:00 2001 From: ywcheong Date: Wed, 1 Apr 2026 01:47:01 +0900 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20Kakao=20Skill=20API=20Key=EB=A5=BC?= =?UTF-8?q?=20Secret=EC=9C=BC=EB=A1=9C=20=EB=B6=84=EB=A6=AC=20=EB=B0=8F=20?= =?UTF-8?q?=EB=B0=B0=ED=8F=AC=EA=B2=BD=EB=A1=9C=EC=97=90=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .claude/CLAUDE.md | 1 - .github/workflows/cd.yml | 4 +++- deploy/deploy.sh | 2 +- src/main/resources/application.yaml | 2 +- src/test/kotlin/ywcheong/sofia/config/TestScenarioHelper.kt | 2 +- src/test/resources/application.yml | 3 +++ 6 files changed, 9 insertions(+), 5 deletions(-) diff --git a/.claude/CLAUDE.md b/.claude/CLAUDE.md index 7a87a7e..b86b709 100644 --- a/.claude/CLAUDE.md +++ b/.claude/CLAUDE.md @@ -48,7 +48,6 @@ - 메서드 레벨 `@DisplayName`은 `"{HTTP_METHOD} {endpoint} - {비즈니스 의미}"` 형식을 따른다. - 내부 클래스(`inner class`)명은 비즈니스 행위를 기반으로 작명한다. (`CreateTests`, `FindAllTests` 등 CRUD 용어 지양) - 테스트에서는 인증, 페이즈 조건은 검증하지 않음 - 횡단 관심이므로 별도의 인증테스트, 페이즈테스트에서 모두 몰아서 검사하기 때문 -- 테스트 환경에서 외부 리소스(이메일, 외부 API 등)가 실제로 호출되지 않도록, `build.gradle.kts`의 `tasks.withType` 블록에서 `systemProperty()`로 설정값을 주입하여 비활성화한다. 별도의 테스트용 설정 파일을 생성하지 않는다. ## 버전관리 규칙 diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 2fbe5a0..c37b627 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -13,7 +13,7 @@ permissions: # 이 파이프라인이 필요로 하는 설정값 목록: # Required Variables (비민감): EC2_HOST, EC2_USERNAME -# Required Secrets (민감): EC2_SSH_PRIVATE_KEY, SOFIA_DATASOURCE_URL, SOFIA_DATASOURCE_PASSWORD, SOFIA_DATASOURCE_USERNAME +# Required Secrets (민감): EC2_SSH_PRIVATE_KEY, SOFIA_DATASOURCE_URL, SOFIA_DATASOURCE_PASSWORD, SOFIA_DATASOURCE_USERNAME, SOFIA_KAKAO_SKILL_KEY # Optional Secrets (민감): NOTIFICATION_WEBHOOK_URL jobs: @@ -45,11 +45,13 @@ jobs: SOFIA_DATASOURCE_URL: ${{ secrets.SOFIA_DATASOURCE_URL }} SOFIA_DATASOURCE_PASSWORD: ${{ secrets.SOFIA_DATASOURCE_PASSWORD }} SOFIA_DATASOURCE_USERNAME: ${{ secrets.SOFIA_DATASOURCE_USERNAME }} + SOFIA_KAKAO_SKILL_KEY: ${{ secrets.SOFIA_KAKAO_SKILL_KEY }} run: | { echo "SOFIA_DATASOURCE_URL=${SOFIA_DATASOURCE_URL}" echo "SOFIA_DATASOURCE_PASSWORD=${SOFIA_DATASOURCE_PASSWORD}" echo "SOFIA_DATASOURCE_USERNAME=${SOFIA_DATASOURCE_USERNAME}" + echo "SOFIA_KAKAO_SKILL_KEY=${SOFIA_KAKAO_SKILL_KEY}" } > deploy/secrets.env - name: EC2 배포 diff --git a/deploy/deploy.sh b/deploy/deploy.sh index acfa387..f8e1acd 100755 --- a/deploy/deploy.sh +++ b/deploy/deploy.sh @@ -33,7 +33,7 @@ build_log_file() { } refresh_secrets_from_env() { - local secret_keys=("SOFIA_DATASOURCE_URL" "SOFIA_DATASOURCE_PASSWORD" "SOFIA_DATASOURCE_USERNAME") + local secret_keys=("SOFIA_DATASOURCE_URL" "SOFIA_DATASOURCE_PASSWORD" "SOFIA_DATASOURCE_USERNAME" "SOFIA_KAKAO_SKILL_KEY") local available=false for key in "${secret_keys[@]}"; do diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 59e24d6..aba18a4 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -25,7 +25,7 @@ sofia: reminder-enabled: false kakao: skill: - secret-token: replace-me-11!! + secret-token: ${SOFIA_KAKAO_SKILL_KEY} first-boot: create-admin-if-empty: false admin-student-number: 18-100 diff --git a/src/test/kotlin/ywcheong/sofia/config/TestScenarioHelper.kt b/src/test/kotlin/ywcheong/sofia/config/TestScenarioHelper.kt index 95e0785..11fcf8c 100644 --- a/src/test/kotlin/ywcheong/sofia/config/TestScenarioHelper.kt +++ b/src/test/kotlin/ywcheong/sofia/config/TestScenarioHelper.kt @@ -48,7 +48,7 @@ class TestScenarioHelper( private val logger = KotlinLogging.logger { } companion object { - const val DEFAULT_KAKAO_SECRET = "replace-me-11!!" + val DEFAULT_KAKAO_SECRET: String = "replace-me-11!!" } init { diff --git a/src/test/resources/application.yml b/src/test/resources/application.yml index 93ade1a..05d6f9e 100644 --- a/src/test/resources/application.yml +++ b/src/test/resources/application.yml @@ -5,6 +5,9 @@ sofia: enabled: true task: reminder-enabled: true + kakao: + skill: + secret-token: replace-me-11!! spring: jpa: hibernate: From c32e205bd4da3235fd2a49cda012ae2c3a39a23a Mon Sep 17 00:00:00 2001 From: ywcheong Date: Wed, 1 Apr 2026 01:47:44 +0900 Subject: [PATCH 2/3] =?UTF-8?q?chore:=20=EA=B8=B0=EB=B3=B8=20=EB=A6=AC?= =?UTF-8?q?=EB=A7=88=EC=9D=B8=EB=8D=94=20=EC=84=A4=EC=A0=95=20=ED=99=9C?= =?UTF-8?q?=EC=84=B1=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/application.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index aba18a4..793c4c9 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -22,7 +22,7 @@ sofia: task: seconds-per-character: 3.942 late-threshold-hours: 48 - reminder-enabled: false + reminder-enabled: true kakao: skill: secret-token: ${SOFIA_KAKAO_SKILL_KEY} From d683f5459ea6ab5908b0bd7fe065e16ef0516a1b Mon Sep 17 00:00:00 2001 From: ywcheong Date: Wed, 1 Apr 2026 01:48:09 +0900 Subject: [PATCH 3/3] =?UTF-8?q?chore:=2026b.04.01.2=20=EB=B2=84=EC=A0=84?= =?UTF-8?q?=EC=97=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index d064203..1fda163 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ org.gradle.console=plain org.gradle.logging.level=quiet org.gradle.warning.mode=summary -ywcheong.sofia.version=26b.04.01.1 +ywcheong.sofia.version=26b.04.01.2 ywcheong.sofia.jdk_version=21 \ No newline at end of file