Dailyge๋ก ์ผ์ ๊ด๋ฆฌ๋ฅผ ๊ฐํธํ๊ฒ!
์ฑ์คํ ํ๋ฃจ์ ์ฐ์์ด ํฐ ๋ณํ๋ฅผ ๊ฐ์ ธ์ต๋๋ค. ๐
- ์๋น์ค ์๊ฐ
- Contents
- Skills
- CI/CD
- Architecture
- Monitoring
- Moduels
- Package
Dailyge๋ ์ผ์ ์ ์ฒด๊ณ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ ํ๋ฃจ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๊ณํํ์ฌ ์ค์ํ ์ผ์ ์ง์คํ ์ ์๋๋ก ๋์์ฃผ๋ ์๋น์ค์ ๋๋ค.
์๋น์ค ์ด์ฉํ๊ธฐ
โป ํ์ฌ ์น ์๋น์ค๋ง ์ง์ํ๊ณ ์์ต๋๋ค.
์์ธ ๋ด์ฉ์ ์ฐ๊ด PR์ด๋ Discussion์ ์ฐธ์กฐํด์ฃผ์ธ์.
- JWT ํ ํฐ์ ๋ฐํํ ๋, ์ด๋ค ์ ์ ๊ณ ๋ คํด์ผ ํ ๊น?
- JWT ํ ํฐ์ ํ์ฑํ ๋, ์ด๋ค ์์ธ๊ฐ ๋ฐ์ํ ์ ์์๊น?
- JWT ํ ํฐ์ด ํ์ทจ ๋นํ๊ฒฝ์ฐ, ์ด๋ป๊ฒ ํด์ผ ํ ๊น?
- JWT ํ ํฐ์ ํ๋๋ฅผ ์ํธํํ๋ฉด ์ด๋ค ์ด์ ์ด ์๊ณ , ์ด๋ค ์๊ณ ๋ฆฌ์ฆ์ด ์ฌ์ฉ๋ ๊น?
- CBC์ GCM๋ ์ด๋ ํ ์ฐจ์ด๊ฐ ์๊ณ ์ฑ๋ฅ์๋ ์ฐจ์ด๊ฐ ์กด์ฌํ ๊น?
- ๋๋ฉ์ธ ๊ฐ ์ฟ ํค๊ฐ ๊ณต์ ๋์ง ์์ ๋, ์ด๋ป๊ฒ ํด์ผ ํ ๊น?
- ๋ฐ์ดํฐ ์์ถํ๋ฉด ์ด๋ค ์ด์ ์ด ์์๊น? (feat.๋ ๋์ค)
- ๋ถํ ํ ์คํธ๋ฅผ ํ ๋, ํฐ์บฃ์ ์ด๋ค ์ค์ ๋ค์ ๊ณ ๋ คํด์ผ ํ ๊น?
- ๋ถํ ํ ์คํธ ๊ณผ์ ์์ ์ด๋ค ์งํ๋ค์ ๋ชจ๋ํฐ๋ง ํด์ผ ํ ๊น?
- ์ ์ฐฉ์ ์ฟ ํฐ ๋น์ฒจ์๋ฅผ ์ ์ ํ ๋, ์๋ต ์๋๋ฅผ ์ด๋ป๊ฒ ๋น ๋ฅด๊ฒ ํ ์ ์์๊น?
- ์ฟ ํฐ ์ด๋ฒคํธ ์ฐธ์ฌ API ๋ถํํ ์คํธ
- Redis Bitmap ๊ตฌ์กฐ๋ก Redis ๋ฉ๋ชจ๋ฆฌ ์ ์ฝํ๊ธฐ
- ๋ ๋์ค ํธ์ถ ํ์๋ฅผ ์ค์ฌ ์กฐํ ์ฑ๋ฅ์ ๋์ฌ๋ณด์. (feat. LuaScript)
- ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ Timezone์ ์ด๋ค ๋ฐฉ์์ผ๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ด ์ข์๊น?
Backend, Infra, ํ์ ์ ์ฌ์ฉ๋ ๊ธฐ์ ์คํ/ํด์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
-
Backend
-
Infra
-
Collaboration
Java/SpringBoot๋ฅผ ์ฌ์ฉํด ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ์ต๋๋ค. Liquibase๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง๋ฅผ ์ถ์ ํ๊ณ ์์ผ๋ฉฐ, API ๋ฌธ์๋ Swagger์ RestDocs๋ฅผ ์กฐํฉํด ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
์๋น์ค ๊ตฌ์ถ์ ์ํด AWS๋ฅผ ํ์ฉํ์ผ๋ฉฐ, Terraform์ ์ฌ์ฉํด ์์์ ํ๋ก๋น์ ๋ ํ์ต๋๋ค. Terraform์ผ๋ก ๊ด๋ฆฌ๋๋ ์์์ Route53, CloudFront, S3, ALB, ECS, EC2( Application), RDB ์ด๋ฉฐ, ์ผ๋ถ ์์๋ค์ ์ค์นํ์ผ๋ก ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๋ชจ๋ํฐ๋ง์ Prometheus์ Grafana๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ, ์ด์ ๋ฐ ์์คํ ๋ก๊ทธ๋ ๋ชจ๋ AWS CloudWatch๋ก ๊ด๋ฆฌํ๊ณ ์์ต๋๋ค. ์ด์ ๊ณผ์ ์์ ๋ฐ์ํ๋ ์ด์๋ Grafana Alert ๋๋ AWS Lambda๋ฅผ ํตํด ์ฌ๋์ผ๋ก ๋ณด๊ณ ๋ฐ๊ณ ์์ต๋๋ค.
์ธํ๋ผ์ ๋ํ ์์ธํ ๋ด์ฉ์ ํด๋น ๋งํฌ๋ฅผ ์ฐธ์กฐํด์ฃผ์ธ์.
ํ์ ํด์ ์ด์ ํธ๋ํน์ ์ํด Jira/Confluencer๋ฅผ, ์๋ํ ํด์ Zapier์ AWS EventBridge, Lambda, SNS/SQS๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ํ์ ๊ฐ ์ปค๋ฎค๋์ผ์ด์ ์ Slack์ผ๋ก ์ด๋ฃจ์ด์ง๋ฉฐ, ๋ํ CI/CD ๊ณผ์ ์์ ๋ฐ์ํ ๋ฆฌํฌํธ, AWS ๋น์ฉ ๊ฒฐ๊ณผ๋ Slack์ผ๋ก ๋ณด๊ณ ๋ฐ๊ณ ์์ต๋๋ค. ํ์ ๊ฐ ์ฝ๋ ์ปจ๋ฒค์ ๊ด๋ฆฌ ๋ฐ ์ฝ๋ ์ค๋ฉ ์ ๊ฑฐ๋ฅผ ์ํด CheckStyle, PMD, SonarCloud์ ๊ฐ์ ์ ์ ์ฝ๋ ๋ถ์ ํด์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
Git branch ์ ๋ต์ Git-Flow
๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
- ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ๋,
dev
๋ธ๋์น์์feature
๋ธ๋์น๋ฅผ ๋ถ๊ธฐํฉ๋๋ค. feature
๋ธ๋์น์์ ์์ ์ ๋๋ด๋ฉด ์ฝ๋๋ฆฌ๋ทฐ๋ฅผ ํ ํMerge
๋ฅผ ํตํดdev
๋ธ๋์น์ ๋ณํฉํฉ๋๋ค.- ์์
์ด ์ทจ์๋๋ฉด,
Revert
ํฉ๋๋ค. dev
์๋ฒ์์ QA๋ฅผ ๊ฑฐ์น ํ, ์ด์์ด ์๋ค๋ฉดprod
๋ธ๋์น๋ก ๋ณํฉํฉ๋๋ค.- ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ,
prod
๋ธ๋์น์์hotfix
๋ธ๋์น๋ฅผ ๋ถ๊ธฐํ๊ณ ์์ ํ ํprod
์ ๋ณํฉํฉ๋๋ค.
PR์ด ์์ฑ๋๋ฉด ์๋์ผ๋ก ์ ์ ๋ถ์์ ์์ํ๋ฉฐ, Slack์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ ๋ฐ์ต๋๋ค. ํ์ ๊ฐ ์ฝ๋ ๋ฆฌ๋ทฐ๋ฅผ ๊ฑฐ์น ํ, dev ๋ธ๋์น๋ก ๋ณํฉ์ด ๋๋ฉด, ๊ฐ๋ฐ ์๋ฒ๋ก ๋ฐฐํฌ๊ฐ ๋๋ฉฐ, ์ธ์ ํ ์คํธ๊ฐ ์์๋ฉ๋๋ค. ์ดํ QA๋ฅผ ์งํํ๋ฉฐ ๊ธฐ๋ฅ์ ๋์ ์ ๋ฌด, ๋ฒ๊ทธ ๋ฆฌํฌํ ์ ํฉ๋๋ค. ๋ง์ง๋ง์ผ๋ก main ๋ธ๋์น๋ก ๋ณํฉ์ด ๋๋ฉด ์์ฉ ์๋ฒ๋ก ๋ฐฐํฌ๊ฐ ๋๊ณ ์ต์ข ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ณ ๋ฐ์ต๋๋ค.
ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ์ง ์๊ฑฐ๋ ํ ์คํธ๊ฐ ์คํจํ๋ ๊ฒฝ์ฐ, ๋๋ ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ์ถฉ์กฑํ์ง ๋ชปํ๋ฉด ๋น๋๊ฐ ์คํจํ๊ฒ ๋ฉ๋๋ค. ๊ฐ๋ฐ์๋ฒ์์ QA๋ฅผ ์งํํด ์ฝ๋ ๋ ๋ฒจ์์ ๋ฐ๊ฒฌํ ์ ์๋ ๋ฒ๊ทธ๋ฅผ ํ ๋ฒ ๋ ๊ฒ์ฆํฉ๋๋ค.
์ ์ ์์์ S3์ CloudFront๋ฅผ, ์๋ฒ ์ค์ผ์คํธ๋ ์ด์ ์ AWS ECS๋ฅผ ์ฌ์ฉํ์ต๋๋ค. ๊ฐ ๋ฆฌ์์ค๋ VPC ๋ด๋ถ ๋ณ๋์ ์๋ธ๋ท(Public/Private)์ ์กด์ฌํ๋ฉฐ, ALB์ NAT๋ฅผ ํตํด ์ธ๋ถ์ ํต์ ํฉ๋๋ค. ๋ถํ ํ ์คํธ๋ฅผ ํ ๋๋ terraform์ ํตํด ์๋ฒ๋ฅผ ๋์ ์ผ๋ก ํ์ฅํ๊ณ ์์ผ๋ฉฐ, ํ์์์๋ ์ต์ ์ธ์คํด์ค๋ง ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
๋ชจ๋ํฐ๋ง์ Prometheus์ Grafana๋ฅผ CloudWatch์ ์ฐ๋ํด ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ, ์ด๋ฅผ ํตํด ์๋ฆผ์ ๋ฐ๊ณ ์์ต๋๋ค. ๋ชจ๋ํฐ๋ง ์ค์ธ ๋ฆฌ์์ค๋ EC2 ์๋ฒ, ์ ํ๋ฆฌ์ผ์ด์ ์งํ, RDS, Redis, MongoDB ์ด๋ฉฐ, CPU/๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ฅ , Slow Query ๋ฑ์ ์ฒดํฌํ๊ณ ์์ต๋๋ค.
ํ๋ก์ ํธ์ ์ฌ์ฉ๋ ๋ชจ๋์ admin-api
, dailyge-api
, storage
, support
๋ชจ๋ ์
๋๋ค. ๊ฐ ๋ชจ๋์ ๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- admin-api: ๊ด๋ฆฌ์ API ๋ชจ๋ ์ ๋๋ค.
- dailyge-api: ์ค์ผ์ค ๊ด๋ฆฌ ์๋น์ค API ๋ชจ๋ ์ ๋๋ค.
- storage: ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ชจ๋ ์ ๋๋ค.
- support: ๋ก๊น , ๋ชจ๋ํฐ๋ง ๋ฑ API ๋ชจ๋์ ์ง์ํ๋ ๋ชจ๋ ์ ๋๋ค.
๋๋ฉ์ธ ๋ชจ๋ธ๊ณผ ์์ ๋ชจ๋ธ์ ๋ณ๋๋ก ๊ตฌ๋ถํ์ง ์์์ผ๋ฉฐ, ์์ ๋ชจ๋ธ์ ๋๋ฉ์ธ ๋ชจ๋ธ๋ก ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๋๋ฉ์ธ ๋ชจ๋ธ๋ก ์ธํด ๋์ด๋๋ ์ฝ๋๋, ์ด๋ก ์ธํ ์ ์ง๋ณด์ ๋น์ฉ์ด ๋ ํฌ๋ค๊ณ ํ๋จํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
โโ ๐storage
โ ......
โย ย โ๐ dailyge
โย ย โ๐ entity # ์์ ๋ชจ๋ธ
๋ชจ๋๊ฐ ์์กด๊ด๊ณ๋ ๋ค์๊ณผ ๊ฐ์ผ๋ฉฐ, ๋ถํ์ํ ์์กด์ฑ ์ ๊ฑฐ, ๋น๋ ์๊ฐ ๋จ์ถ์ ์ํด ์ํด ๋์ฒด๋ก runtimeOnly ๋๋ imeimplementation ๊ตฌ์ฑ(Configuration)์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
core ํจํค์ง๋ ์๋น์ค์ ๊ดํ ๊ธฐ๋ฅ์, common ํจํค์ง๋ ํ๋ก์ ํธ์์ ๊ณตํต์ผ๋ก ์ฌ์ฉ๋๋ ํด๋์ค ๋๋ ์ค์ ์ ํฌํจํ๊ณ ์์ต๋๋ค. ์์ ๊ณ์ธต์ ํ์ ๊ณ์ธต์ ์์กดํ์ง ์์ผ๋ฉฐ, ํ์ ๊ณ์ธต์ ์กด์ฌ๋ฅผ ์์ง ๋ชปํฉ๋๋ค.
โโ๐ dailyge-api
โ ......
โ โโ๐ app
โ โโ๐ common # ํ๋ก์ ํธ ๊ณตํต ํจํค์ง
โ โโ๐ core
โ โโ๐ user # ๋๋ฉ์ธ
โ โโ๐ external # ์ธ๋ถ ์์คํ
ํธ์ถ ๊ณ์ธต - Optional
โ โโ๐ presentation # ํ๋ฉด ๊ณ์ธต
โ โโ๐ facade # ํผ์ฌ๋ ๊ณ์ธต - Optional
โ โโ๐ application # ์๋น์ค ๊ณ์ธต
โ โโ๐ persistence # ์์ ๊ณ์ธต
โโโ
......
๊ฐ ๊ณ์ธต์ ์์กด์ฑ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
> Controller --> Facade --> Application, External --> Persistence