์ฝ์ค ๊ทธ๋ฆฌ๊ธฐ๋ก ๋ฌ๋ฆฌ๊ธฐ ์ ๋ชฉํ๋ฅผ ์ค์ ํ๊ณ ์ค์๊ฐ ํธ๋ํน์ผ๋ก ์ฝ์ค๋ฅด ๋ฐ๋ผ ์ ๋ฌ๋ฆฌ๊ณ ์๋์ง ํ์ธํฉ๋๋ค.
์ฝ์ค ๋ฐ๊ฒฌ์ ํตํด ๋์๊ฒ ๋ง๋ ์ฝ์ค๋ฅผ ์ถ์ฒ ๋ฐ๊ฑฐ๋ ๋ค๋ฅธ ์ ์ ๊ฐ ๊ณต์ ํ ์ฝ์ค๋ฅผ ๊ฒ์ํ๊ณ ์คํฌ๋ฉํฉ๋๋ค. ์ฝ์ค๋ฅผ ์ง์ ์ ๋ก๋ํ ์ ๋ ์์ต๋๋ค.
์ฝ์ค ๋ณด๊ดํจ์์ ๋ด๊ฐ ๊ทธ๋ฆฐ ์ฝ์ค์ ์คํฌ๋ฉ ์ฝ์ค๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
๋ง์ดํ์ด์ง์์ ํ๋กํ๊ณผ ํ๋ ๊ธฐ๋ก, ์ ๋ก๋ํ ์ฝ์ค๋ฅผ ํ์ธํ๊ณ ๋ชฉํ ๋ณด์์ผ๋ก ๋๊ธฐ๋ฅผ ๊ฐํํฉ๋๋ค.
| ๋ด๋น์ | ๋ด๋น ๋ด์ฉ |
|---|---|
| ์ ์ํ | EC2, publicCourse & stamp ๊ด๋ จ api, ์ธํ๋ผ ๊ตฌ์ถ |
| ์ ์ ํฌ | RDS, course & user ๊ด๋ จ api, ์ธํ๋ผ ๊ตฌ์ถ |
| ๋ฐ์๋ฆฐ | S3, record & scrap ๊ด๋ จ api, ์ธํ๋ผ ๊ตฌ์ถ |
๐ก ๋๋ฃ๋ค๊ณผ ๋งํฌ๋ฅผ ํต์ผํ๊ธฐ ์ํด ์ปจ๋ฒค์ ์ ์ง์ ํฉ๋๋ค. ์คํฉ์ง์กธ์ ์ฝ๋๊ฐ ์๋, ํ ์ฌ๋์ด ์ง ๊ฒ๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์ถํ ์ ์ง๋ณด์๋ ํ์ ์์ ๋์์ด ๋ฉ๋๋ค. ๋ด๊ฐ ์ฝ๋๋ฅผ ์๊ฐํ๋ฉด์ ์งค ์ ์๋๋ก ํด์ฃผ๋ ๋ฃฐ์ด๋ผ๊ณ ์๊ฐํด๋ ์ข์ต๋๋ค!
๋ช ๋ช ๊ท์น(Naming Conventions)
-
์ด๋ฆ์ผ๋ก๋ถํฐ ์๋๊ฐ ์ฝํ์ง ์ ์๊ฒ ์ด๋ค.
-
๋จ์๋ฅผ ๊ธฐ๋ณธํ์ผ๋ก ํ๋ค.
- ๊ธฐ๋ฅ ์์ฒด์์ ๋จ์, ๋ณต์๋ฅผ ๊ตฌ๋ถํ๋ ๊ฒฝ์ฐ์๋ง ๋ณต์ ์ฌ์ฉ ex. ๋ค์ค์ญ์ , ๋จ์ผ์ญ์
-
DB์ ํ ์ด๋ธ, ํด๋์ค์๋
PascalCase๋ฅผ ์ฌ์ฉํ๋ค. -
๋ณ์, ๋ฉ์๋์๋
camelCase๋ฅผ ์ฌ์ฉํ๋ค. -
DB์ ํ ์ด๋ธ์ ์นผ๋ผ์๋
snake_case๋ฅผ ์ฌ์ฉํ๋ค. -
์์, enum์๋
UPPER_SNAKE_CASE๋ฅผ ์ฌ์ฉํ๋ค. -
๋ฉ์๋๋
crud + http method(๋์ฌ) + ๋ช ์ฌ ํํ๋ก ์์ฑํ๋ค.- c : ex.
createUser - r : ex.
getUser - u : ex.
updateUser - d : ex.
deleteUser
- c : ex.
-
์ฝ์ด ์ฌ์ฉ์ ์ต๋ํ ์ง์ํ๋ค.
-
์ด๋ฆ์ ๋ค ๋จ์ด ์ด์์ด ๋ค์ด๊ฐ๋ฉด ํ์๊ณผ ์์๋ฅผ ๊ฑฐ์น ํ ์ฌ์ฉํ๋ค.
์ฃผ์(Comment)
-
ํด๋น ๋ฉ์๋๊ฐ ์ด๋์ ์ฐ์ด๋์ง ์ค๋ช ํ๋ค.
-
ํด๋น ๋ถ๊ธฐ๋ฌธ์ด ์ด๋ค ๋ถ๊ธฐ์ธ์ง ์ค๋ช ํ๋ค.
-
๋ฐ๋ณต๋ฌธ์์ ์ด๋ค ์กฐ๊ฑด์์ ๋ฐ๋ณต๋๋์ง ์ค๋ช ํ๋ค.
-
์ ๋ ฌํ๊ณ ํํฐ๋งํ ๋ ์ด๋ค ์กฐ๊ฑด์ ์ ๋ ฌ๊ณผ ํํฐ๋ง์ธ์ง ์ค๋ช ํ๋ค.
๐ฑ Trunk-Based Development
main branch : ์ ์ผํ trunk. ํญ์ ๋ฐฐํฌ ๊ฐ๋ฅํ ์ํ๋ฅผ ์ ์งํ๋ฉฐ, ์ด์ ์๋ฒ์ staging ์๋ฒ ๋ชจ๋ ์ด branch์์ ๋ฐฐํฌ๋๋ค.
feature branch: ๊ฐ ์์
๋จ์์ ์งง์ ์๋ช
branch. main์์ ๋ถ๊ธฐํด ํ๋ฃจ~์์ผ ๋ด์ PR๋ก ๋ณํฉํ๋ค.
main์์ ๋ถ๊ธฐ,feat/#issue๋ฒํธ-์์ ์์ฝํ์์ผ๋ก branch ์์ฑ- ๋ธ๋์น๋ช
์ด
test/...๋ก ์์ํ๋ฉด GitHub ref ๊ฒฝ๋ก ์ถฉ๋์ด ๋๋ฏ๋ก ํ ์คํธ ๊ด๋ จ branch๋tests/...(๋ณต์ํ) ์ฌ์ฉ
- ๋ธ๋์น๋ช
์ด
- ์์
์๋ฃ ํ PR ์์ฑ (base:
main)- CI(
buildstatus check)๋ฅผ ํต๊ณผํด์ผ ๋ณํฉ ๊ฐ๋ฅ - ๋ฏธ์์ฑ ๊ธฐ๋ฅ์ ๋ธ๋์น๋ฅผ ์ค๋ ์ด๋ ค๋์ง ๋ง๊ณ , feature flag๋ก ๊ฐ์ธ
main์ ๋น ๋ฅด๊ฒ ํฉ์น๋ค
- CI(
- ๋ฆฌ๋ทฐ ์๋ฃ ํ squash merge, ๋ณํฉ๋ branch๋ ์ญ์
๊ณผ๊ฑฐ์๋ dev/main ๋ ๊ฐ์ ์ฅ์ branch๋ฅผ cherry-pick์ผ๋ก ๋๊ธฐํํ๋ ๋ฐฉ์์ด์์ผ๋, ๋ branch๊ฐ ๋ด์ฉ์ ๊ณ์ ์ด๊ธ๋๋ ๋ฌธ์ (cherry-pick hell)๊ฐ ๋ฐ๋ณต๋์ด ํ๊ธฐํ๋ค.
main์ ํญ์ ๋ฐฐํฌ ๊ฐ๋ฅํ ์ํ๋ฅผ ์ ์งํ๋, staging๊ณผ ์์ฉ์ ๋ฐฐํฌ ํธ๋ฆฌ๊ฑฐ๋ ๋ถ๋ฆฌํ๋ค โ merge ์ฆ์ ์์ฉ๊น์ง ๋๊ฐ๋ฉด ๊ฒ์ฆ ์์ด ๋ฐ๋ก ๋
ธ์ถ๋๋ ๋ฌธ์ ๊ฐ ์์ด์๋ค.
| ํ๊ฒฝ | ํธ๋ฆฌ๊ฑฐ | ๋ฐฉ์ |
|---|---|---|
| staging (Render) | main push |
์๋ ๋ฐฐํฌ |
| ์์ฉ (AWS CodeDeploy) | v* ํ์์ git tag push |
์๋ ์น๊ฒฉ |
merge โ staging์์ ์๋ ํ์ธ โ ๋ฌธ์ ์์ผ๋ฉด ์์ฉ ๋ฐฐํฌ. ํ๊ทธ๋ฅผ ๋ก์ปฌ์์ ์ง์ ๋ง๋ค ํ์ ์์ด, GitHub Actions์ Promote to Production workflow(workflow_dispatch)๋ฅผ ์คํํ๋ฉด ๋ค์ semver ํ๊ทธ๋ฅผ ์๋ ๊ณ์ฐํด push๊น์ง ํด์ค๋ค.
# Actions ํญ์์ "Promote to Production" โ Run workflow ๋ฒํผ์ผ๋ก๋ ๊ฐ๋ฅ
gh workflow run promote-to-prod.yml -f bump=patch # patch | minor | major์ด ํ๊ทธ push๊ฐ prod-cd.yml์ ํธ๋ฆฌ๊ฑฐ๋ฅผ ์คํ์์ผ ์์ฉ ๋ฐฐํฌ๋ก ์ด์ด์ง๋ค.
๋ฏธ์์ฑ/์ํ๋ ์๋ ๊ธฐ๋ฅ์ ๋ธ๋์น์ ์ค๋ ๋ฌตํ์ง ์๊ณ main์ ๋จผ์ mergeํ ๋ค, ๋ฐฐํฌ ์ดํ ์ํ๋ ์์ ์ ์ผค ์ ์๊ฒ ํ๋ ์ต์ ๊ตฌํ์ด๋ค. (org.runnect.server.config.featureflag)
# application.yml (environment๋ณ๋ก ๊ฐ์ด ๋ค๋ฅผ ์ ์์)
feature-flags:
flags:
new-run-summary: false@RequiredArgsConstructor
public class SomeService {
private final FeatureFlags featureFlags;
public void doSomething() {
if (featureFlags.isEnabled("new-run-summary")) {
// ์ ๋ก์ง
}
// ๊ธฐ์กด ๋ก์ง
}
}yml์ ํค๊ฐ ์์ผ๋ฉด ๊ธฐ๋ณธ๊ฐ์ ๋นํ์ฑ(false)์ด๋ค.
PR์์ ์๋ก ์ถ๊ฐ/์์ ๋ ๋ผ์ธ์ด ํ
์คํธ๋ก ์ปค๋ฒ๋๋์ง CI(build job)๊ฐ ์๋์ผ๋ก ํ์ธํ๋ค โ ๋ก์ง์ ๊ณ ์ณค๋๋ฐ ๊ด๋ จ ํ
์คํธ๊ฐ ์ ๋ฐ๋ผ์ค๋ ๊ฒฝ์ฐ๋ฅผ ๊ธฐ๊ณ์ ์ผ๋ก ์ก๊ธฐ ์ํจ. ์ ์ฒด ์ปค๋ฒ๋ฆฌ์ง๊ฐ ์๋๋ผ ์ด๋ฒ PR์์ ๋ฐ๋ ๋ผ์ธ๋ง ๋์์ผ๋ก ํ๋ฉฐ, ๊ธฐ์ค์ 70%๋ค.
# CI์์ ์คํ๋๋ ๊ฒ๊ณผ ๋์ผํ ๋ฐฉ์์ผ๋ก ๋ก์ปฌ์์ ์ง์ ํ์ธ
./gradlew jacocoTestReport
pip install diff-cover
diff-cover build/reports/jacoco/test/jacocoTestReport.xml --compare-branch=origin/main๐ git commit message convention
ex) feat(๋ณ๊ฒฝํ ํ์ผ) : ๋ณ๊ฒฝ ๋ด์ฉ (/#issue num)
- โจ feat: ์๋ก์ด ๊ธฐ๋ฅ ๊ตฌํ
- ๐ fix: ๋ฒ๊ทธ, ์ค๋ฅ ํด๊ฒฐ
- ๐งน chore: src ๋๋ test ํ์ผ์ ์์ ํ์ง ์๋ ๊ธฐํ ๋ณ๊ฒฝ ์ฌํญ ( ์๋ก์ด ํ์ผ ์์ฑ, ํ์ผ ์ด๋, ์ด๋ฆ ๋ณ๊ฒฝ ๋ฑ )
- โป๏ธ refactor: ๋ฒ๊ทธ ์์ ์ด๋ ๊ธฐ๋ฅ ์ถ๊ฐ๊ฐ ์๋ ์ฝ๋ ๋ณ๊ฒฝ ( ์ฝ๋ ๊ตฌ์กฐ ๋ณ๊ฒฝ ๋ฑ์ ๋ฆฌํฉํ ๋ง )
- ๐ style: ์ฝ๋์ ์๋ฏธ์ ์ํฅ์ ๋ฏธ์น์ง ์๋ ๋ณ๊ฒฝ ์ฌํญ ( ์ฝ๋ ํ์, ์ธ๋ฏธ์ฝ๋ก ์ถ๊ฐ: ๋น์ฆ๋์ค ๋ก์ง์ ๋ณ๊ฒฝ ์์ )
- ๐๏ธ build: ๋น๋ ์์คํ
๋๋ ์ธ๋ถ์ ์ํฅ์ ๋ฏธ์น๋ ๋ณ๊ฒฝ ์ฌํญ ์ข
์์ฑ ( ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ถ๊ฐ ๋ฑ )
- ๐ perf: ์ฑ๋ฅ์ ํฅ์ ์ํค๊ธฐ ์ํ ์ฝ๋ ๋ณ๊ฒฝ
- ๐งช test: ํ
์คํธ ์ถ๊ฐ ๋๋ ์ด์ ํ
์คํธ ์์
- ๐ docs: README๋ WIKI ๋ฑ์ ๋ฌธ์ ๊ฐ์
- โช๏ธ revert: ์ด์ ์ปค๋ฐ์ ๋๋๋ฆฌ๋ ๊ฒฝ์ฐ
- ๐ฆ ci: CI ๊ตฌ์ฑ ํ์ผ ๋ฐ ์คํฌ๋ฆฝํธ ๋ณ๊ฒฝ
- Merge: ๋ค๋ฅธ๋ธ๋ ์น๋ฅผ mergeํ๋ ๊ฒฝ์ฐ
- Init : Initial commit์ ํ๋ ๊ฒฝ์ฐ


