Java 25์ Spring Boot ๊ธฐ๋ฐ์ผ๋ก ํํ ํฌ ์๋น์ค๋ฅผ ํ์ตํ๊ณ ๊ฒ์ฆํ๋ ์์ง๋์ด๋ง ๋ฉ์ ๋๋ค. ๋ชฉํ๋ ๋จ์ํ ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋๋ผ, ๊ธ์ต๊ถ ์์ค์ ์๊ตฌ์ฌํญ์ ์์ ๋ฒ์๋ก ์ชผ๊ฐ์ด ์ค๊ณ ๊ทผ๊ฑฐ, ํธ๋ ์ด๋์คํ, ์ฝ๋, ํ ์คํธ, ๋ฆฌ๋ทฐ, ๋ฆด๋ฆฌ์ค๋ฅผ ํจ๊ป ๋จ๊ธฐ๋ ๊ฒ์ ๋๋ค.
์ด ์ ์ฅ์๋ ํ์ต์ฉ์ ๋๋ค. ์ค์ ๊ธ์ต ๊ฑฐ๋, ์ค๋ช ์ธ์ฆ, ์ธ๋ถ ๊ฒฐ์ ๋ง ์ฐ๋, ๊ณ ๊ฐ ๊ฐ์ธ์ ๋ณด ์ฒ๋ฆฌ๋ ๋ฒ์์ ํฌํจํ์ง ์์ต๋๋ค.
ํํ ํฌ ์๋น์ค๋ ๊ธฐ๋ฅ ๊ตฌํ๋ณด๋ค ์ ํฉ์ฑ, ๊ฐ์ฌ ๊ฐ๋ฅ์ฑ, ์ฅ์ ๋ณต๊ตฌ, ๋ณด์, ์ด์ ์ ์ฐจ๊ฐ ๋ ์ค์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ๊ณ์ข ์ด์ฒด, ๊ฐํธ๊ฒฐ์ , ํฌ์ธํธ ์ถฉ์ , ์ ์ฐ ๊ฐ์ ๊ธฐ๋ฅ์ ํ๋ฉด์์ผ๋ก๋ ๋จ์ํ์ง๋ง ๋ด๋ถ์ ์ผ๋ก๋ ๋ฉฑ๋ฑ์ฑ, ์์ฅ ๋ถ๋ณ์ฑ, ๋์์ฑ ์ ์ด, ํ๋, ์ด์๊ฑฐ๋ ํ์ง, ์ฅ์ ์ ๋ณด์ ์ฒ๋ฆฌ๊น์ง ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
์ด ๋ ํฌ๋ ๋ค์ ์ ์ ๋ฅผ ๋ก๋๋ค.
- ๊ธ์ต ๋๋ฉ์ธ์ ์ฝ๋๋ณด๋ค ๋จผ์ ์ ์ฑ ๊ณผ ๋ถ๋ณ์์ ์ ์ํฉ๋๋ค.
- ๋ชจ๋ ๊ธฐ๋ฅ์ ํ ์คํธ ์ฝ๋์ ํจ๊ป ์์ฑํฉ๋๋ค.
- ์ค๊ณ ์ ํ์ ADR ๋๋ Wiki ๋ฌธ์๋ก ๊ทผ๊ฑฐ๋ฅผ ๋จ๊น๋๋ค.
- ์ฝ๋ ๋ฆฌ๋ทฐ๋ ๊ตฌํ ํ์ง๋ฟ ์๋๋ผ ๋๋ฉ์ธ ๊ท์น ์๋ฐ ์ฌ๋ถ๋ฅผ ๊ฒ์ฆํฉ๋๋ค.
- ๋ฆด๋ฆฌ์ค๋ ์์ ๋จ์๋ก ๋ฐ๋ณตํ๋ฉฐ ๋ณ๊ฒฝ ์ด๋ ฅ์ ์ถ์ ํฉ๋๋ค.
| ํญ๋ชฉ | ๊ธฐ๋ณธ ์ ํ | ๊ทผ๊ฑฐ | ์ฃผ์ ํธ๋ ์ด๋์คํ |
|---|---|---|---|
| Java | Java 25 LTS | Oracle์ Java 25๋ฅผ 2025-09-16์ ๊ณต๊ฐํ๊ณ , Java ๋ฆด๋ฆฌ์ค ํ์์ Java 25 LTS์ ์ง์ ์ข ๋ฃ๋ฅผ 2033-09๋ก ๋ช ์ํฉ๋๋ค. | ์ต์ LTS๋ฅผ ํตํด ์ฅ๊ธฐ ํ์ต ๊ธฐ์ค์ ์ก์ ์ ์์ง๋ง, ์ผ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํธํ์ฑ์ Java 21๋ณด๋ค ๋ฆ๊ฒ ์์ ํ๋ ์ ์์ต๋๋ค. |
| Spring Boot | Spring Boot 4.x ์ฐ์ ๊ฒํ | Spring Boot 4.0.5 ๋ฌธ์๋ Java 17 ์ด์์ ์๊ตฌํ๊ณ Java 26๊น์ง ํธํ๋๋ค๊ณ ๋ช ์ํฉ๋๋ค. | Spring Framework 7, Jakarta EE ์ต์ ์ถ์ ํ์ตํ ์ ์์ง๋ง, ์ํ๊ณ ์์ ์ฑ์ด ๋ ์ค์ํ๋ฉด Spring Boot 3.5.x๋ก ๋ฎ์ถ๋ ์ ํ์ง๋ฅผ ์ ์งํฉ๋๋ค. |
| Build | Gradle 9.x ๋๋ 8.14+ | Spring Boot 4.0.5 ๋ฌธ์๋ Gradle 8.14+ ๋ฐ 9.x ์ง์์ ๋ช ์ํฉ๋๋ค. | Gradle 9.x๋ ์ต์ ์ฑ์ด ์ข๊ณ , Gradle 8.14+๋ ํ๋ฌ๊ทธ์ธ ํธํ์ฑ์ด ๋ ์์ ์ ์ผ ์ ์์ต๋๋ค. |
| Test | JUnit 5, Spring Boot Test, Testcontainers | ๊ธ์ต ๋๋ฉ์ธ์ DB ํธ๋์ญ์ ๊ณผ ๋์์ฑ ๊ฒ์ฆ์ด ์ค์ํ๋ฏ๋ก ๋จ์ ํ ์คํธ์ ํตํฉ ํ ์คํธ๋ฅผ ๋ถ๋ฆฌํฉ๋๋ค. | ํ ์คํธ ๋น์ฉ์ด ์ฆ๊ฐํ์ง๋ง ํ๊ท์ ์ค๊ณ ์ค๋ฅ๋ฅผ ์กฐ๊ธฐ์ ๋ฐ๊ฒฌํฉ๋๋ค. |
| Persistence | PostgreSQL ์ฐ์ | ์์ฅ, ๊ฑฐ๋, ๊ฐ์ฌ ๋ก๊ทธ์ฒ๋ผ ์ ํฉ์ฑ์ด ์ค์ํ ๋ฐ์ดํฐ์ ๊ด๊ณํ ๋ชจ๋ธ์ด ์ ํฉํฉ๋๋ค. | ๋น ๋ฅธ ํ๋กํ ํ์ดํ์ H2๊ฐ ์ฝ์ง๋ง, ์ด์ ์ ์ฌ์ฑ์ PostgreSQL์ด ๋์ต๋๋ค. |
| API | REST ์ฐ์ , ์ด๋ฒคํธ๋ ํ์ ๋์ | ์ด๊ธฐ ํ์ต ๋จ๊ณ์์๋ ์์ฒญ-์๋ต ๊ณ์ฝ๊ณผ ํธ๋์ญ์ ๊ฒฝ๊ณ๋ฅผ ๋ช ํํ ํฉ๋๋ค. | ์ด๋ฒคํธ ๊ธฐ๋ฐ์ ํ์ฅ์ฑ์ ์ ๋ฆฌํ์ง๋ง, ์ด๊ธฐ์๋ ๋ณต์ก๋์ ๊ด์ธก ๋น์ฉ์ด ํฝ๋๋ค. |
์ฐธ๊ณ ์๋ฃ:
- Java ๋ฆด๋ฆฌ์ค ์ง์ ํ: https://www.java.com/releases/
- Oracle Java 25 ๋ฐํ: https://www.oracle.com/uk/news/announcement/oracle-releases-java-25-2025-09-16/
- Spring Boot ์์คํ ์๊ตฌ์ฌํญ: https://docs.spring.io/spring-boot/system-requirements.html
- ๊ธ์ต ์๋น์ค ํต์ฌ ๋๋ฉ์ธ์ ์์ ๊ธฐ๋ฅ ๋จ์๋ก ๊ตฌํํฉ๋๋ค.
- ๊ธฐ๋ฅ๋ง๋ค ๋๋ฉ์ธ ๊ท์น, ์ค๊ณ ๋์, ํธ๋ ์ด๋์คํ, ํ ์คํธ ์ ๋ต์ ๋ฌธ์ํํฉ๋๋ค.
- ์ฝ๋ ๊ฐ๋ฐ์ 2๋ช , ์ฌ์ฉ์ ๊ฐ๋ฐ์, ๋๋ฉ์ธ ์ ๋ฌธ๊ฐ, ๊ธฐํ์, QA ์ญํ ์ด ๋ ๋ฆฝ์ ์ผ๋ก ๊ฒํ ํ๋ ํ๋ค์ค๋ฅผ ์ด์ํฉ๋๋ค.
- GitHub Issues, Pull Requests, Wiki, Releases๋ฅผ ์ฌ์ฉํด ์ค์ ํ ๊ฐ๋ฐ ์ ์ฐจ๋ฅผ ํ๋ด ๋ ๋๋ค.
- ๊ฐ ๋ฆด๋ฆฌ์ค๋ง๋ค ๊ธฐ๋ฅ, ์ ์ฝ, ์๋ ค์ง ๋ฆฌ์คํฌ, ๋ค์ ์คํ ๋์์ ๊ธฐ๋กํฉ๋๋ค.
ํ์ต ์์๋ ์ ํฉ์ฑ ๋๋๊ฐ ๋ฎ์ ๊ธฐ๋ฅ์์ ๋์ ๊ธฐ๋ฅ์ผ๋ก ํ์ฅํฉ๋๋ค.
- ํ์๊ณผ ์ง๊ฐ ๊ณ์
- ์์ก ์กฐํ์ ๊ฑฐ๋ ๋ด์ญ
- ์ถฉ์ , ์ถ๊ธ, ์ก๊ธ
- ๋ฉฑ๋ฑ ์์ฒญ ํค์ ์ค๋ณต ๊ฑฐ๋ ๋ฐฉ์ง
- ๊ฑฐ๋ ํ๋์ ์ํ ์ ์ด
- ์์ฅ ๋ชจ๋ธ๊ณผ ๊ฐ์ฌ ๋ก๊ทธ
- ์ฅ์ ๋ณด์, ์ฌ์ฒ๋ฆฌ, ์ ์ฐ ๋ฐฐ์น
- ์ด์๊ฑฐ๋ ํ์ง ๊ท์น์ ๊ธฐ์ด
ํ๋ค์ค๋ ์ญํ ๋ณ ๊ด์ ์ ๋ถ๋ฆฌํด ๊ฐ์ ๊ธฐ๋ฅ์ ๋ฐ๋ณต ๊ฒ์ฆํ๋ ์์ ๋ฐฉ์์ ๋๋ค.
| ์ญํ | ์ฑ ์ | ์ฐ์ถ๋ฌผ |
|---|---|---|
| ๊ธฐํ์ | ๋ฌธ์ ์ ์, ์ฌ์ฉ์ ์๋๋ฆฌ์ค, ์์ฉ ๊ธฐ์ค ์์ฑ | Issue, ์ฌ์ฉ์ ์คํ ๋ฆฌ, acceptance criteria |
| ๋๋ฉ์ธ ์ ๋ฌธ๊ฐ | ๊ธ์ต ๊ท์น, ๋ถ๋ณ์, ์์ธ ์ ์ฑ ๊ฒํ | ๋๋ฉ์ธ ๊ท์น ๋ฌธ์, ์ฉ์ด์ง, ์ ์ฑ ๊ฒฐ์ |
| ์ฌ์ฉ์ ๊ฐ๋ฐ์ | ์ค์ ๊ตฌํ ์ฐธ์ฌ, ์ต์ข ์์ฌ๊ฒฐ์ | ์ฝ๋, ๋ฆฌ๋ทฐ ์๊ฒฌ, ์ค๊ณ ์น์ธ |
| ์ฝ๋ ๊ฐ๋ฐ์ A | ๊ตฌํ ๋๋ ๋ฆฌํฉํฐ๋ง ๋ด๋น | ์ฝ๋, ๋จ์ ํ ์คํธ, PR ์ค๋ช |
| ์ฝ๋ ๊ฐ๋ฐ์ B | ๋์ ๊ตฌํ ๊ฒํ , ์ฝ๋ ๋ฆฌ๋ทฐ ๋ด๋น | ๋ฆฌ๋ทฐ ์ฝ๋ฉํธ, ๊ฒฐํจ ์ง์ , ๊ฐ์ ์ |
| QA | ํ ์คํธ ์๋๋ฆฌ์ค, ๊ฒฝ๊ณ๊ฐ, ํ๊ท ๊ฒ์ฆ | QA ์ฒดํฌ๋ฆฌ์คํธ, ํ ์คํธ ์ผ์ด์ค, ๋ฒ๊ทธ ์ด์ |
| ๋ฆด๋ฆฌ์ค ๊ด๋ฆฌ์ | ๋ฒ์ , ๋ณ๊ฒฝ ์ด๋ ฅ, ๋ฐฐํฌ ๊ฐ๋ฅ ์ํ ๊ด๋ฆฌ | ํ๊ทธ, GitHub Release, ๋ฆด๋ฆฌ์ค ๋ ธํธ |
- ๊ธฐํ์๊ฐ Issue์ ๋ฌธ์ , ๋ฒ์, ์์ฉ ๊ธฐ์ค์ ์์ฑํฉ๋๋ค.
- ๋๋ฉ์ธ ์ ๋ฌธ๊ฐ๊ฐ ์ ์ฑ , ๋ถ๋ณ์, ์์ธ ์ผ์ด์ค๋ฅผ ๋ณด๊ฐํฉ๋๋ค.
- ๊ฐ๋ฐ์๋ ๊ธฐ๋ฅ ๋ธ๋์น๋ฅผ ์์ฑํ๊ณ ์ฝ๋์ ํ ์คํธ๋ฅผ ํจ๊ป ์์ฑํฉ๋๋ค.
- ์ฝ๋ ๊ฐ๋ฐ์ 2๋ช ์ด ์ํธ ๋ฆฌ๋ทฐ๋ฅผ ์ํํฉ๋๋ค.
- QA๊ฐ ์์ฉ ๊ธฐ์ค๊ณผ ํ๊ท ์๋๋ฆฌ์ค๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ฒ์ฆํฉ๋๋ค.
- ์น์ธ๋ ๋ณ๊ฒฝ๋ง
main์ ๋ณํฉํฉ๋๋ค. - ๋ฆด๋ฆฌ์ค ๋์ ๋ณ๊ฒฝ์ ํ๊ทธ์ GitHub Release๋ก ๊ธฐ๋กํฉ๋๋ค.
- ๊ธฐ๋ณธ ๋ธ๋์น:
main - ๊ธฐ๋ฅ ๋ธ๋์น:
feature/<issue-number>-<short-name> - ๋ฒ๊ทธ ์์ ๋ธ๋์น:
fix/<issue-number>-<short-name> - ๋ฌธ์ ๋ธ๋์น:
docs/<issue-number>-<short-name> - ๋ฆด๋ฆฌ์ค ๋ธ๋์น:
release/v<major>.<minor> - ๊ธด๊ธ ์์ ๋ธ๋์น:
hotfix/v<major>.<minor>.<patch>
PR์ ๋ค์ ์กฐ๊ฑด์ ๋ง์กฑํด์ผ ํฉ๋๋ค.
- ๊ด๋ จ Issue๋ฅผ ์ฐ๊ฒฐํฉ๋๋ค.
- ๋๋ฉ์ธ ๊ท์น ๋ณ๊ฒฝ ์ฌ๋ถ๋ฅผ ๋ช ์ํฉ๋๋ค.
- ์ฝ๋์ ํ ์คํธ ์ฝ๋๋ฅผ ํจ๊ป ํฌํจํฉ๋๋ค.
- ํธ๋ ์ด๋์คํ ๋๋ ๋์์ด ์์ผ๋ฉด PR ๋ณธ๋ฌธ์ด๋ ADR์ ๊ธฐ๋กํฉ๋๋ค.
- ์ต์ 2๊ฐ ๊ฐ๋ฐ์ ๊ด์ ์ ๋ฆฌ๋ทฐ์ QA ์ฒดํฌ๋ฅผ ํต๊ณผํฉ๋๋ค.
GitHub ์์ ํ ํ๋ฆฟ:
ํ ์คํธ๋ ์ ํ์ด ์๋๋ผ ๊ธฐ๋ฅ ์๋ฃ ์กฐ๊ฑด์ ๋๋ค.
- ๋จ์ ํ ์คํธ: ๋๋ฉ์ธ ๊ฐ์ฒด, ์ ์ฑ , ์ํ ์ ์ด๋ฅผ ๊ฒ์ฆํฉ๋๋ค.
- ํตํฉ ํ ์คํธ: DB ํธ๋์ญ์ , Repository, API ๊ฒฝ๊ณ๋ฅผ ๊ฒ์ฆํฉ๋๋ค.
- ๋์์ฑ ํ ์คํธ: ์์ก ๋ณ๊ฒฝ, ์ค๋ณต ์์ฒญ, ๋๊ด์ /๋น๊ด์ ๋ฝ ์ ๋ต์ ๊ฒ์ฆํฉ๋๋ค.
- ๊ณ์ฝ ํ ์คํธ: ์ธ๋ถ ์์คํ ์ ๋ถ์ผ ๊ฒฝ์ฐ ์์ฒญ/์๋ต ๊ณ์ฝ์ ๊ฒ์ฆํฉ๋๋ค.
- ํ๊ท ํ ์คํธ: ๋ฒ๊ทธ ์์ ์ ์คํจ ์ฌํ ํ ์คํธ๋ฅผ ๋จผ์ ์ถ๊ฐํฉ๋๋ค.
์ด๊ธฐ ํ์ง ๊ฒ์ดํธ๋ ๋ค์ ๋ช ๋ น์ ๊ธฐ์ค์ผ๋ก ์ก์ต๋๋ค.
./gradlew test
./gradlew scenarioTest
./gradlew postgresScenarioTest
./gradlew check
cd frontend && npm run test
cd frontend && npm run build
cd frontend && npm run e2eํ์ฌ ๋ธ๋์น์๋ Gradle Wrapper์ React/Vite ํ๋ก ํธ๊ฐ ํฌํจ๋์ด ์์ผ๋ฏ๋ก ์ ๋ช
๋ น์ ํ์ค ํ์ง ๊ฒ์ดํธ๋ก ์ฌ์ฉํฉ๋๋ค. test๋ ๋จ์/API/์ ์ฅ์ ์ค์ฌ์ ๋น ๋ฅธ ํ๊ท ๊ฒ์ดํธ์ด๊ณ , scenarioTest๋ ๋ํ ์ฌ์ฉ์/์ด์ ํ๋ฆ์ ๊ฒ์ฆํ๋ ์๋๋ฆฌ์ค ๊ฒ์ดํธ์
๋๋ค. postgresScenarioTest๋ Docker/Testcontainers ๊ธฐ๋ฐ ์ค์ PostgreSQL profile ๋ํ ํ๋ฆ์ ๊ฒ์ฆํฉ๋๋ค. frontend unit test๋ React ์ํ์ API payload ํ๊ท๋ฅผ ๋น ๋ฅด๊ฒ ๊ฒ์ฆํ๊ณ , frontend build๋ TypeScript/Vite smoke gate์ด๋ฉฐ, frontend E2E๋ ๋ธ๋ผ์ฐ์ ์์ Vite proxy์ Spring Boot API ์ฐ๊ฒฐ์ ๊ฒ์ฆํฉ๋๋ค.
๋ก์ปฌ ํ
์คํธ ์คํ ์์์ ์คํจ ๋์์ Local Test Guide๋ฅผ ๋ฐ๋ฆ
๋๋ค.
์๋๋ฆฌ์ค ํ
์คํธ ์ถ๊ฐ ๊ธฐ์ค์ Scenario Test Strategy๋ฅผ ๋ฐ๋ฆ
๋๋ค.
Outbox relay๋ publisher port ๋ค์ ๊ธฐ๋ณธ in-memory adapter์ ์ ํํ HTTP broker adapter๋ฅผ ๋ก๋๋ค. ๊ธฐ๋ณธ ๋ก์ปฌ ์คํ์ memory์ด๋ฉฐ, http type์์๋ ์ค์ HTTP endpoint๋ก event envelope๋ฅผ ๋ฐํํ๊ณ contract test๋ก method/header/body๋ฅผ ๊ฒ์ฆํฉ๋๋ค.
IntelliJ IDEA ๊ธฐ์ค ์ค์ ์ Local Setup์ ๋ฐ๋ฆ ๋๋ค.
๋ก์ปฌ Docker Desktop k8s์ ์ ์ฒด ์คํ(์ฑ + Postgres + Prometheus + Grafana + Loki)์ ๋์ฐ๋ ๊ตฌ๋ ๋ฐฉ๋ฒ๊ณผ ์๋น์ค๋ณ ์ ์ URLยท๊ณ์ ์ ๋ณด, ๋์๋ณด๋/LogQL ๋ก๊ทธ ๊ฒ์์ k8s ๋ก์ปฌ ๋ฐฐํฌ + ๋ชจ๋ํฐ๋ง + ๋ก๊ทธ ๊ฒ์์ ๋ฐ๋ฆ ๋๋ค. main ๋จธ์ง ์ ์๋ ๋ฐฐํฌ๋๋ GitHub Actions โ GHCR โ ArgoCD ํ์ดํ๋ผ์ธ์ CI/CD GitOps๋ฅผ ๋ฐ๋ฆ ๋๋ค.
./scripts/k8s-local-up.sh # ์ ์ฒด ์คํ ๊ธฐ๋
./scripts/k8s-local-down.sh # ์ ์ฒด ์ ๊ฑฐ
./scripts/argocd-install.sh # (์ ํ) ArgoCD ์ค์น + GitOps ๋ชจ๋| ์๋น์ค | URL | ๊ณ์ |
|---|---|---|
| ์ฑ API | http://localhost:30080 | ์ด์ API ํค๋: X-Operator-Token: local-k8s-ops-operator-token / X-Admin-Token: local-k8s-ops-admin-token (deploy/k8s/secrets.yaml, ADR-0062 fail-fast๋ก ๋น-๊ธฐ๋ณธ ๊ฐ) |
| Grafana ๋์๋ณด๋ | http://localhost:30300/d/ai-repo-overview | ์ต๋ช Admin (๋ก๊ทธ์ธ ๋ถํ์) |
| Grafana ๋ก๊ทธ ๊ฒ์ | http://localhost:30300/explore | ์ต๋ช Admin (๋ก๊ทธ์ธ ๋ถํ์) |
| Prometheus | http://localhost:30990 | ์์ |
| ArgoCD | https://localhost:8443 (port-forward ํ) | admin / ์ด๊ธฐ ๋น๋ฐ๋ฒํธ ์กฐํ ๋ช
๋ น์ ๊ฐ์ด๋ ์ฐธ๊ณ |
์๋น์ค๋ณ ์ ์ฒด ์ ์ ์ ๋ณด(PostgresยทLoki ํฌํจ)์ ๋ณต์ฌ-์คํ ๋ช ๋ น์ด ๋ชจ์์ k8s ๋ก์ปฌ ๋ฐฐํฌ + ๋ชจ๋ํฐ๋ง + ๋ก๊ทธ ๊ฒ์์ "์ ์ ์ ๋ณด"ยท"์ ์ฒด ๋ช ๋ น์ด ๋ชจ์" ์น์ ์ ์์ต๋๋ค. ์ธํ๋ผยท์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์กฐ๋ ์ํคํ ์ฒ ๋ค์ด์ด๊ทธ๋จ(mermaid)์ ์ฐธ๊ณ ํฉ๋๋ค.
๊ธฐ๋ณธ ๋ก๊ทธ ์คํ์ ์ PLG(Loki)์
๋๋ค. ๋ก๊ทธ ํ์ฑยท๊ฒ์์ ํ์ตํ๋ ค๋ฉด opt-in ELK ์คํ(FilebeatโLogstashโElasticsearchโKibana)์ logging ๋ค์์คํ์ด์ค์ ๋ณ๋๋ก ๋์ธ ์ ์์ต๋๋ค. PLG๋ฅผ ๋์ฒดํ์ง ์๊ณ ๋ณ์กดํ๋ฉฐ, ๋ฆฌ์์ค ๋ถ๋ด์ด ์ปค ๊ธฐ๋ณธ off์
๋๋ค(ADR-0066). ๊ตฌ๋ยทKQL ๊ฒ์ยทํธ๋ฌ๋ธ์ํ
์ ELK ๋ก์ปฌ ๋ก๊น
๊ฐ์ด๋, ๊ฐ๋
ํ์ต์ ELK ํ์ต ๋ฌธ์๋ฅผ ๋ฐ๋ฆ
๋๋ค.
on/off๋ ์ธ ๋ฐฉ์ ์ค ํ๋๋ก ํ๋ฉฐ(์์ง ์์): โ ๋
๋ฆฝ ์คํฌ๋ฆฝํธ, โก ๋ฉ์ธ ์คํ env ํ๋๊ทธ AI_REPO_ELK_ENABLED=true, โข ArgoCD ์๋ sync App(deploy/argocd/logging-application.yaml, automated ์์ โ ๊ธฐ์กด ai-repo App์ ํญ์ ์ผ์ง๋ฏ๋ก ๋ถ๋ฆฌ).
./scripts/elk-local-up.sh # โ ELK๋ง ๊ธฐ๋ (logging ๋ค์์คํ์ด์ค)
./scripts/elk-local-down.sh # โ ELK๋ง ์ ๊ฑฐ
AI_REPO_ELK_ENABLED=true ./scripts/k8s-local-up.sh # โก PLG + ELK ํจ๊ป
# โข ArgoCD(GitOps): App ๋ฑ๋ก ํ UI/CLI์์ Sync(์ผ๊ธฐ)/Delete(๋๊ธฐ)
kubectl apply -f deploy/argocd/logging-application.yaml && argocd app sync ai-repo-logging| ์๋น์ค | URL | ๊ณ์ |
|---|---|---|
| Kibana (Discover/KQL) | http://localhost:30561 | ์์ (๋ก์ปฌ ํ์ต์ฉ xpack.security.enabled=false) |
| Elasticsearch API | http://localhost:30920 | ์์ (์ธ๋ฑ์ค ํจํด spring-logs-*) |
ํ์ฌ ๊ธฐ๋ฅ ํ๋ฆ์ ์์ก/๊ฑฐ๋๋ด์ญ ์กฐํ, ํ์/์ง๊ฐ ๊ณ์ , ์ถฉ์ /์ก๊ธ, ์์ฅ/๊ฐ์ฌ ๋ก๊ทธ 1์ฐจ API๋ฅผ ์ ๊ณตํฉ๋๋ค.
GET /api/v1/wallets/wallet-001/balanceGET /api/v1/wallets/wallet-001/transactionsPOST /api/v1/wallets/wallet-001/chargesPOST /api/v1/wallets/wallet-001/transfersGET /api/v1/wallets/wallet-001/ledger-entriesGET /api/v1/audit-eventsGET /api/v1/operations/op-001/step-logsGET /api/v1/operations/op-001/outbox-eventsGET /api/v1/outbox-events/manual-reviewPOST /api/v1/outbox-events/outbox-001/requeue-requestsGET /api/v1/outbox-events/outbox-001/requeue-requestsPOST /api/v1/outbox-events/requeue-requests/outbox-requeue-request-001/approvePOST /api/v1/outbox-events/requeue-requests/outbox-requeue-request-001/executePOST /api/v1/outbox-events/requeue-requests/outbox-requeue-request-001/rejectGET /api/v1/outbox-events/outbox-001/requeue-auditsGET /api/v1/outbox-consumer/metricsGET /api/v1/outbox-consumer/window-metricsGET /api/v1/outbox-consumer/healthGET /api/v1/outbox-consumer/receiptsPOST /api/v1/outbox-consumer/pruning-runsGET /api/v1/outbox-relay-runsGET /api/v1/outbox-relay-runs/healthGET /api/v1/operational-alertsGET /api/v1/admin-api-access-auditsPOST /api/v1/operational-log-pruning-runs
์๋์ ์ ์ธ์ฆ(ADR-0056/0057): ํ์์ POST /api/v1/auth/tokens๋ก ๋ก๊ทธ์ธํด HS256 JWT(subject=memberId)๋ฅผ ๋ฐ๊ธ๋ฐ๊ณ , Bearer ํ ํฐ์ผ๋ก ์ง๊ฐ API๋ฅผ ํธ์ถํฉ๋๋ค. ์ง๊ฐ ์กฐํ/๋ช
๋ น์ ์๋น์ค ๊ณ์ธต์์ ํ ํฐ ์์ ์์ ์ง๊ฐ ์์ ์๋ฅผ ๋์กฐํ๋ per-user ownership ๊ฒ์ฌ๋ฅผ ํต๊ณผํด์ผ ํฉ๋๋ค. ๊ธฐ๋ณธ JWT secret ์ฌ์ฉ์ JwtSecretGuard๊ฐ ๊ธฐ๋ ์ ์ฐจ๋จํฉ๋๋ค. ํ
์คํธ ํฝ์ค์ฒ๋ POST /api/v1/test-fixtures(property๋ก ๊ฒ์ดํธ)๋ก ์ค๋นํ๊ณ , HTTP broker ์๋น ๋ฃจํ๋ POST /internal/broker/outbox-events๋ก ์ด๋ฒคํธ๋ฅผ ์์ ํฉ๋๋ค. ์ด broker ์๋ํฌ์ธํธ๋ brokerโconsumer shared secret ํค๋ X-Broker-Token์ ์๊ตฌํฉ๋๋ค(ADR-0065): ์ ์ฉ SecurityFilterChain(Order 3)์ด MessageDigest.isEqual ์์์๊ฐ ๋น๊ต๋ก ๊ฒ์ฆํ๊ณ ๋ถ์ผ์น/๋๋ฝ ์ 401์ ๋ฐํํ๋ฉฐ, publisher(HttpOperationOutboxPublisher)๋ ๊ฐ์ secret์ ๋ถ์ฐฉํฉ๋๋ค. ๊ธฐ๋ณธ broker token ์ฌ์ฉ์ BrokerTokenGuard๊ฐ ๋ฐฐํฌ ํ๋กํ์ผ(postgres/prod)์์ ๊ธฐ๋ ์ ์ฐจ๋จํฉ๋๋ค.
Outbox ์ด์ API๋ X-Operator-Token, X-Admin-Token, X-Operator-Id header๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์กฐํ์ฑ ์ด์ API๋ operator token ๋๋ admin token์ผ๋ก ์ ๊ทผํ ์ ์๊ณ , requeue ์น์ธ/์คํ/๋ฐ๋ ค์ operational log pruning, consumer pruning ๊ฐ์ ๋ณ๊ฒฝ์ฑ ์ด์ ์กฐ์น๋ admin token์ ์๊ตฌํฉ๋๋ค. ์ด์ API ์ธ์ฆ ํํฐ์ ์ ๊ทผ ๊ฐ์ฌ ํํฐ๋ root ๋๋ ํ์ path segment๋ง ๋งค์นญํ๋ ๊ณตํต path matcher๋ฅผ ์ฌ์ฉํด /api/v1/outbox-events-v2 ๊ฐ์ lookalike prefix๋ฅผ ์ด์ API๋ก ์คํํ์ง ์์ต๋๋ค. ๋ก์ปฌ ๊ธฐ๋ณธ token์ local-operator-token, local-ops-token์ด๋ฉฐ, ์ค์ ์คํ์์๋ AI_REPO_OPS_OPERATOR_TOKEN, AI_REPO_OPS_ADMIN_TOKEN ํ๊ฒฝ ๋ณ์๋ก overrideํฉ๋๋ค. Broker ์ธ์ฆ token์ consumer AI_REPO_OUTBOX_CONSUMER_BROKER_TOKEN๊ณผ publisher AI_REPO_OUTBOX_PUBLISHER_HTTP_BROKER_TOKEN์ผ๋ก ์ฃผ์
ํ๋ฉฐ(๋ก์ปฌ ๊ธฐ๋ณธ local-broker-token, ๋ ๊ฐ์ ์ผ์นํด์ผ ํจ), ๋ฐฐํฌ ํ๋กํ์ผ์์๋ ์ฃผ์
์ด ๊ฐ์ ๋ฉ๋๋ค. Manual review requeue๋ REQUESTED -> APPROVED -> EXECUTED์ REQUESTED -> REJECTED ์ํฌํ๋ก์ฐ๋ฅผ ์ฌ์ฉํ๋ฉฐ, ์น์ธ์/๋ฐ๋ ค์๋ ์์ฒญ์์ ๋ฌ๋ผ์ผ ํฉ๋๋ค. ๊ธฐ์กด ์ง์ requeue API๋ workflow ์ฐํ๋ฅผ ๋ง๊ธฐ ์ํด 410 Gone๊ณผ DIRECT_REQUEUE_API_DEPRECATED๋ฅผ ๋ฐํํฉ๋๋ค. Requeue audit์ operator๋ request body๊ฐ ์๋๋ผ ์คํ ๋จ๊ณ์ X-Operator-Id์์ ๊ธฐ๋กํฉ๋๋ค. ๋ฐ๋ ค ์ outbox event๋ MANUAL_REVIEW ์ํ๋ฅผ ์ ์งํ๊ณ requeue audit์ ๋จ๊ธฐ์ง ์์ต๋๋ค. Consumer ์ฒ๋ฆฌ ์งํ์ duplicate health๋ /api/v1/outbox-consumer/metrics, /api/v1/outbox-consumer/window-metrics, /api/v1/outbox-consumer/health์์ ์กฐํํ๊ณ , ์ต๊ทผ receipt๋ /api/v1/outbox-consumer/receipts์์ ์กฐํํฉ๋๋ค. ์ค๋๋ consumer dedupe/receipt ๊ธฐ๋ก์ /api/v1/outbox-consumer/pruning-runs์์ ์ ๋ฆฌํฉ๋๋ค. Relay scheduler ์คํ ๊ฒฐ๊ณผ๋ /api/v1/outbox-relay-runs์์ ์ต๊ทผ ์ด๋ ฅ์ผ๋ก ์กฐํํ๊ณ , /api/v1/outbox-relay-runs/health์์ health summary์ alert ํ์ ์ ์กฐํํฉ๋๋ค. Warning/Critical health ํ์ ์ ์ด์ alert record๋ก ์ ์ฅ๋๊ณ /api/v1/operational-alerts์์ ์กฐํํฉ๋๋ค. ์ด์ API ์ ๊ทผ ์ฑ๊ณต/์คํจ ์ด๋ ฅ์ /api/v1/admin-api-access-audits์์ ์กฐํํฉ๋๋ค. ์ด์ ๊ด์ธก ๋ก๊ทธ pruning์ /api/v1/operational-log-pruning-runs์์ ์๋ ์คํํฉ๋๋ค.
๋ณ๊ฒฝ ๋๋ฝ ๊ฒ์ฌ๋ .dev/rules์ scripts/check-dev-rules.sh๋ก ์ํํฉ๋๋ค. CI์ Dev Rules Check job์ ์ฝ๋, DB, ํ๋ก ํธ, ์ด์ ์คํฌ๋ฆฝํธ ๋ณ๊ฒฝ ์ ADR/progress/Wiki/test/release ๋ฌธ์ ๋๊ธฐํ ๋๋ฝ์ ํ์ผ ๋ณ๊ฒฝ ๊ธฐ์ค์ผ๋ก ํ์งํฉ๋๋ค.
Outbox relay scheduler๋ ๊ธฐ๋ณธ ๋นํ์ฑํ์
๋๋ค. ์๋ ๋ฐํ์ ๋ก์ปฌ์์ ํ์ธํ๋ ค๋ฉด AI_REPO_OUTBOX_RELAY_SCHEDULER_ENABLED=true๋ฅผ ์ค์ ํฉ๋๋ค. Batch size์ ์คํ ์ฃผ๊ธฐ๋ AI_REPO_OUTBOX_RELAY_BATCH_SIZE, AI_REPO_OUTBOX_RELAY_INITIAL_DELAY_MS, AI_REPO_OUTBOX_RELAY_FIXED_DELAY_MS๋ก ์กฐ์ ํฉ๋๋ค.
Operational log pruning scheduler๋ ๊ธฐ๋ณธ ๋นํ์ฑํ์
๋๋ค. ์๋ pruning์ ๋ก์ปฌ์์ ํ์ธํ๋ ค๋ฉด AI_REPO_OPERATIONAL_LOG_PRUNING_SCHEDULER_ENABLED=true๋ฅผ ์ค์ ํฉ๋๋ค. Relay run ๊ธฐ๋ณธ ๋ณด์กด ๊ธฐ๊ฐ์ 30์ผ, admin access audit ๊ธฐ๋ณธ ๋ณด์กด ๊ธฐ๊ฐ์ 180์ผ์
๋๋ค.
Operational alert๋ ๊ฐ์ source/severity/reasons ์กฐํฉ์ ๊ธฐ๋ณธ 15๋ถ ๋์ ์ค๋ณต ์ ์ฅํ์ง ์์ต๋๋ค. suppression window์ ๋ณด์กด ๊ธฐ๊ฐ์ AI_REPO_OPERATIONAL_ALERT_SUPPRESSION_WINDOW_MINUTES, AI_REPO_OPERATIONAL_ALERT_RETENTION_DAYS๋ก ์กฐ์ ํฉ๋๋ค. ์ค๋๋ alert record๋ operational log pruning ์คํ ์ ํจ๊ป ์ญ์ ๋ฉ๋๋ค.
Slack Incoming Webhook ํธํ alert push๋ ๊ธฐ๋ณธ ๋นํ์ฑํ์
๋๋ค. ๋ก์ปฌ์์ ํ์ธํ๋ ค๋ฉด AI_REPO_OPERATIONAL_ALERT_PUBLISHER_TYPE=slack-webhook, AI_REPO_OPERATIONAL_ALERT_SLACK_WEBHOOK_URL=<webhook-url>์ ์ค์ ํฉ๋๋ค. Slack ๋ฐํ ์คํจ๋ health API์ alert record ์ ์ฅ์ ์คํจ์ํค์ง ์์ต๋๋ค.
Consumer pruning scheduler๋ ๊ธฐ๋ณธ ๋นํ์ฑํ์
๋๋ค. ์๋ pruning์ ๋ก์ปฌ์์ ํ์ธํ๋ ค๋ฉด AI_REPO_OUTBOX_CONSUMER_PRUNING_SCHEDULER_ENABLED=true๋ฅผ ์ค์ ํฉ๋๋ค. Processed-event, receipt, delivery metric bucket ๊ธฐ๋ณธ ๋ณด์กด ๊ธฐ๊ฐ์ ๊ฐ๊ฐ 30์ผ์
๋๋ค. ์ค์ broker๋ฅผ ์ฐ๊ฒฐํ ๋๋ dedupe ๋ณด์กด ๊ธฐ๊ฐ์ broker replay ๊ฐ๋ฅ ๊ธฐ๊ฐ๋ณด๋ค ๊ธธ๊ฒ ์ก์์ผ ํฉ๋๋ค.
์ถฉ์ /์ก๊ธ์ KRW ๋จ์ผ ํตํ์ ๋ฉฑ๋ฑํค๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์์ฅ/๊ฐ์ฌ ๋ก๊ทธ๋ Issue #7 ๊ธฐ์ค์ผ๋ก ํ์ฅ ์ค์ด๋ฉฐ, 1์ฐจ ๋ฒ์์์๋ ์ธ๋ฉ๋ชจ๋ฆฌ ์กฐํ API๋ก ๊ฒ์ฆํฉ๋๋ค.
๊ธฐ๋ณธ ์คํ์ ์ธ๋ฉ๋ชจ๋ฆฌ ์ ์ฅ์๋ฅผ ์ฌ์ฉํฉ๋๋ค. PostgreSQL ์ ์ฅ์๋ postgres ํ๋กํ์์ ํ์ฑํํฉ๋๋ค.
๋ก์ปฌ PostgreSQL์ compose.yml์ postgres ์๋น์ค๋ก ์คํํ ์ ์์ต๋๋ค.
postgres ํ๋กํ์ ์คํค๋ง ๊ธฐ์ค์ Flyway migration์
๋๋ค. ์ด๊ธฐ migration์ src/main/resources/db/migration์ ๋๋ฉฐ, ๊ธฐ์กด src/main/resources/db/postgresql SQL ํ์ผ์ H2 ํ
์คํธ์ ์๋ ๋น๊ต๋ฅผ ์ํด ์ผ์์ ์ผ๋ก ์ ์งํฉ๋๋ค.
React ์ฌ์ฉ์ ํ๋ฉด๊ณผ ์ด์์ manual review ์ฝ์์ React User Frontend๋ฅผ ๋ฐ๋ฆ
๋๋ค. ๋ฐฑ์๋๋ ./gradlew bootRun์ผ๋ก ์คํํ๊ณ , ํ๋ก ํธ๋ frontend์์ npm install, npm run dev๋ก ์คํํฉ๋๋ค. ๋ก์ปฌ ๊ฒ์ฆ์ Local Test Guide๋ฅผ ๊ธฐ์ค์ผ๋ก ํฉ๋๋ค.
README๋ ์ ์ฅ์์ ๊ณ์ฝ๊ณผ ๋ฐฉํฅ์ ๋ด๊ณ , ์์ธ ๋ฌธ์๋ GitHub Wiki๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ค์ํ ๊ฒฐ์ ์ source of truth๋ ADR์ ๋๋ค. README์ Wiki๋ ADR์ ์์ฝํ๊ฑฐ๋ ์ฐ๊ฒฐํ ์ ์์ง๋ง, ๊ฒฐ์ ์์ฒด๋ฅผ ๋์ฒดํ์ง ์์ต๋๋ค.
๋จ๊ณ๋ณ ์์ ์๋ฃ ํ์ ์ Progress Reports์ ๋จ๊น๋๋ค. ADR์ด ์์ฌ๊ฒฐ์ ๊ธฐ๋ก์ด๋ผ๋ฉด, Progress Reports๋ ๊ฐ ์์ ์์ ์๋ฃ๋ ๊ฒฐ๊ณผ, ๊ฒ์ฆ, ๋จ์ ์ผ์ ์งง๊ฒ ์ถ์ ํ๋ ๋ฌธ์์ ๋๋ค.
ADR ์ ์ฒด ๋ชฉ๋ก๊ณผ ์ํ๋ ๋จ์ผ ์ธ๋ฑ์ค์์ ๊ด๋ฆฌํฉ๋๋ค (ํ์ฌ ์ต์ ADR-0057): ADR Index. READMEยทWiki๋ ์ด ์ธ๋ฑ์ค๋ฅผ ๋ณต์ฌํ์ง ์๊ณ ๋งํฌ๋ง ์ ์งํด ์ค๋ณต ๊ฐฑ์ ์ ์์ฑ๋๋ค.
ํ๋ก์ ํธ ์ ์ฒด ๊ตฌ์กฐยท๋ฐ์ดํฐ ํ๋ฆ์ Architecture Overview, ๋๋ฉ์ธ ์ฉ์ด๋ Glossary, ์ฒ์ ์คํ์ **Getting Started**๋ฅผ ์ฐธ๊ณ ํฉ๋๋ค.
๊ถ์ฅ Wiki ๊ตฌ์กฐ:
Home: ์ ์ฒด ์ง๋์ ํ์ฌ ๋ฆด๋ฆฌ์ค ์ํGlossary: ๊ณ์ , ์ง๊ฐ, ์์ฅ, ๊ฑฐ๋, ์ ์ฐ ๋ฑ ์ฉ์ด์งDomain-Rules: ๋๋ฉ์ธ ๋ถ๋ณ์๊ณผ ์ ์ฑArchitecture-Decisions: ADR ๋ชฉ๋ก๊ณผ ๊ฒฐ์ ๋ฐฐ๊ฒฝDevelopment-Workflow: ๋ธ๋์น, PR, ๋ฆฌ๋ทฐ, ํ ์คํธ ๊ท์นHarness-Roles: ํ๋ค์ค ์ญํ ๋ณ ์ฑ ์๊ณผ ์ฒดํฌ ๊ธฐ์คQA-Scenarios: QA ๊ด์ ์ ์๋๋ฆฌ์ค์ ๊ฒฝ๊ณ๊ฐRelease-Notes: ๋ฆด๋ฆฌ์ค๋ณ ๋ณ๊ฒฝ ์ฌํญ๊ณผ ์๋ ค์ง ๋ฆฌ์คํฌMCP-and-Skills: ์ฌ์ฉํ MCP ์๋ฒ์ ์ปค์คํ ์คํฌ ๋ชฉ๋ก
ADR์ ๋ค์ ํ์์ ์ฌ์ฉํฉ๋๋ค.
# ADR-0001: ๊ฒฐ์ ์ ๋ชฉ
## ์ํ
Proposed | Accepted | Deprecated | Superseded
## ๋งฅ๋ฝ
๋ฌธ์ ์ ์ ์ฝ ์กฐ๊ฑด
## ์ ํ์ง
๋์ A / B / C
## ๊ฒฐ์
์ ํํ ๋ฐฉ์
## ๊ฒฐ๊ณผ
์ฅ์ , ๋จ์ , ํ์ ์์
์ด๊ธฐ ๋ฒ์ ์ 0.x๋ก ์์ํฉ๋๋ค.
v0.1.0: ํ๋ก์ ํธ ์ค์บํด๋ฉ, ๊ธฐ๋ณธ CI, ํ์/์ง๊ฐ ๊ณ์ ๋ผ๋v0.2.0: ์์ก ์กฐํ, ๊ฑฐ๋ ๋ด์ญ, ํ์/์ง๊ฐ ๊ณ์ , ์ถฉ์ /์ก๊ธ 1์ฐจv0.3.0: ์์ฅ ๋ชจ๋ธ, ๊ฐ์ฌ ๋ก๊ทธ, PostgreSQL ์ ์ฅ์ ํ๋ณดv0.4.0: ์์ฅ ๋ชจ๋ธ, ๊ฐ์ฌ ๋ก๊ทธv0.5.0: PostgreSQL ์คํค๋ง migration, ์ ์ฐ ๋ฐฐ์น ํ๋ณดv0.6.0: outbox ์ฌ์ฒ๋ฆฌ, manual review, requeue ๊ฐ์ฌ ์ด๋ ฅ, ์ฒซ GitHub Release ๊ธฐ์ค์v0.7.0: 1์ฐจ MVP ์์ฐ ๊ธฐ์ค์unreleased:v0.7.0์ดํ ๋ณ๊ฒฝ ํ๋ณด
ํ์ฌ ๋ฆด๋ฆฌ์ค ๋ ธํธ:
๋ฆด๋ฆฌ์ค ๋ ธํธ์๋ ๋ฐ๋์ ๋ค์์ ํฌํจํฉ๋๋ค.
- ํฌํจ๋ ๊ธฐ๋ฅ
- ๋ณ๊ฒฝ๋ ๋๋ฉ์ธ ๊ท์น
- ๋ง์ด๊ทธ๋ ์ด์ ํ์ ์ฌ๋ถ
- ํ ์คํธ ๊ฒฐ๊ณผ
- ์๋ ค์ง ๋ฆฌ์คํฌ
- ๋ค์ ๋ฆด๋ฆฌ์ค ํ๋ณด
ํ์ํ ๋๋ง ์ฐ๊ฒฐํ๊ณ , ์ฐ๊ฒฐ ๋ชฉ์ ๊ณผ ๊ถํ ๋ฒ์๋ฅผ ๋ฌธ์ํํฉ๋๋ค.
| ํ๋ณด | ๋ชฉ์ | ๋์ ์์ |
|---|---|---|
| GitHub MCP | Issue, PR, Wiki, Release ์์ ์๋ํ | GitHub ์์ ๋์ด ๋์ด๋ ๋ |
| PostgreSQL MCP | ์คํค๋ง ํ์, ์ฟผ๋ฆฌ ์ ๊ฒ, ํ ์คํธ ๋ฐ์ดํฐ ํ์ธ | DB ๋ชจ๋ธ์ด ์๊ธด ๋ค |
| ๊ณต์ ๋ฌธ์ ๊ฒ์ ์คํฌ | Java, Spring, Gradle ๋ณ๊ฒฝ์ฌํญ ํ์ธ | ๋ฒ์ ์ ํ ๋๋ ์ ๊ทธ๋ ์ด๋ ํ๋จ ์ |
| ํํ ํฌ ๋๋ฉ์ธ ์คํฌ | ์์ฅ, ๋ฉฑ๋ฑ์ฑ, ์ ์ฐ, ํ๋ ์ ์ฑ ์ฒดํฌ๋ฆฌ์คํธํ | ๋๋ฉ์ธ ๊ท์น์ด ๋ฐ๋ณต๋ ๋ |
| QA ์๋๋ฆฌ์ค ์คํฌ | ๊ฒฝ๊ณ๊ฐ, ์คํจ ์ฃผ์ , ํ๊ท ์ผ์ด์ค ์์ฑ | ๊ธฐ๋ฅ ํ ์คํธ๊ฐ ๋์ ๋ ๋ |
MCP ๋๋ ์คํฌ์ ํธ์๋ฅผ ์ํ ๋๊ตฌ์ด๋ฉฐ, ์ ์ฅ์์ ๊ฒฐ์ ๊ทผ๊ฑฐ๋ฅผ ๋์ฒดํ์ง ์์ต๋๋ค. ์ค์ํ ํ๋จ์ Issue, PR, ADR, Wiki์ ๋จ๊น๋๋ค.
ํ๋ก์ ํธ์์ ์ค์ ์ฌ์ฉํ ์คํฌ์ project-skills/์ ์ค๋
์ท์ผ๋ก ๋ณด๊ดํฉ๋๋ค. Codex ์๋ ๋ฐ๊ฒฌ์ด ํ์ํ๋ฉด ํ์ํ ์คํฌ ํด๋๋ง $CODEX_HOME/skills ๋๋ ~/.codex/skills๋ก ๋ณต์ฌํฉ๋๋ค.
- ์์ก/๊ฑฐ๋๋ด์ญ ์ฒซ Issue ์ด์์ GitHub Issue๋ก ์ฎ๊น๋๋ค.
- Java 25, Spring Boot, Gradle ๊ธฐ์ค์ ํ๋ก์ ํธ ์ค์บํด๋ฉ์ ์์ฑํฉ๋๋ค.
- ๊ธฐ๋ณธ CI์์
test์check๋ฅผ ์คํํ๋๋ก ๊ตฌ์ฑํฉ๋๋ค. ์์ก/๊ฑฐ๋๋ด์ญ์กฐํ API์ ์ฝ๋์ ํ ์คํธ๋ฅผ ์์ฑํฉ๋๋ค.- ์ฒซ ADR๋ก
Spring Boot 4.x vs 3.5.x์Gradle 9.x vs 8.14+์ ํ์ ๊ธฐ๋กํฉ๋๋ค.
๊ฐ ์์ ์ ๋ค์์ ๋ชจ๋ ๋ง์กฑํด์ผ ์๋ฃ์ ๋๋ค.
- Issue์ ์์ฉ ๊ธฐ์ค์ด ์์ต๋๋ค.
- ๊ตฌํ ์ฝ๋์ ํ ์คํธ ์ฝ๋๊ฐ ํจ๊ป ์์ต๋๋ค.
- ๋๋ฉ์ธ ๊ท์น์ด ์ฝ๋ ๋๋ ๋ฌธ์์ ๋ฐ์๋์ด ์์ต๋๋ค.
- ํธ๋ ์ด๋์คํ๊ฐ ํ์ํ ๊ฒฐ์ ์ ADR ๋๋ PR์ ๊ธฐ๋ก๋์ด ์์ต๋๋ค.
- ๋ฆฌ๋ทฐ์ QA ์ฒดํฌ๊ฐ ์๋ฃ๋์ด ์์ต๋๋ค.
- ๋ฆด๋ฆฌ์ค ๋์์ด๋ฉด ๋ฒ์ ๊ณผ ๋ฆด๋ฆฌ์ค ๋ ธํธ๊ฐ ๊ฐฑ์ ๋์ด ์์ต๋๋ค.