์›น ์„œ๋น„์Šค ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐ ์„ธํŒ… ๊ฐ€์ด๋“œ

์•ˆ๋…•ํ•˜์„ธ์š”! ์˜ค๋Š˜์€ ์–ด๋–ค ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋“  ์›น ์„œ๋น„์Šค ๊ฐœ๋ฐœ์„ ์‹œ์ž‘ํ•  ๋•Œ ํ•„์š”ํ•œ ๊ธฐ๋ณธ์ ์ธ ์„ธํŒ…๊ณผ ์ค€๋น„์‚ฌํ•ญ์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ๋งˆ๋‹ค ๊ฐ™์€ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๊ธฐ๋ณด๋‹ค๋Š”, ์ฒดํฌ๋ฆฌ์ŠคํŠธ์ฒ˜๋Ÿผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์ด๋“œ๋ฅผ ๋งŒ๋“ค์–ด ๋ดค์Šต๋‹ˆ๋‹ค. ์ด ๊ธ€์„ ๋”ฐ๋ผ๊ฐ€๋‹ค ๋ณด๋ฉด ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐ ์„ธํŒ…์„ ๋š๋”ฑ ๋งˆ์น  ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”!

์‹œ์Šคํ…œ ๊ตฌ์ƒ๋„ ์ž‘์„ฑ

1. ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„

ํ”„๋กœ์ ํŠธ์˜ ๊ธฐ์ˆ ์  ๊ตฌ์กฐ๋ฅผ ์‹œ๊ฐํ™”ํ•˜๋Š” ๊ฒƒ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์„ธ์š”.

๊ฟ€ํŒ:

  • Draw.io, Lucidchart, Miro ๋“ฑ์˜ ๋„๊ตฌ ํ™œ์šฉ
  • ์•„ํ‚คํ…์ฒ˜๋Š” ๋„ˆ๋ฌด ๋ณต์žกํ•˜์ง€ ์•Š๊ฒŒ, ํŒ€์› ๋ชจ๋‘๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜์ค€์œผ๋กœ ์ž‘์„ฑ
  • ๋ฐฑ์—”๋“œ, ํ”„๋ก ํŠธ์—”๋“œ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ์™ธ๋ถ€ API ์—ฐ๋™ ๋“ฑ์„ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„

2. ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง

์„œ๋น„์Šค์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค.

๊ฟ€ํŒ:

  • ERD(Entity-Relationship Diagram)๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์‹œ๊ฐํ™”
  • ํ™•์žฅ์„ฑ์„ ๊ณ ๋ คํ•œ ์„ค๊ณ„ ํ•  ๊ฒƒ

3. API ์„ค๊ณ„

๋ฐฑ์—”๋“œ์™€ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐ„์˜, ๋˜๋Š” ์™ธ๋ถ€ ์„œ๋น„์Šค์™€์˜ ํ†ต์‹  ๋ฐฉ์‹์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

๊ฟ€ํŒ:

  • RESTful API ์„ค๊ณ„ ์›์น™์„ ๋”ฐ๋ฅด๊ณ , Swagger ๊ฐ™์€ ๋„๊ตฌ๋กœ ๋ฌธ์„œํ™”
  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์€ ์ฒซ์‚ฝ๋ถ€ํ„ฐ!

๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๊ตฌ์ถ•

1. ์ฝ”๋“œ ์—๋””ํ„ฐ/IDE ์„ธํŒ…

  • VS Code, IntelliJ, WebStorm ๋“ฑ ์„ ํ˜ธํ•˜๋Š” ์—๋””ํ„ฐ ์„ค์น˜
  • ํ•„์ˆ˜ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ/ํ”Œ๋Ÿฌ๊ทธ์ธ:
    • ์ฝ”๋“œ ํฌ๋งทํ„ฐ (Prettier, ESLint ๋“ฑ)
    • ํ…Œ๋งˆ ๋ฐ ์•„์ด์ฝ˜
    • ์–ธ์–ด๋ณ„ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ
    • Git ๊ด€๋ จ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ

2. ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ ์„ธํŒ…

  • Git ์„ค์น˜ ๋ฐ ์„ค์ •
  • GitHub/GitLab/Bitbucket ๊ณ„์ • ์—ฐ๊ฒฐ
  • .gitignore ํŒŒ์ผ ์„ค์ • (node_modules, build ํด๋”, ํ™˜๊ฒฝ๋ณ€์ˆ˜ ํŒŒ์ผ ๋“ฑ)
  • ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ์ปจ๋ฒค์…˜ ์„ค์ • (์˜ˆ: Conventional Commits)

3. ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €

  • npm/yarn/pnpm ์„ค์น˜ (Node.js ๊ธฐ๋ฐ˜)
  • pip (Python ๊ธฐ๋ฐ˜)
  • Composer (PHP ๊ธฐ๋ฐ˜)
  • ๋“ฑ๋“ฑ ํ•„์š”ํ•œ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ € ์„ค์น˜

GitHub ์„ธํŒ… ๊ฐ€์ด๋“œ

1. ์ €์žฅ์†Œ(Repository) ๊ตฌ์กฐ ์„ค์ •

๊ฟ€ํŒ:

  • ๋ชจ๋…ธ๋ ˆํฌ(Monorepo) vs ๋ฉ€ํ‹ฐ๋ ˆํฌ(Multi-repo) ๊ณ ๋ฏผ
  • README.md ์ด์˜๊ฒŒ ๊พธ๋ฏธ๊ธฐ
  • .gitignore ์„ธํŒ… (์ธํ…”๋ฆฌ์ œ์ด์™€ ์ดํด๋ฆฝ์Šค์˜ ํ˜ผ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€?)

2. ๋ธŒ๋žœ์น˜ ์ „๋žต ์ˆ˜๋ฆฝ

๊ฟ€ํŒ:

  • Git-flow(master, develop, feature, release, hotfix) or GitHub-flow(main, feature)
  • ๋ธŒ๋žœ์น˜ ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜ (์˜ˆ: feature/login, bugfix/user-profile)
  • ๋ธŒ๋žœ์น˜ ๋ณดํ˜ธ ๊ทœ์น™์„ ์„ค์ •ํ•˜์—ฌ ์‹ค์ˆ˜๋กœ ์ธํ•œ ์ฝ”๋“œ ์†์ƒ ๋ฐฉ์ง€
  • master ๊ถŒํ•œ์€ ํ•œ๋ช…์—๊ฒŒ!

3. PR(Pull Request) ๋ฐ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ํ”„๋กœ์„ธ์Šค ์„ค์ •

๊ฟ€ํŒ:

  • PR ํ…œํ”Œ๋ฆฟ์„ ๋งŒ๋“ค์–ด ๋ณ€๊ฒฝ ๋‚ด์šฉ, ๊ด€๋ จ ์ด์Šˆ, ํ…Œ์ŠคํŠธ ๋ฐฉ๋ฒ• ๋“ฑ์„ ๋ช…์‹œ
  • GitHub Actions โ†’ PRโ†’ ๋ฆฐํŠธ ๊ฒ€์‚ฌ ๋„์ž…

4. ์ด์Šˆ(Issue) ๋ฐ ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ

๊ฟ€ํŒ:

  • ์ด์Šˆ ํ…œํ”Œ๋ฆฟ์„ ๋งŒ๋“ค์–ด ๋ฒ„๊ทธ ๋ฆฌํฌํŠธ, ๊ธฐ๋Šฅ ์š”์ฒญ ๋“ฑ์˜ ํ˜•์‹์„ ํ‘œ์ค€ํ™”
  • GitHub Projects ์นธ๋ฐ˜ ๋ณด๋“œ๋ฅผ ๊ตฌ์„ฑ
  • ์ด์Šˆ์—๋Š” ํ•ญ์ƒ ๋‹ด๋‹น์ž(Assignee), ๋ผ๋ฒจ(Label), ๋งˆ์ผ์Šคํ†ค(Milestone)์„ ์ง€์ •
  • ์งง์€ ๋ชฉํ‘œ๋Š” ๋งˆ์ผ์Šคํ†ค, ๊ธด ๋ชฉํ‘œ๋Š” ํ”„๋กœ์ ํŠธ๋‹จ์œ„
  • ๋ฒ„๊ทธ ๋ฆฌํฌํŠธ์— ์ ์ ˆํ•œ ๋ผ๋ฒจ ์ถ”๊ฐ€

5. GitHub Actions ํ™œ์šฉ

๊ฟ€ํŒ:

  • CI/CD ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•ํ•˜์—ฌ ๋นŒ๋“œ, ํ…Œ์ŠคํŠธ, ๋ฐฐํฌ ์ž๋™ํ™”
  • ์˜ค๋ฒ„์ŠคํŽ™์„ ํ•ญ์ƒ ๊ฒฝ๊ณ„
  • SonarQube ํ™œ์šฉ
  • Dependabot ํ™œ์šฉ

ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ ์„ค๊ณ„

1. ํด๋” ๊ตฌ์กฐ ์„ค๊ณ„

project/
โ”œโ”€โ”€ src/              # ์†Œ์Šค ์ฝ”๋“œ
โ”œโ”€โ”€ public/           # ์ •์  ํŒŒ์ผ
โ”œโ”€โ”€ tests/            # ํ…Œ์ŠคํŠธ ์ฝ”๋“œ
โ”œโ”€โ”€ docs/             # ๋ฌธ์„œ
โ”œโ”€โ”€ config/           # ์„ค์ • ํŒŒ์ผ
โ””โ”€โ”€ scripts/          # ์œ ํ‹ธ๋ฆฌํ‹ฐ ์Šคํฌ๋ฆฝํŠธ

2. ๋ช…๋ช… ๊ทœ์น™ ์ •ํ•˜๊ธฐ

  • ํŒŒ์ผ๋ช…: camelCase vs kebab-case vs snake_case
  • ์ปดํฌ๋„ŒํŠธ/ํด๋ž˜์Šค: PascalCase
  • ํ•จ์ˆ˜/๋ณ€์ˆ˜: camelCase
  • ์ƒ์ˆ˜: UPPER_SNAKE_CASE

๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ค์ • ํŒŒ์ผ

1. ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ค์ •

  • .env, .env.development, .env.production ํŒŒ์ผ ์„ค์ •
  • ํ™˜๊ฒฝ๋ณ„ ๋ณ€์ˆ˜ ๊ด€๋ฆฌ ๋ฐฉ๋ฒ• ๊ฒฐ์ •
  • ๋ฏผ๊ฐ ์ •๋ณด ๊ด€๋ฆฌ ๋ฐฉ๋ฒ• ๊ฒฐ์ • (API ํ‚ค, ๋น„๋ฐ€๋ฒˆํ˜ธ ๋“ฑ)

2. ์ฝ”๋“œ ํ’ˆ์งˆ ๊ด€๋ฆฌ ๋„๊ตฌ

  • ESLint ์„ค์ • (JavaScript/TypeScript)
  • Prettier ์„ค์ •
  • StyleLint (CSS)
  • ํ•ด๋‹น ์–ธ์–ด์— ๋งž๋Š” ์ •์  ๋ถ„์„ ๋„๊ตฌ

์˜ˆ์‹œ .eslintrc.json ํŒŒ์ผ:

{
  "env": {
    "browser": true,
    "es2021": true,
    "node": true
  },
  "extends": [
    "eslint:recommended",
    "plugin:react/recommended",
    "plugin:@typescript-eslint/recommended",
    "prettier"
  ],
  "parser": "@typescript-eslint/parser",
  "parserOptions": {
    "ecmaFeatures": {
      "jsx": true
    },
    "ecmaVersion": "latest",
    "sourceType": "module"
  },
  "plugins": [
    "react",
    "@typescript-eslint",
    "prettier"
  ],
  "rules": {
    "prettier/prettier": "error",
    "react/react-in-jsx-scope": "off",
    "no-console": "warn",
    "no-unused-vars": "warn"
  }
}

๋ฐฑ์—”๋“œ ๊ธฐ๋ณธ ์„ธํŒ…

1. ์„œ๋ฒ„ ํ™˜๊ฒฝ ๊ตฌ์„ฑ

  • ์›น ์„œ๋ฒ„ ์„ ํƒ (Nginx, Apache ๋“ฑ)
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„ ์„ ํƒ (Express, Django, Spring Boot, Laravel ๋“ฑ)
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ ํƒ (MySQL, PostgreSQL, MongoDB ๋“ฑ)
  • ์บ์‹ฑ ์‹œ์Šคํ…œ ์„ ํƒ (Redis, Memcached ๋“ฑ)

์ฃผ์š” ๊ธฐ์ˆ  ์„ ํƒ ์˜ˆ์‹œ์™€ ๊ทผ๊ฑฐ:

Spring Boot, Spring Data JPA

  • ์Šคํ”„๋ง ๋ถ€ํŠธ๋Š” ๋งŽ์€ ์„ค์ •์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ–์ถ”๊ณ  ์žˆ๊ณ  Apache Tomcat์ด ๋‚ด์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์Šคํ”„๋ง Data JPA๋Š” JPA๋ฅผ ๋” ์‰ฝ๊ณ  ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

Spring Security + JWT

  • ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ๋Š” ๋ณด์•ˆ๊ณผ ๊ด€๋ จ๋œ ๋งŽ์€ ์˜ต์…˜์„ ์ œ๊ณตํ•˜๋ฏ€๋กœ ์ผ์ผ์ด ๋ณด์•ˆ ๊ด€๋ จ ๋กœ์ง์„ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค.
  • JWT๋Š” ์„œ๋ฒ„๊ฐ€ ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•˜๊ณ  ๋ณด๋‚ด์ฃผ๋ฉด, ํ† ํฐ์ด ํด๋ผ์ด์–ธํŠธ์— ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ํ™•์žฅ์„ฑ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ ๋ฐฉ์‹์€ ๋‹ค์–‘ํ•œ ๋„๋ฉ”์ธ์— ๊ด€๋ฆฌํ•˜๊ธฐ๊ฐ€ ์‰ฝ์Šต๋‹ˆ๋‹ค.

MySQL

  • ์˜คํ”ˆ ์†Œ์Šค ๋ผ์ด์„ผ์Šค๋ฅผ ๋”ฐ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๋ฌด๋ฃŒ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์„œ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์ •ํ˜•ํ™”๋œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

Docker

  • ๋น ๋ฅด๊ณ  ๊ฐ€๋ณ๊ฒŒ ๋™์ผํ•œ ๊ฐœ๋ฐœํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

2. API ์„ค๊ณ„

  • REST API vs GraphQL ์„ ํƒ
  • API ์—”๋“œํฌ์ธํŠธ ๋ช…๋ช… ๊ทœ์น™ ์ •ํ•˜๊ธฐ
  • API ๋ฌธ์„œํ™” ๋„๊ตฌ ์„ ํƒ (Swagger, Postman ๋“ฑ)
  • ์—๋Ÿฌ ํ•ธ๋“ค๋ง ์ „๋žต ๊ฒฐ์ •

3. ์ธ์ฆ/์ธ๊ฐ€ ์‹œ์Šคํ…œ

  • ์ธ์ฆ ๋ฐฉ์‹ ์„ ํƒ (JWT, OAuth, Session ๋“ฑ)
  • ์‚ฌ์šฉ์ž ์—ญํ•  ๋ฐ ๊ถŒํ•œ ์„ค๊ณ„
  • ๋ณด์•ˆ ์„ค์ • (CORS, XSS ๋ฐฉ์ง€, CSRF ๋ฐฉ์ง€ ๋“ฑ)

ํ”„๋ก ํŠธ์—”๋“œ ๊ธฐ๋ณธ ์„ธํŒ…

1. UI ํ”„๋ ˆ์ž„์›Œํฌ/๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ ํƒ

  • React, Vue, Angular, Svelte ๋“ฑ
  • CSS ํ”„๋ ˆ์ž„์›Œํฌ (Tailwind CSS, Bootstrap, MUI ๋“ฑ)
  • ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ (Redux, MobX, Zustand, Recoil ๋“ฑ)

2. ๋ผ์šฐํŒ… ์„ค์ •

  • ํด๋ผ์ด์–ธํŠธ ๋ผ์šฐํŒ… ์„ค๊ณ„
  • ํŽ˜์ด์ง€ ๊ตฌ์กฐ ์„ค๊ณ„
  • ๋ ˆ์ด์•„์›ƒ ์ปดํฌ๋„ŒํŠธ ์„ค๊ณ„

3. ์—์…‹ ๊ด€๋ฆฌ

  • ์ด๋ฏธ์ง€, ํฐํŠธ, ์•„์ด์ฝ˜ ๋“ฑ ์—์…‹ ๊ด€๋ฆฌ ๋ฐฉ๋ฒ•
  • CDN ํ™œ์šฉ ๋ฐฉ์•ˆ

ํ”„๋ก ํŠธ์—”๋“œ ์„œ๋ฒ„ ์ธํ”„๋ผ ์˜ˆ์‹œ:

  • S3์™€ CloudFront๋กœ ๊ตฌ์„ฑ
    • S3์˜ ์ •์ ์ธ ์›นํ˜ธ์ŠคํŒ… ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ, ์ •์ ์ธ ์ปจํ…์ธ ์— ๊ฐ„๋‹จํ•˜๊ณ  ์œ ์—ฐํ•˜๊ฒŒ ์ ‘๊ทผ
    • Cloud Front๋ฅผ ํ†ตํ•ด, ์›น ์ปจํ…์ธ ๋ฅผ ์‚ฌ์šฉ์ž์™€ ๊ฐ€๊นŒ์šด ๊ณณ์— ์ „์†กํ•จ์œผ๋กœ์จ ์ „์†ก์†๋„๋ฅผ ๋†’์ž„

ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ๊ตฌ์„ฑ

1. ํ…Œ์ŠคํŠธ ๋„๊ตฌ ์„ ํƒ

  • ๋‹จ์œ„ ํ…Œ์ŠคํŠธ (Jest, Mocha, Pytest ๋“ฑ)
  • ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ (Supertest, pytest-django ๋“ฑ)
  • E2E ํ…Œ์ŠคํŠธ (Cypress, Playwright, Selenium ๋“ฑ)

2. ํ…Œ์ŠคํŠธ ์ „๋žต ์ˆ˜๋ฆฝ

  • TDD vs BDD
  • ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ ๋ชฉํ‘œ ์„ค์ •
  • ๋ชจํ‚น ์ „๋žต ๊ฒฐ์ •

CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์„ฑ

1. CI ๋„๊ตฌ ์„ ํƒ

  • GitHub Actions, GitLab CI, Jenkins, CircleCI ๋“ฑ

2. ๋ฐฐํฌ ์ „๋žต ์ˆ˜๋ฆฝ

  • ๋ฐฐํฌ ํ™˜๊ฒฝ ๊ตฌ์„ฑ (๊ฐœ๋ฐœ, ์Šคํ…Œ์ด์ง•, ํ”„๋กœ๋•์…˜)
  • ๋ฐฐํฌ ์ž๋™ํ™” ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ
  • ๋ธ”๋ฃจ/๊ทธ๋ฆฐ ๋ฐฐํฌ, ์นด๋‚˜๋ฆฌ ๋ฐฐํฌ ๋“ฑ ์ „๋žต ๊ฒฐ์ •

์˜ˆ์‹œ GitHub Actions ์›Œํฌํ”Œ๋กœ์šฐ:

name: CI/CD Pipeline

on:
  push:
    branches: [ main, develop ]
  pull_request:
    branches: [ main, develop ]

jobs:
  build:
    runs-on: ubuntu-latest
    
    steps:
    - uses: actions/checkout@v3
    
    - name: Set up Node.js
      uses: actions/setup-node@v3
      with:
        node-version: '16'
        cache: 'npm'
    
    - name: Install dependencies
      run: npm ci
    
    - name: Lint
      run: npm run lint
    
    - name: Run tests
      run: npm test
    
    - name: Build
      run: npm run build
    
    - name: Deploy to staging
      if: github.ref == 'refs/heads/develop'
      run: |
        echo "Deploying to staging..."
        # ์Šคํ…Œ์ด์ง• ๋ฐฐํฌ ์Šคํฌ๋ฆฝํŠธ
    
    - name: Deploy to production
      if: github.ref == 'refs/heads/main'
      run: |
        echo "Deploying to production..."
        # ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ ์Šคํฌ๋ฆฝํŠธ

๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๋กœ๊น… ์‹œ์Šคํ…œ ๊ตฌ์„ฑ

1. ๋กœ๊น… ์‹œ์Šคํ…œ

  • ๋กœ๊น… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ ํƒ (Winston, Logback ๋“ฑ)
  • ๋กœ๊ทธ ์ˆ˜์ง‘ ๋„๊ตฌ ์„ ํƒ (ELK Stack, Papertrail ๋“ฑ)
  • ๋กœ๊ทธ ๋ ˆ๋ฒจ ๋ฐ ํฌ๋งท ๊ฒฐ์ •

2. ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ

  • ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง (New Relic, Datadog ๋“ฑ)
  • ์—๋Ÿฌ ํŠธ๋ž˜ํ‚น (Sentry, Rollbar ๋“ฑ)
  • ์„œ๋ฒ„ ๋ชจ๋‹ˆํ„ฐ๋ง (Prometheus, Grafana ๋“ฑ)

๋ฌธ์„œํ™”

1. ์ฝ”๋“œ ๋ฌธ์„œํ™”

  • JSDoc, PyDoc ๋“ฑ ์ฝ”๋“œ ์ฃผ์„ ๊ทœ์น™
  • README.md ํŒŒ์ผ ์ž‘์„ฑ
  • API ๋ฌธ์„œ ์ž๋™ํ™”

2. ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ ๋ฌธ์„œ

  • ๊ธฐ๋Šฅ ๋ช…์„ธ์„œ
  • ์•„ํ‚คํ…์ฒ˜ ๋‹ค์ด์–ด๊ทธ๋žจ
  • ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ๋„

ํ˜‘์—… ๋„๊ตฌ ์„ค์ •

1. Notion ์›Œํฌ์ŠคํŽ˜์ด์Šค ๊ตฌ์กฐ ์„ค๊ณ„

๊ฟ€ํŒ:

  • ์ตœ์ƒ์œ„ ํŽ˜์ด์ง€๋Š” โ€˜ํ”„๋กœ์ ํŠธ ๊ฐœ์š”โ€™, โ€˜๊ฐœ๋ฐœ ๋ฌธ์„œโ€™, โ€˜๋””์ž์ธโ€™, โ€˜ํšŒ์˜๋กโ€™, โ€˜๋ฆฌ์†Œ์Šคโ€™ ๋“ฑ์œผ๋กœ ์นดํ…Œ๊ณ ๋ฆฌํ™”
  • ํ…œํ”Œ๋ฆฟ์„ ํ™œ์šฉํ•˜์—ฌ ์ผ๊ด€๋œ ๋ฌธ์„œ ํ˜•์‹์„ ์œ ์ง€
  • API ๋ฌธ์„œ, ๊ธฐ์ˆ  ์Šคํƒ, ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ๊ฐ€์ด๋“œ ๋“ฑ ๊ฐœ๋ฐœ ๊ด€๋ จ ์ •๋ณด๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ์ •๋ฆฌ

2. Slack ์ฑ„๋„ ๊ตฌ์กฐ ์„ค์ •

๊ฟ€ํŒ:

  • ์ฑ„๋„์€ ๋ชฉ์ ์„ ์•Œ ์ˆ˜ ์žˆ๋„๋ก!(์˜ˆ: #general, #dev, #design, #marketing)
  • ํ”„๋กœ์ ํŠธ ๋‹จ์œ„ ๋˜๋Š” ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ์ฑ„๋„์„ ์ƒ์„ฑ (์˜ˆ: #project-login, #feature-payment)
  • @channel, @here์˜ ์‚ฌ์šฉ ๊ธฐ์ค€์„ ๋ช…ํ™•ํžˆ ํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ์•Œ๋ฆผ ๋ฐฉ์ง€

3. ์ด์Šˆ ํŠธ๋ž˜ํ‚น

  • GitHub Issues, Jira, Trello ๋“ฑ ์„ค์ •
  • ์ด์Šˆ ํ…œํ”Œ๋ฆฟ ์ž‘์„ฑ

4. ์ฝ”๋“œ ๋ฆฌ๋ทฐ ํ”„๋กœ์„ธ์Šค

  • PR ํ…œํ”Œ๋ฆฟ ์ž‘์„ฑ
  • ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๊ทœ์น™ ์ •ํ•˜๊ธฐ
  • ๋ณ‘ํ•ฉ ์ „๋žต ๊ฒฐ์ • (Squash, Rebase, Merge ๋“ฑ)

5. ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜ ์ฑ„๋„

  • Slack, Discord, Microsoft Teams ๋“ฑ ์„ค์ •
  • ์•Œ๋ฆผ ์„ค์ • (CI/CD, ๋ฐฐํฌ, ์ด์Šˆ ๋“ฑ)

ํ˜‘์—… ๊ทœ์น™ ๋ฐ ์ปจ๋ฒค์…˜ ์„ค์ •

1. ์ฝ”๋“œ ์ปจ๋ฒค์…˜

๊ฟ€ํŒ:

  • ์–ธ์–ด/ํ”„๋ ˆ์ž„์›Œํฌ๋ณ„ ์ฝ”๋”ฉ ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ๋ฅผ ๋ฌธ์„œํ™”
  • ESLint, Prettier ๋“ฑ์˜ ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ฝ”๋“œ ์Šคํƒ€์ผ์„ ์ž๋™์œผ๋กœ ํ†ต์ผ
  • ๋ณ€์ˆ˜๋ช…, ํ•จ์ˆ˜๋ช…, ํด๋ž˜์Šค๋ช… ๋“ฑ์˜ ๋„ค์ด๋ฐ ์ปจ๋ฒค์…˜์„ ๋ช…ํ™•ํžˆ ์ •์˜

์ฐธ๊ณ : ๋„ค์ด๋ฒ„ ํ•ต๋ฐ์ด Java ์ฝ”๋”ฉ ์ปจ๋ฒค์…˜ https://naver.github.io/hackday-conventions-java/

2. ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ์ปจ๋ฒค์…˜

๊ฟ€ํŒ:

  • ์ผ๊ด€๋œ ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ํ˜•์‹์„ ์‚ฌ์šฉ (์˜ˆ: โ€œ[feat] ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ ๊ตฌํ˜„โ€)
  • ํžˆ์Šคํ† ๋ฆฌ ๊ด€๋ฆฌ๊ฐ€ ํŽธํ•จ
  • Conventional Commits(feat, fix, docs, style, refactor, test, chore ๋“ฑ)์„ ํ™œ์šฉ
  • ์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€์— ๊ด€๋ จ ์ด์Šˆ ๋ฒˆํ˜ธ ํฌํ•จ

3. ๋ฌธ์„œํ™” ์ปจ๋ฒค์…˜

๊ฟ€ํŒ:

  • ๋ฒ„์ „ ๊ด€๋ฆฌ ๊ทœ์น™(Semantic Versioning)์„ ์ •ํ•˜๊ณ  CHANGELOG.md๋ฅผ ์—…๋ฐ์ดํŠธ

ํ”„๋กœ์ ํŠธ ํ‚ฅ์˜คํ”„ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

๋งˆ์ง€๋ง‰์œผ๋กœ, ํ”„๋กœ์ ํŠธ๋ฅผ ๊ณต์‹์ ์œผ๋กœ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ํ™•์ธํ•ด์•ผ ํ•  ์ฒดํฌ๋ฆฌ์ŠคํŠธ์ž…๋‹ˆ๋‹ค:

  • ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜ ๋‹ค์ด์–ด๊ทธ๋žจ ์ž‘์„ฑ
  • ๋ฐ์ดํ„ฐ ๋ชจ๋ธ ์„ค๊ณ„ ์™„๋ฃŒ
  • GitHub ์ €์žฅ์†Œ ์ƒ์„ฑ ๋ฐ ๊ธฐ๋ณธ ์„ค์ • ์™„๋ฃŒ
  • ๋ธŒ๋žœ์น˜ ์ „๋žต ๋ฐ PR ํ”„๋กœ์„ธ์Šค ๋ฌธ์„œํ™”
  • Notion ์›Œํฌ์ŠคํŽ˜์ด์Šค ๊ตฌ์กฐ ์„ค์ •
  • ํ”„๋กœ์ ํŠธ ๋กœ๋“œ๋งต ๋ฐ ๋งˆ์ผ์Šคํ†ค ์„ค์ •
  • Slack ์ฑ„๋„ ๊ตฌ์กฐ ๋ฐ ํ†ตํ•ฉ ์„ค์ •
  • ์ฝ”๋“œ ์ปจ๋ฒค์…˜ ๋ฐ ํ˜‘์—… ๊ทœ์น™ ๋ฌธ์„œํ™”
  • ํŒ€ ๋ฉค๋ฒ„ ๊ถŒํ•œ ๋ฐ ์—ญํ•  ์ •์˜
  • ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ค์ • ๊ฐ€์ด๋“œ ์ž‘์„ฑ
  • ์ฒซ ์Šคํ”„๋ฆฐํŠธ ๊ณ„ํš ์ˆ˜๋ฆฝ

๋งˆ์น˜๋ฉฐ

์ด๋ ‡๊ฒŒ ์›น ์„œ๋น„์Šค ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ๊ธฐ๋ณธ์ ์ธ ์„ธํŒ… ์‚ฌํ•ญ๋“ค์„ ์ •๋ฆฌํ•ด๋ดค์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋ชจ๋“  ํ”„๋กœ์ ํŠธ์— ์ด ๋ชจ๋“  ๊ฒƒ์„ ์ ์šฉํ•  ํ•„์š”๋Š” ์—†์–ด์š”. ํ”„๋กœ์ ํŠธ์˜ ๊ทœ๋ชจ๋‚˜ ์„ฑ๊ฒฉ์— ๋งž๊ฒŒ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ๊ณจ๋ผ์„œ ์ ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ์ดˆ๊ธฐ์— ์ด๋Ÿฐ ๊ธฐ๋ณธ ์„ธํŒ…์„ ์ œ๋Œ€๋กœ ํ•ด๋‘๋ฉด ๋‚˜์ค‘์— ๋งŽ์€ ์‹œ๊ฐ„๊ณผ ๋…ธ๋ ฅ์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์–ด์š”. ํŠนํžˆ ํŒ€ ํ”„๋กœ์ ํŠธ๋ผ๋ฉด ๋ชจ๋‘๊ฐ€ ๊ฐ™์€ ๊ทœ์น™๊ณผ ํ™˜๊ฒฝ์—์„œ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ์ฃ .

๋‹ค์Œ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ ์ด ๊ธ€์„ ์ฐธ๊ณ ํ•ด์„œ ์ฒดํฌ๋ฆฌ์ŠคํŠธ์ฒ˜๋Ÿผ ํ™œ์šฉํ•ด๋ณด์„ธ์š”. ๋š๋”ฑ ์„ธํŒ… ์™„๋ฃŒํ•˜๊ณ  ๋ณธ๊ฒฉ์ ์ธ ๊ฐœ๋ฐœ์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ์˜ˆ์š”! ๐Ÿ˜Š

ํ˜น์‹œ ํŠน์ • ๋ถ€๋ถ„์— ๋Œ€ํ•ด ๋” ์ž์„ธํ•œ ์„ค๋ช…์ด ํ•„์š”ํ•˜๊ฑฐ๋‚˜, ํŠน์ • ์–ธ์–ด๋‚˜ ํ”„๋ ˆ์ž„์›Œํฌ์— ๋งž๋Š” ์„ธํŒ… ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์‹ถ์œผ์‹œ๋‹ค๋ฉด ์–ธ์ œ๋“  ๋ฉ”์ผ์ผ๋กœ ์•Œ๋ ค์ฃผ์„ธ์š”!