Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

419 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Runnect-Spring-Boot-Server

์ ๊ณผ ์ ์œผ๋กœ, ์ฝ”์Šค์™€ ์ฝ”์Šค๋กœ ์—ฐ๊ฒฐ๋˜๋Š” ๋„ˆ์™€ ๋‚˜์˜ ๋Ÿฌ๋‹ ๊ฒฝํ—˜

ํ‘œ์ง€
A333



โ˜ ์„œ๋น„์Šค ํ•ต์‹ฌ ๊ธฐ๋Šฅ

1. ์ฝ”์Šค ๊ทธ๋ฆฌ๊ธฐ

์ฝ”์Šค ๊ทธ๋ฆฌ๊ธฐ๋กœ ๋‹ฌ๋ฆฌ๊ธฐ ์ „ ๋ชฉํ‘œ๋ฅผ ์„ค์ •ํ•˜๊ณ  ์‹ค์‹œ๊ฐ„ ํŠธ๋ž˜ํ‚น์œผ๋กœ ์ฝ”์Šค๋ฅด ๋”ฐ๋ผ ์ž˜ ๋‹ฌ๋ฆฌ๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

2. ์ฝ”์Šค ๋ฐœ๊ฒฌ

์ฝ”์Šค ๋ฐœ๊ฒฌ์„ ํ†ตํ•ด ๋‚˜์—๊ฒŒ ๋งž๋Š” ์ฝ”์Šค๋ฅผ ์ถ”์ฒœ ๋ฐ›๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์œ ์ €๊ฐ€ ๊ณต์œ ํ•œ ์ฝ”์Šค๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ์Šคํฌ๋žฉํ•ฉ๋‹ˆ๋‹ค. ์ฝ”์Šค๋ฅผ ์ง์ ‘ ์—…๋กœ๋“œํ•  ์ˆ˜ ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

3. ์ฝ”์Šค ๋ณด๊ด€ํ•จ

์ฝ”์Šค ๋ณด๊ด€ํ•จ์—์„œ ๋‚ด๊ฐ€ ๊ทธ๋ฆฐ ์ฝ”์Šค์™€ ์Šคํฌ๋žฉ ์ฝ”์Šค๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

4. ๋งˆ์ดํŽ˜์ด์ง€

๋งˆ์ดํŽ˜์ด์ง€์—์„œ ํ”„๋กœํ•„๊ณผ ํ™œ๋™ ๊ธฐ๋ก, ์—…๋กœ๋“œํ•œ ์ฝ”์Šค๋ฅผ ํ™•์ธํ•˜๊ณ  ๋ชฉํ‘œ ๋ณด์ƒ์œผ๋กœ ๋™๊ธฐ๋ฅผ ๊ฐ•ํ™”ํ•ฉ๋‹ˆ๋‹ค.



๐Ÿง‘โ€๐Ÿ”ง Tech Stack

Backend

JWT

DB

CI/CD

Deploy

Develop Tool

Communicate Tool





๐Ÿ  server architecture

image



๐Ÿ’ฝย DB ERD

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-03-26 แ„‹แ…ฉแ„’แ…ฎ 1 15 33

๐Ÿ“„ API(+ Non - API) Docs

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-04-05 แ„‹แ…ฉแ„’แ…ฎ 6 35 31 แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-04-05 แ„‹แ…ฉแ„’แ…ฎ 6 36 54 แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-04-05 แ„‹แ…ฉแ„’แ…ฎ 6 36 14

๐Ÿ™†โ€โ™€๏ธ ์—ญํ• ๋ถ„๋‹ด

๋‹ด๋‹น์ž ๋‹ด๋‹น ๋‚ด์šฉ
์œ ์ˆ˜ํ™” EC2, publicCourse & stamp ๊ด€๋ จ api, ์ธํ”„๋ผ ๊ตฌ์ถ•
์ „์„ ํฌ RDS, course & user ๊ด€๋ จ api, ์ธํ”„๋ผ ๊ตฌ์ถ•
๋ฐ•์ˆ˜๋ฆฐ S3, record & scrap ๊ด€๋ จ api, ์ธํ”„๋ผ ๊ตฌ์ถ•


๐Ÿ—ฃ๏ธ๏ธ ์ปจ๋ฒค์…˜

๐Ÿ’ก ๋™๋ฃŒ๋“ค๊ณผ ๋งํˆฌ๋ฅผ ํ†ต์ผํ•˜๊ธฐ ์œ„ํ•ด ์ปจ๋ฒค์…˜์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜คํ•ฉ์ง€์กธ์˜ ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ, ํ•œ ์‚ฌ๋žŒ์ด ์ง  ๊ฒƒ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ถ”ํ›„ ์œ ์ง€๋ณด์ˆ˜๋‚˜ ํ˜‘์—…์—์„œ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์ฝ”๋“œ๋ฅผ ์ƒ๊ฐํ•˜๋ฉด์„œ ์งค ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๋ฃฐ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด๋„ ์ข‹์Šต๋‹ˆ๋‹ค!

๐Ÿ‘ฉโ€๐Ÿ’ปย Coding Conventions

๋ช…๋ช…๊ทœ์น™(Naming Conventions)
  1. ์ด๋ฆ„์œผ๋กœ๋ถ€ํ„ฐ ์˜๋„๊ฐ€ ์ฝํ˜€์งˆ ์ˆ˜ ์žˆ๊ฒŒ ์“ด๋‹ค.

  2. ๋‹จ์ˆ˜๋ฅผ ๊ธฐ๋ณธํ˜•์œผ๋กœ ํ•œ๋‹ค.

    • ๊ธฐ๋Šฅ ์ž์ฒด์—์„œ ๋‹จ์ˆ˜, ๋ณต์ˆ˜๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ๋ณต์ˆ˜ ์‚ฌ์šฉ ex. ๋‹ค์ค‘์‚ญ์ œ, ๋‹จ์ผ์‚ญ์ œ
  3. DB์˜ ํ…Œ์ด๋ธ”, ํด๋ž˜์Šค์—๋Š” PascalCase๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

  4. ๋ณ€์ˆ˜, ๋ฉ”์†Œ๋“œ์—๋Š” camelCase๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

  5. DB์˜ ํ…Œ์ด๋ธ”์˜ ์นผ๋Ÿผ์—๋Š” snake_case๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

  6. ์ƒ์ˆ˜, enum์—๋Š” UPPER_SNAKE_CASE๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

  7. ๋ฉ”์†Œ๋“œ๋Š” crud + http method(๋™์‚ฌ) + ๋ช…์‚ฌ ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•œ๋‹ค.

    • c : ex. createUser
    • r : ex. getUser
    • u : ex. updateUser
    • d : ex. deleteUser
  8. ์•ฝ์–ด ์‚ฌ์šฉ์€ ์ตœ๋Œ€ํ•œ ์ง€์–‘ํ•œ๋‹ค.

  9. ์ด๋ฆ„์— ๋„ค ๋‹จ์–ด ์ด์ƒ์ด ๋“ค์–ด๊ฐ€๋ฉด ํŒ€์›๊ณผ ์ƒ์˜๋ฅผ ๊ฑฐ์นœ ํ›„ ์‚ฌ์šฉํ•œ๋‹ค.

์ฃผ์„(Comment)
  1. ํ•ด๋‹น ๋ฉ”์†Œ๋“œ๊ฐ€ ์–ด๋””์— ์“ฐ์ด๋Š”์ง€ ์„ค๋ช…ํ•œ๋‹ค.

  2. ํ•ด๋‹น ๋ถ„๊ธฐ๋ฌธ์ด ์–ด๋–ค ๋ถ„๊ธฐ์ธ์ง€ ์„ค๋ช…ํ•œ๋‹ค.

  3. ๋ฐ˜๋ณต๋ฌธ์—์„œ ์–ด๋–ค ์กฐ๊ฑด์—์„œ ๋ฐ˜๋ณต๋˜๋Š”์ง€ ์„ค๋ช…ํ•œ๋‹ค.

  4. ์ •๋ ฌํ•˜๊ณ  ํ•„ํ„ฐ๋งํ• ๋•Œ ์–ด๋–ค ์กฐ๊ฑด์˜ ์ •๋ ฌ๊ณผ ํ•„ํ„ฐ๋ง์ธ์ง€ ์„ค๋ช…ํ•œ๋‹ค.



๐ŸŒณ Branch

๐ŸŒฑ 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(build status check)๋ฅผ ํ†ต๊ณผํ•ด์•ผ ๋ณ‘ํ•ฉ ๊ฐ€๋Šฅ
    • ๋ฏธ์™„์„ฑ ๊ธฐ๋Šฅ์€ ๋ธŒ๋žœ์น˜๋ฅผ ์˜ค๋ž˜ ์‚ด๋ ค๋‘์ง€ ๋ง๊ณ , feature flag๋กœ ๊ฐ์‹ธ main์— ๋น ๋ฅด๊ฒŒ ํ•ฉ์นœ๋‹ค
  • ๋ฆฌ๋ทฐ ์™„๋ฃŒ ํ›„ squash merge, ๋ณ‘ํ•ฉ๋œ branch๋Š” ์‚ญ์ œ

๊ณผ๊ฑฐ์—๋Š” dev/main ๋‘ ๊ฐœ์˜ ์žฅ์ˆ˜ branch๋ฅผ cherry-pick์œผ๋กœ ๋™๊ธฐํ™”ํ•˜๋Š” ๋ฐฉ์‹์ด์—ˆ์œผ๋‚˜, ๋‘ branch๊ฐ€ ๋‚ด์šฉ์ƒ ๊ณ„์† ์–ด๊ธ‹๋‚˜๋Š” ๋ฌธ์ œ(cherry-pick hell)๊ฐ€ ๋ฐ˜๋ณต๋˜์–ด ํ๊ธฐํ–ˆ๋‹ค.

๐Ÿš€ ๋ฐฐํฌ ์ „๋žต (Continuous Delivery)

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์˜ ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ์‹คํ–‰์‹œ์ผœ ์ƒ์šฉ ๋ฐฐํฌ๋กœ ์ด์–ด์ง„๋‹ค.

๐Ÿšฉ Feature Flag

๋ฏธ์™„์„ฑ/์œ„ํ—˜๋„ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๋ธŒ๋žœ์น˜์— ์˜ค๋ž˜ ๋ฌตํžˆ์ง€ ์•Š๊ณ  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)์ด๋‹ค.

โœ… Diff Coverage ๊ฒŒ์ดํŠธ

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


๐Ÿงต Commit Convention

๐Ÿ“ 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์„ ํ•˜๋Š” ๊ฒฝ์šฐ

About

Server team repository of Runnect (Spring Boot)๐Ÿƒ๐Ÿปโ€โ™€๏ธ๐Ÿƒ๐Ÿปโ€โ™‚๏ธ๐Ÿƒ๐Ÿป

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages