Skip to content

๐Ÿž TimeToast(ํƒ€์ž„ํ† ์ŠคํŠธ) - ํฉ์–ด์ง€๋Š” ๊ธฐ์–ต์„ ๋‹ด๋Š” ๋‚˜๋งŒ์˜ ํ† ์ŠคํŠธ

License

Notifications You must be signed in to change notification settings

cherrywajelly/frontend

Repository files navigation

๐Ÿž TimeToast (ํƒ€์ž„ํ† ์ŠคํŠธ) - ํฉ์–ด์ง€๋Š” ๊ธฐ์–ต์„ ๋‹ด๋Š” ๋‚˜๋งŒ์˜ ํ† ์ŠคํŠธ

๐Ÿ‘๐Ÿป TimeToast๋Š” ๊ธฐ๋ก์˜ ๋ชฉ์ ์ธ โ€œ๋ณด์กดโ€๊ณผ โ€œ์ „๋‹ฌโ€์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋ฉฐ, ์ง€์†์ ์ธ ๊ณต์œ ๊ฐ€ ๊ฐ€๋Šฅํ•œ ์ถ”์–ต ์•„์นด์ด๋น™ ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.

img



๐Ÿ‘ฅ Team-cherry wa jelly

๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ R&R

ํ•™๋ฒˆ ์ด๋ฆ„ ํฌ์ง€์…˜
201920756 ์ด์žฅ์› ๐Ÿ”ฆ DevOps, Frontend
202020735 ์ด์˜ˆ์ธ ๐Ÿ“ฑ Backend
202021138 ์ด์ฑ„๋ฏผ ๐Ÿ’ป Frontend
202126863 ์ •๋ฌธ์˜ ๐Ÿ–ฅ๏ธ Backend

๐Ÿ”Žย ์„œ๋น„์Šค ์†Œ๊ฐœ

๐Ÿ’ก ๋ชฉ์  ๋ฐ ํ•„์š”์„ฑ

๊ธฐ์กด SNS ํ”Œ๋žซํผ์€ ์ˆœ๊ฐ„์„ ๊ณต์œ ํ•˜๋Š” ๋‹จ๊ธฐ์ ์ธ ๊ธฐ๋ก์— ์ดˆ์ ์„ ๋‘ฌ, ๊ธฐ๋ก์˜ ์ผํšŒ์  ์†Œ๋น„์— ๊ทธ์น˜๋Š” ํŽธ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ™์€ ๊ธฐ๋ก๋ฌผ์— ์œ ๊ธฐ์ ์œผ๋กœ ๊ธ€์„ ์ž‘์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์–ด๋ ค์›Œ, ๊ธฐ๋ก์˜ ํ•ต์‹ฌ ๋ชฉ์ ์ธ โ€œ๋ณด์กด"๊ณผ โ€œ์ „๋‹ฌ"์„ ์ถฉ์กฑํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์ด์— ๊ธฐ๋ก์˜ ๋ณธ์งˆ์ ์ธ ๋ชฉ์ ์„ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋Š”, โ€œ์ง€์†์ ์ธ ๊ณต์œ ๊ฐ€ ๊ฐ€๋Šฅํ•œ ์ถ”์–ต ์•„์นด์ด๋น™ ์„œ๋น„์Šค : TimeToastโ€๋ฅผ ์ œ์•ˆํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ—‚๏ธ ํ•ต์‹ฌ ๊ธฐ๋Šฅ

slide2 slide3 slide1

๐Ÿ—ฃ๏ธย ์œ ์ € persona

Slide 16_9 - 79 Slide 16_9 - 81 Slide 16_9 - 98


๐Ÿ› Architecture

๐Ÿ“œย ERD ์„ค๊ณ„๋„

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2024-11-21 แ„‹แ…ฉแ„’แ…ฎ 7 54 52

โ˜ ํด๋ผ์šฐ๋“œ ์ธํ”„๋ผ

infra

๐Ÿ”„ย CI/CD

CICD


๐Ÿ”„ CI/CD ํŒŒ์ดํ”„๋ผ์ธ

๐Ÿ“ย Pull Request

  1. Notify Trigger

    1. Notify Trigger

    2. Create Thread

  2. Fetch Application

    1. Git Clone
  3. Test Application

    1. Test Application
  4. Notify Results

    1. Notify Results

โœ…ย Merge Approve

  1. Notify Trigger

    1. Notify Trigger

    2. Create Thread

  2. Fetch Application

    1. Git Clone
  3. Build Push Image

    1. Create DotEnv

    2. Build Push Image

  4. Fetch Manifest

    1. Git clone
  5. Update Manifest

    1. Update Manifest

    2. Upload Manifest

  6. Notify Results

    1. Notify Results

โŒย Merge Reject

  1. Notify Trigger

    1. Notify Trigger

    2. Create Thread

  2. Notify Results

    1. Notify Results

Description

  • Notify Trigger - GitHub์˜ ๋™์ž‘์„ ํ†ตํ•ด ์–ด๋–ค ํŒŒ์ดํ”„๋ผ์ธ์ด ์ž‘๋™๋˜์—ˆ๋Š”์ง€ Slack์œผ๋กœ ์•Œ๋ฆผ์„ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

  • Create Thread - ํ•ด๋‹น ํŒŒ์ดํ”„๋ผ์ธ ์ž‘๋™์— ๋Œ€ํ•ด ์˜๊ฒฌ์„ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋„๋ก Thread๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  • Fetch Application - Application์— ๋Œ€ํ•ด ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก Application Repository๋ฅผ Cloneํ•ฉ๋‹ˆ๋‹ค.

  • Create DotEnv - Next.js์™€ React.js์—์„œ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์ฃผ์ž…ํ•˜๊ธฐ ์œ„ํ•ด Kubernetes Secret์œผ๋กœ๋ถ€ํ„ฐ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์ฝ์–ด์™€ .env ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

  • Build Push Image - ์ปจํ…Œ์ด๋„ˆ ๋นŒ๋“œ ๋„๊ตฌ ์ค‘ Buildah๋ฅผ ์‚ฌ์šฉํ•ด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋นŒ๋“œํ•˜๊ณ  Container Registry์— Pushํ•ฉ๋‹ˆ๋‹ค.

  • Fetch Manifest - Manifest๋ฅผ ๋ณ€๊ฒฝํ•˜๊ธฐ ์œ„ํ•ด Manifest Repository๋ฅผ Cloneํ•ฉ๋‹ˆ๋‹ค.

  • Update Manifest - Buildํ•œ ์ด๋ฏธ์ง€์˜ ํƒœ๊ทธ๋กœ Deployment์—์„œ ์š”๊ตฌํ•˜๋Š” ์ด๋ฏธ์ง€๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.

  • Upload Manifest - ์ˆ˜์ •์‚ฌํ•ญ์„ Manifest Repository์— ์ ์šฉ์‹œํ‚ค๊ณ  ArgoCD์— Webhook์„ ๋ณด๋‚ด Kubernetes Cluster์— ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.

  • Notify Results - ํŒŒ์ดํ”„๋ผ์ธ ์ž‘๋™ ๊ฒฐ๊ณผ ๋ณด๊ณ ์„œ๋ฅผ Slack์œผ๋กœ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ํŒŒ์ดํ”„๋ผ์ธ ์‹คํ–‰ ๋„์ค‘ ์‹คํŒจํ•œ ์ž‘์—…์ด ์žˆ๋‹ค๋ฉด ์‹คํŒจํ–ˆ์Œ์„ ์•Œ๋ฆฝ๋‹ˆ๋‹ค.


๐Ÿ’ป Technology

๐Ÿ–ฅ๏ธย Frontend

๐Ÿ“€ Backend

๐Ÿ’ป Infra

๐Ÿ’พ DB

๐Ÿค๐Ÿป Co-working Tool


๊ธฐ์ˆ  ์Šคํƒ ์„ ์ • ์ด์œ 

๐Ÿ“˜ย Frontend

Tech Description
Next.js SEO ํ–ฅ์ƒ๊ธฐ๋ณธ์ ์œผ๋กœ React๋Š” Client Side Rendering(CSR)์„ ์‚ฌ์šฉํ•˜์—ฌ SEO์— ์ทจ์•ฝํ•˜๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.์ด๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ pre-rendering์„ ํ†ตํ•ด Server-Side Rendering(SSR)์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” React ํ”„๋ ˆ์ž„์›Œํฌ์ธ Next.js๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ณ ์ž ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
React ์–ด๋“œ๋ฏผ ํŽ˜์ด์ง€์—์„  CSR๋กœ ๋น ๋ฅธ ๋ Œ๋”๋ง์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ํŒ๋‹จ๋˜์–ด React ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ ์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๊ฐ•๋ ฅํ•˜๊ณ  ์œ ์—ฐํ•œ JavaScript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ์„œ, ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜์™€ ๊ฐ€์ƒ DOM์„ ํ†ตํ•ด ๋น ๋ฅธ ๋ Œ๋”๋ง์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“ˆ ๊ฐœ๋ฐœ ์ปดํฌ๋„ŒํŠธ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ๊ฐ€๋…์„ฑ์ด ๋›ฐ์–ด๋‚˜๋ฉฐ, ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ์ƒํƒœ๊ณ„๊ฐ€ ํฌ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ ํ•ด๊ฒฐ์ด๋‚˜ ๋ชจ๋“ˆ ๊ฐœ๋ฐœ์— ๋„์›€์ด ๋˜๊ธฐ์— React๋กœ ์„ ์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
TypeScript ์ฝ”๋“œ ์•ˆ์ •ํ™” TypeScript๋Š” ์ •์  ํƒ€์ž… ์–ธ์–ด๋กœ, ์ฝ”๋“œ๋ฅผ ๋” ์•ˆ์ •์ ์œผ๋กœ ๋งŒ๋“ค๊ณ  ๊ฐœ๋ฐœ์ž ์‚ฌ์ด์˜ ํ˜‘์—…์„ ์šฉ์ดํ•˜๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.์ƒ์‚ฐ์„ฑ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ์—๋Ÿฌ๋ฅผ ๋ฐœ๊ฒฌํ•˜์—ฌ ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๋ฉฐ, ์ฝ”๋“œ ํžŒํŠธ์™€ ์ž๋™ ์™„์„ฑ์„ ์ œ๊ณตํ•˜์—ฌ ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ๋†’์—ฌ์ฃผ๋Š” ์žฅ์ ์ด ์žˆ์–ด TypeScript๋ฅผ ์„ ์ •ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
Yarn Yarn์€ JavaScript ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋กœ, ๋น ๋ฅธ ์†๋„ ๋ฐ ๋†’์€ ์‹ ๋ขฐ์„ฑ๊ณผ ๋ณด์•ˆ์„ฑ์„ ์ œ๊ณตํ•˜์—ฌ ํšจ์œจ์ ์ธ ํ”„๋กœ์ ํŠธ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
Tanstack-Query ํšจ์œจ์ ์ธ Data Fetching ๋ฐ ๊ด€๋ฆฌ๋ฐ์ดํ„ฐ ์บ์‹ฑ ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์กด์žฌํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ์š”์ฒญ์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
TailwindCSS ๊ฐœ๋ฐœ์˜ ํŽธ์˜์„ฑ HTML๊ณผ CSS ํŒŒ์ผ์„ ๋ณ„๋„๋กœ ๊ฐœ๋ฐœ ๋ฐ ๊ด€๋ฆฌํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœํ•˜๊ธฐ์— ํŽธ๋ฆฌํ•˜๊ณ , ๋žฉํ•‘ํ•˜๋Š” ๊ฐ ํƒœ๊ทธ์˜ ํด๋ž˜์Šค๋ช…์„ ๊ณ ๋ฏผํ•  ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•  ์ˆ˜ ์žˆ์–ด ๋น ๋ฅธ ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
Recoil Recoil์€ React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ๋ฐ์ดํ„ฐ ๊ณต์œ ๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ค‘์•™ ์ƒํƒœ ๊ด€๋ฆฌ ํŒจํ„ด๊ณผ ๋น„๊ตํ–ˆ์„ ๋•Œ ์ฝ”๋“œ์˜ ๋ณต์žก์„ฑ์„ ์ค„์ด๋ฉฐ, ๋ณต์žกํ•œ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด ๋ฉ”๋ฆฌํŠธ๊ฐ€ ์žˆ์–ด ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ Recoil์„ ์„ ์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๐Ÿ“€ Back-end

Tech Description
springboot ๊ฐ„ํŽธํ•˜๊ฒŒ Spring Framework๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ์˜ ์ƒ์‚ฐ์„ฑ์„ ๋†’์ด๊ณ ์ž ์„ ์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
java 17 ์žฅ๊ธฐ ์ง€์›์ด ๋ณด์žฅ๋˜๋ฉด์„œ๋„ ๋น„๊ต์  ์ตœ์‹  ๊ธฐ๋Šฅ๋“ค์„ ์ œ๊ณตํ•˜์—ฌ ๋น„๊ต์  ์•ˆ์ •์ ์œผ๋กœ ์„ฑ๋Šฅ ๊ฐœ์„ ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ Spring Boot 3.0.x ์ดํ›„์˜ ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” Java 17 ์ด์ƒ์„ ์š”๊ตฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ตœ์‹  ์Šคํ”„๋ง ๋ถ€ํŠธ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” Java 17์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๊ธฐ์— ์„ ์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
gradle ๋นŒ๋“œ ๋„๊ตฌ ์ค‘ ํŽธ๋ฆฌํ•œ ์˜์กด์„ฑ ๊ด€๋ฆฌ์™€ ์œ ์—ฐํ•œ ํ™•์žฅ, ๋น ๋ฅธ ๋นŒ๋“œ ์†๋„๋ฅผ ์žฅ์ ์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ์„ ์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
MySQL ์„œ๋น„์Šค๊ฐ€ RDBMS์™€ ๋” ์ ํ•ฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ, ์˜คํ”ˆ ์†Œ์Šค ๊ธฐ๋ฐ˜์˜ RDBMS๋กœ ๋น„์šฉ๊ณผ ์•ˆ์ •์„ฑ ์ธก๋ฉด์—์„œ ์žฅ์ ์ด ์žˆ๊ณ , Backend ๊ฐœ๋ฐœ์ž ๋ชจ๋‘ ๊ฐœ๋ฐœ ๊ฒฝํ—˜์ด ์žˆ๋Š” MySQL์„ ์„ ์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
Spring Data JPA ์„œ๋น„์Šค์— RDBMS๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ORM ๊ธฐ์ˆ ์„ ํ™œ์šฉํ•˜์—ฌ ์ƒ์‚ฐ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด Spring Data JPA๋ฅผ ์„ ์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
Spring security ์‚ฌ์šฉ์ž์˜ ์ธ์ฆ๊ณผ ๊ถŒํ•œ ๊ด€๋ฆฌ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ํ•˜์—ฌ ๋ณด์•ˆ ์œ„ํ˜‘์œผ๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด ์„ ์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
JWT Json ๊ฐ์ฒด์— ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š” ํ† ํฐ์œผ๋กœ, ์œ ์ € ์ธ์ฆ/์ธ๊ฐ€๋ฅผ ์œ„ํ•ด ์„ ์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
Oauth2 ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์™ธ๋ถ€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ open API๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ถŒํ•œ ์ธ์ฆ์„ ํ•˜๋Š” ํ‘œ์ค€ ํ”„๋กœํ† ์ฝœ๋กœ, ์นด์นด์˜ค, ๊ตฌ๊ธ€ ์†Œ์…œ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ ๊ตฌํ˜„์„ ์œ„ํ•ด ์„ ์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
Testcontainers JUnit์„ ์ง€์›ํ•˜๋Š” Java ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, Docker container ๊ธฐ๋ฐ˜์œผ๋กœ DBMS ์ด๋ฏธ์ง€๋ฅผ ํ†ตํ•ด ์ผํšŒ์šฉ ์ธ์Šคํ„ด์Šค๋ฅผ ํ™œ์šฉํ•œ test๊ฐ€ ๊ฐ€๋Šฅํ•ด ์„ ์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
JaCoCo Java์˜ ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ ์ธก์ •ํ•˜๊ธฐ ์œ„ํ•œ ์˜คํ”ˆ์†Œ์Šค ๋„๊ตฌ๋กœ, ์ฝ”๋“œ์˜ ์™„์„ฑ๋„๋ฅผ ํŒ๋‹จํ•˜๊ธฐ ์œ„ํ•ด ์„ ์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
Spring Rest Docs + Swagger ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๋ฌธ์„œ ์ž๋™ํ™” ๋„๊ตฌ๋กœ, ์‹ ๋ขฐ์„ฑ ์žˆ๋Š” API ๋ช…์„ธ์™€ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ์„ ์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
๊ฒฐ์ œ Kakao์˜ OPEN API๋ฅผ ํ™œ์šฉํ•˜์—ฌ, kakaopay ๊ฒฐ์ œ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๐Ÿ’ป DevOps

Tech Description
Kubernetes ์ปจํ…Œ์ด๋„ˆ๋กœ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰ํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
ArgoCD SSOT ๊ธฐ๋ฐ˜์œผ๋กœ GitOps ํŒจํ„ด์„ ์ ์šฉํ•˜์—ฌ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ๊ด€๋ฆฌํ•ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž๋™์œผ๋กœ ๋™๊ธฐํ™”ํ•˜๊ณ  ๋ฐฐํฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
Tekton ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋„ค์ดํ‹ฐ๋ธŒํ•˜๊ฒŒ ๋™์ž‘ํ•˜๋Š” CI๋„๊ตฌ๋กœ ์ปจํ…Œ์ด๋„ˆ์—์„œ ์‹คํ–‰๋˜๋Š” ์‰˜์Šคํฌ๋ฆฝํŠธ๊นŒ์ง€ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
Git ํ•˜๋‚˜์˜ ๋ ˆํฌ์ง€ํ† ๋ฆฌ์—์„œ ์ž‘์—…ํ•  ๋•Œ ๋ธŒ๋žœ์น˜๋ฅผ ํ†ตํ•ด ์ž‘์—… ๊ณต๊ฐ„์„ ๋ถ„๋ฆฌํ•˜๊ณ  ์ž‘์—… ๊ฒฐ๊ณผ๋ฅผ ์˜ฌ๋ฆฌ๊ธฐ ์œ„ํ•ด, ์ฝ”๋“œ์˜ ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
GitHub Issue, Pull Request, Merge ๋“ฑ Git CLI๋กœ ํ•˜๊ธฐ ํž˜๋“  ์ž‘์—…์„ GUI์˜ ๋„์›€์„ ๋ฐ›์•„ ํŽธํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
Buildah CI/CD ํ™˜๊ฒฝ์—์„œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋นŒ๋“œํ•˜๊ธฐ ์œ„ํ•ด docker๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ ๋นŒ๋“œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
Helm ๋‹ค์–‘ํ•œ ํ™˜๊ฒฝ์—์„œ ๋ฐฐํฌ๋˜๋Š” yaml ํŒŒ์ผ๋“ค์„ ๊ด€๋ฆฌํ•˜๊ณ  ์ธํ”„๋ผ ๊ตฌ์„ฑ์„ ์ผ๊ด€๋˜๊ฒŒ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
Prometheus ํ•˜๋“œ์›จ์–ด๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฉ”ํŠธ๋ฆญ ์ •๋ณด๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ๊ฐ€๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
Grafana ๋ฉ”ํŠธ๋ฆญ๊ณผ ๋กœ๊ทธ ์ •๋ณด๋ฅผ ์‹œ๊ฐํ™”ํ•˜์—ฌ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
Loki Fluent Bit๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ๋กœ๊ทธ๋“ค์„ ๊ฐ€๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
Fluent Bit ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ๋ถ€ํ„ฐ ๋กœ๊ทธ๋ฅผ ์ถ”์ถœํ•˜๋Š” agent๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
Oracle Virtual Machine, Load Balancer, Container Engine For Kubernetes, Object Storage ๋“ฑ์˜ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
Config Syncer ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ ๋‹ค๋ฅธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋กœ Config Map, Secret์„ ๊ณต์œ ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
Sealed Secrets Base64๋กœ ์ธ์ฝ”๋”ฉ๋œ Secret์˜ ๊ฐ’์„ ์•”ํ˜ธํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
Cloudflare DNS ๋„๋ฉ”์ธ์„ ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

โ›๏ธ Business Tools

Tech Description
Slack ๋ชจ๋‹ˆํ„ฐ๋ง ์ •๋ณด์™€ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์˜ ์‹คํ–‰์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋ฐ›์•„์˜ค๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
Google Docs Google Docs๋Š” ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฌธ์„œ ์ž‘์„ฑ ๋ฐ ํŽธ์ง‘์ด ๊ฐ€๋Šฅํ•œ ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜ ํ˜‘์—… ๋„๊ตฌ๋กœ, ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋™์‹œ์— ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์–ด ํŒ€ ํ˜‘์—…์— ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ž๋™ ์ €์žฅ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ์œ ์‹ค ์œ„ํ—˜์ด ์—†์œผ๋ฉฐ, ์–ด๋””์„œ๋“  ์ธํ„ฐ๋„ท๋งŒ ์žˆ์œผ๋ฉด ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์–ด ์ฃผ ํˆด๋กœ ์„ ์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, Google Workspace์™€์˜ ์—ฐ๋™์„ ํ†ตํ•ด ๋ฌธ์„œ ๊ณต์œ , ๋Œ“๊ธ€ ๋‹ฌ๊ธฐ, ์ œ์•ˆ ๋ชจ๋“œ ๋“ฑ ํŒ€ ๊ฐ„์˜ ์›ํ™œํ•œ ํ”ผ๋“œ๋ฐฑ๊ณผ ํšจ์œจ์ ์ธ ํ˜‘์—…์„ ์ง€์›ํ•˜๊ธฐ์— ์ ๊ทน ํ™œ์šฉํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.
Notion Notion์€ ๋‹ค์–‘ํ•œ ๋ฌธ์„œ ๊ด€๋ฆฌ์™€ ํ˜‘์—… ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ์˜ฌ์ธ์› ์›Œํฌ์ŠคํŽ˜์ด์Šค๋กœ, ํŒ€ ํ”„๋กœ์ ํŠธ์˜ ์ƒ์‚ฐ์„ฑ๊ณผ ํšจ์œจ์„ฑ์„ ํฌ๊ฒŒ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ์ง๊ด€์ ์ธ UI๋กœ ๋น ๋ฅด๊ฒŒ ๋ฌธ์„œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํƒœ์Šคํฌ ๊ด€๋ฆฌ, ์ผ์ • ์กฐ์œจ ๋“ฑ ์—ฌ๋Ÿฌ ํ˜‘์—… ๋„๊ตฌ๋ฅผ ํ•œ ํ”Œ๋žซํผ์—์„œ ํ†ตํ•ฉ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•ด ํ”„๋กœ์ ํŠธ์˜ ๋ณ€ํ™”๋‚˜ ์ง„์ฒ™ ์ƒํ™ฉ์„ ์ฒด๊ณ„์ ์œผ๋กœ ๊ธฐ๋กํ•˜๊ณ  ์ถ”์ ํ•  ์ˆ˜ ์žˆ์–ด, ํŒ€์› ๊ฐ„์˜ ์›ํ™œํ•œ ์†Œํ†ต๊ณผ ์ •๋ณด ๊ณต์œ ์— ์šฉ์ดํ•˜์—ฌ ๋…ธ์…˜์„ ์ ๊ทน์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.
Figma Figma๋Š” ์ธํ„ฐํŽ˜์ด์Šค ๋””์ž์ธ์„ ์œ„ํ•œ ํ˜‘์—… ํˆด๋กœ, ๊ธฐํš์„ ์œ„ํ•œ ๋ธŒ๋ ˆ์ธ์Šคํ† ๋ฐ, ๊ธฐํš ๋ฐœํ‘œ ์ž๋ฃŒ ์ œ์ž‘๊ณผ ์™€์ด์–ดํ”„๋ ˆ์ž„ ๋ฐ ์„œ๋น„์Šค ์ธํ„ฐํŽ˜์ด์Šค ๋””์ž์ธ์„ ํ†ตํ•ฉ์ ์œผ๋กœ ๊ด€๋ฆฌ ๋ฐ ํ˜‘์—…ํ•˜๊ธฐ ์œ„ํ•ด ์„ ์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

โŒจ๏ธ ์™ธ๋ถ€ API

Tech Description
FCM FCM(Firebase Cloud Messaging)์€ ์•ˆ์ •์ ์ธ ํ‘ธ์‹œ ์•Œ๋ฆผ ์ „์†ก์„ ์œ„ํ•ด ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ์™ธ๋ถ€ API๋กœ, Google์˜ ํด๋ผ์šฐ๋“œ ์ธํ”„๋ผ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋น ๋ฅด๊ณ  ํ™•์‹คํ•œ ๋ฉ”์‹œ์ง€ ์ „์†ก์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‹ค์–‘ํ•œ ํ”Œ๋žซํผ์„ ์ง€์›ํ•˜๋ฉฐ, ์„œ๋ฒ„ ์„ค์ •์ด ๊ฐ„ํŽธํ•˜๊ณ  ํ™•์žฅ์„ฑ์ด ๋›ฐ์–ด๋‚˜ ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ์— ๊ด€๊ณ„์—†์ด ์†์‰ฝ๊ฒŒ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Slack Slack App์„ ํ†ตํ•ด ์ฑ„๋„์— ๋ฉ”์‹œ์ง€ ์ „์†ก, ์Šค๋ ˆ๋“œ ์ƒ์„ฑ์˜ ๋™์ž‘์„ ํ•˜๋Š” API๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ”–ย Naming Rules

๐Ÿ–ฅ๏ธย Frontend

  • Folder: kebab-case
  • File: PascalCase
  • Component: PascalCase
  • Constant: SCREAMING_SNAKE_CASE
  • Variable: camelCase
  • State(atom, recoil): camelCaseState
  • Interface
    • props: PascalCaseProps
    • api response: camelCaseProps

๐Ÿ–ฅ๏ธ Backend

  • Package : kebab-case
  • Class : PascalCase
  • Constant : UPPERCASE
  • Method : camelCase
  • Variables : camelCase

๐Ÿ—‚๏ธย Commit Convention

Header ๊ธฐ๋Šฅ
๐ŸŒˆ Update ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์—…๋ฐ์ดํŠธ
๐Ÿ“ feat ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€
๐Ÿ”จ fix ๋ฒ„๊ทธ ์ˆ˜์ •
๐Ÿ“ docs ๋ฌธ์„œ ์ˆ˜์ •
๐ŸŽจ style ์ฝ”๋“œ ํฌ๋ฉงํŒ…
๐Ÿค– refactor ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง
โœ… test ํ…Œ์ŠคํŠธ ์ฝ”๋“œ
๐Ÿšš chore ๋นŒ๋“œ ์—…๋ฌด ์ˆ˜์ •, ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ € ์ˆ˜์ •
๐Ÿ’ฌ comment ์ฃผ์„ ์ถ”๊ฐ€ ๋ฐ ๋ณ€๊ฒฝ
โœ‚๏ธ remove ํŒŒ์ผ, ํด๋” ์‚ญ์ œ
๐Ÿ”ง rename ํŒŒ์ผ, ํด๋”๋ช… ์ˆ˜์ •

๐Ÿฌย Git Flow

gitflow
  • mainย : ์ถœ์‹œ ๊ฐ€๋Šฅํ•œ ํ”„๋กœ๋•์…˜ ์ฝ”๋“œ์˜ ๋ธŒ๋žœ์น˜
  • devย : ๋‹ค์Œ ๋ฒ„์ „์„ ๊ฐœ๋ฐœํ•˜๋Š” ๋ธŒ๋žœ์น˜
  • featย : ์ด์Šˆ ๋‹จ์œ„๋กœ ๊ธฐ๋Šฅ์„ ๊ฐœ๋ฐœํ•˜๋Š” ๋ธŒ๋žœ์น˜
    • ๋ธŒ๋žœ์น˜ ๋„ค์ด๋ฐ :ย feat/#์ด์Šˆ๋ฒˆํ˜ธ/[topic]
  • fix : ์ด์Šˆ ๋‹จ์œ„๋กœ ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋ธŒ๋žœ์น˜
    • ๋ธŒ๋žœ์น˜ ๋„ค์ด๋ฐ: fix/#์ด์Šˆ๋ฒˆํ˜ธ/[topic]
Header ๊ธฐ๋Šฅ
๐Ÿ“ main ์ตœ์ข… ๋ฐฐํฌํ•  ์„œ๋น„์Šค ๋‚ด์šฉ์˜ ๋ธŒ๋žœ์น˜
๐Ÿ”จ dev ์ฃผ์š” ๊ฐœ๋ฐœ ๋ธŒ๋žœ์น˜, ์ด ๋ธŒ๋žœ์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฐ์ž ์ž‘์—…ํ•œ ๊ธฐ๋Šฅ์„ merge
๐Ÿ“ feat ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ ๋ธŒ๋žœ์น˜, ๊ฐœ๋ฐœ์ด ์™„๋ฃŒ ์‹œ dev ๋ธŒ๋žœ์น˜์— merge
๐ŸŽจ test ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๊ฐœ๋ฐœ ๋ธŒ๋žœ์น˜, ๊ฐœ๋ฐœ ์™„๋ฃŒ ์‹œ dev ๋ธŒ๋žœ์น˜์— merge

About

๐Ÿž TimeToast(ํƒ€์ž„ํ† ์ŠคํŠธ) - ํฉ์–ด์ง€๋Š” ๊ธฐ์–ต์„ ๋‹ด๋Š” ๋‚˜๋งŒ์˜ ํ† ์ŠคํŠธ

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 3

  •  
  •  
  •