- ํด๋์ ๊ณต์ฐ ๊ฐ์์ ๊ธธ์ก์ด๊ฐ ๋๋ ์๋น์ค๋ฅผ ์ ๊ณตํจ์ผ๋ก์จ ํด๋์ ๊ณต์ฐ ๋ฌธํ๋ฅผ ๋ ์ฆ๊ฒ๊ฒ ํฅ์ ํ ์ ์๋๋ก ํฉ๋๋ค.
- ์ฌ์ฉ์์ ์ทจํฅ์ ๋ง๋ ๊ณต์ฐ์ ์ถ์ฒํด์ฃผ๊ณ , ํฐ์ผ์ ๋ง๋ค์ด ์ถ์ต์ ๊ฐ์งํ๊ณ , ๊ณต์ ํฉ๋๋ค.
- 2024.10.05 ~ 2024.11.24
Frontend
: 2๋ชBackend
: 2๋ช
- ๊ฐ๋ฐ ๋ฐ ์ ์ง๋ณด์ ๋น์ฉ ์ ๊ฐ
- ์ฌ์ฉ์๊ฐ ํ ํ๋ฉด์ ์ถ๊ฐํ์ฌ ์ฑ์ฒ๋ผ ํ์ฉ ๊ฐ๋ฅ
- ๋ค์ดํฐ๋ธ ์ฑ๊ณผ ์ ์ฌํ ์ฌ์ฉ์ฑ๊ณผ ๋น ๋ฅธ ๋ก๋ฉ ์๋ ์ ๊ณต
- ํ๋ซํผ ์ ์ฝ ์์ด ๋ค์ํ ํ๊ฒฝ์์ ๋์ผํ ์ฌ์ฉ์ ๊ฒฝํ ์ ๊ณต
- ์ถํ ์น ํธ์ ์๋ฆผ, ๋ฐฑ๊ทธ๋ผ์ด๋ ๋์ ๋ฑ ๊ธฐ๋ฅ ํ์ฅ์ด ์ฉ์ด
- JWT๋ฅผ ํ์ฉํ ์ธ์ฆ/์ธ๊ฐ
- SSL ๋ณด์ ๊ณ์ธต์ ํ์ฉํ ํ ํฐ ์ํธํ (HTTPS, ALB ์ค์น)
- CSRF / XSS ๊ณต๊ฒฉ์ ๋๋นํ ํ ํฐ ์ ์ฅ ๋ถ๋ฆฌ (Local storage, HTTP-only Cookie)
- Nginx๋ฅผ ํ์ฉํ actuator์ ๊ฐ์ ๋ฏผ๊ฐ ์ ๋ณด deny
- Spring Security๋ฅผ ํ์ฉํ ์ฒ ์ ํ Auth ๊ฒ์ฌ ๋ฐ uri ์ ๊ทผ ์กฐ์
- Kakao OAuth2.0์ ํ์ฉํ ์ธ์ฆ/์ธ๊ฐ ๊ธฐ๋ฅ ๊ฐํธํ
- docker ๋คํธ์ํฌ๋ฅผ ํ์ฉํ์ฌ spring ์๋ฒ๋, prometheus๊ฐ์ ์ธ์คํด์ค ํฌํธ ๋งคํx (Endpoint ๋จ์ผํ)
- Collaborative Filtering & Cosine Similarity ๊ธฐ๋ฐ ์ถ์ฒ์์คํ
- ๊ฐ Concert๋ AI๊ฐ ์ถ์ถํด์ค ํค์๋ ๊ฐ์ ๋ํด 0 ~ 1 ์ฌ์ด์ ๊ฐ์ ๊ฐ์ง
- ์ ์ ๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์จ๋ณด๋ฉ์์ ๋ฑ๋กํ ์ทจํฅ ์ ๋ณด๋ก ๋ถํฐ ๋ชจ๋ ํค์๋ ๊ฐ์ ๋ํด 0 ~ 1์ฌ์ด ๊ฐ์ ๊ฐ์ง
- Concerts, Users CSVํ์ผ์ ํตํด์ Cosine Similarity์ Collaborative Filtering์ ํตํ ์ ์ฌ๋ ๊ณ์ฐ ํ ์ถ์ฒ ์งํ
- ์๋น์ค์ ์ฃผ์ ๋ก์ง์ ์ฒ๋ฆฌํ๋ ์๋ฒ
- Grafana์ Prometheus์ ๊ธฐ๋ฐํ ๋ชจ๋ํฐ๋ง ์์คํ ๊ตฌ์ถ
- Nginx๋ฅผ ํตํ ๋ฆฌ๋ฒ์ค ํ๋ก์ ์ค์
- ๊ณต์ฐ ์ฑ๊ฒฉ ๋ถ์์ด๋, ์ ์ ์ฑ๊ฒฉ ๋ถ์, OCR์ ์ฒ๋ฆฌํ๋ ์๋ฒ
- OCR ๋ฐ ๊ณต์ฐ ์ฑ๊ฒฉ ์ ๋ณด ์ถ์ถ์ NCP์ AI ์๋น์ค๋ฅผ ํ์ฉ
- ์ถ์ฒ ์์คํ ์ ๊ฒฝ์ฐ ์ง์ Collaborative Filtering Model ๊ตฌํ
- KOPIS ์์คํ ์ผ๋ก๋ถํฐ ๊ณต์ฐ ์ ๋ณด๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ์ ๋ฐ์ดํธํ๋ ์๋ฒ(ํ๋ฌ์ 1๋ฒ)
- KOPIS์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ฌ๋๋ง๋ค AI์๋ฒ์ ํ์ต ์์ฒญ
๋ฐฐํฌ URL https://claco-client.vercel.app/
๊ธฐ์ ์คํ | ์ค๋ช |
---|---|
React | React๋ ๊ฐ์ฅ ํต์ฌ ์์์ธ Virtual Dom์ ์ด์ฉํ์ฌ ๋ถํ์ํ ํ๋ฉด ๊ฐฑ์ ์ ์ต์ํํฉ๋๋ค. ์ด๋ฅผ ํตํด, ์ฑ๋ฅ ํฅ์์ ์ํฌ ์ ์์ผ๋ฉฐ ๋น ๋ฅธ ๋ ๋๋ง์ ์ง์ํฉ๋๋ค. React๋ ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ์ํคํ ์ฒ๋ฅผ ์ฑํํ๊ณ ์์ผ๋ฉฐ, UI ์์๋ค์ ์ปดํฌ๋ํธ๋ก ๋ถ๋ฆฌํ์ฌ ๊ฐ๋ฐํ๊ณ ์กฐํฉํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌ์ฑํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์, ์ปดํฌ๋ํธ์ ์ฌ์ฌ์ฉ์ฑ์ ์ฉ์ดํ๊ฒ ํ๋ฉฐ, ์ฝ๋ ์์ ๋ฐ ์ ์งยท๋ณด์์ ํจ์จ์ ์ด๊ธฐ์ React๋ฅผ ์ฌ์ฉํ๊ฒ ๋์์ต๋๋ค. |
TypeScript | ์ ์ ํ์ ์ธ์ด๋ก์ ์ฝ๋์ ์์ ์ฑ์ ๋์ด๊ณ ํ์ ์ ์ฉ์ดํ๊ฒ ํ๋ฉฐ, ์์ฐ์ฑ ์ ๊ทผ ํ์ผ ๋จ๊ณ์์ ์ค๋ฅ๋ฅผ ์ฌ์ ์ ๋ฐ๊ฒฌํ์ฌ ๋ฐํ์ ์ค๋ฅ๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค. ๋ํ, ์ฝ๋ ํํธ์ ์๋ ์์ฑ์ ์ ๊ณตํด ๊ฐ๋ฐ ์์ฐ์ฑ์ ํฅ์์ํฌ ์ ์์ด TypeScript๋ฅผ ์ ์ ํ์ต๋๋ค. |
Zustand | ๊ฐ๊ฒฐํ๊ณ ์ง๊ด์ ์ธ ์ํ ๊ด๋ฆฌ ๋ฐฉ์๊ณผ ์ต์ํ์ ๋ณด์ผ๋ฌํ๋ ์ดํธ๋ก ์ ์ฐ์ฑ์ ์ ๊ณตํ๋ฉฐ, ์ํ ๋ณ๊ฒฝ ์์๋ง ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ์ฌ ๋ถํ์ํ ๋ ๋๋ง์ ์ต์ํํ๊ณ ์ฑ๋ฅ ํฅ์์ ๋์์ด ๋ฉ๋๋ค. |
Yarn | ๋น ๋ฅธ ์๋์ ๋์ ์ ๋ขฐ์ฑ์ ๋ฐํ์ผ๋ก ์์ ์ ์ธ JavaScript ํจํค์ง ๊ด๋ฆฌ๋ฅผ ์ง์ํ๋ฉฐ, ๋ณด์์ฑ ๊ฐํ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ฌ ํจ์จ์ ์ธ ํ๋ก์ ํธ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํฉ๋๋ค. |
TailwindCSS | ๊ฐ๋ฐ์ ํธ์์ฑ HTML๊ณผ CSS ํ์ผ์ ๋ณ๋๋ก ๊ฐ๋ฐ ๋ฐ ๊ด๋ฆฌํ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐํ๊ธฐ์ ํธ๋ฆฌํ๊ณ , ํํํ๋ ๊ฐ ํ๊ทธ์ ํด๋์ค๋ช ์ ๊ณ ๋ฏผํ ์๊ฐ์ ์ ์ฝํ ์ ์์ด ๋น ๋ฅธ ๊ฐ๋ฐ์ด ๊ฐ๋ฅํฉ๋๋ค. |
shadcn/ui | TailwindCSS์์ ๊ธด๋ฐํ ํตํฉ์ผ๋ก ๋น ๋ฅด๊ณ ์ผ๊ด๋ ์คํ์ผ๋ง์ด ๊ฐ๋ฅํ๋ฉฐ, ๋์ ํ์ฅ์ฑ๊ณผ ์ ์ฐํ ์ปค์คํฐ๋ง์ด์ง ๊ธฐ๋ฅ์ ํตํด ํ๋ก์ ํธ ์๊ตฌ์ฌํญ์ ๋ง๋ UI๋ฅผ ํจ์จ์ ์ผ๋ก ๊ตฌํํ ์ ์์ต๋๋ค. |
Tanstack-Query | ํจ์จ์ ์ธ ๋ฐ์ดํฐ ํ์นญ๊ณผ ๊ด๋ฆฌ๋ฅผ ์ ๊ณตํ๋ฉฐ, ๋ฐ์ดํฐ ์บ์ฑ ๊ธฐ๋ฅ์ ํตํด ๋ถํ์ํ ์์ฒญ์ ์ค์ฌ ์ฑ๋ฅ ์ต์ ํ์ ๋คํธ์ํฌ ๋น์ฉ ์ ๊ฐ์ด ๊ฐ๋ฅํฉ๋๋ค. |
Vercel | ๊น ์ ์ฅ์์ ํตํฉ๋์ด ์ฝ๋ ๋ณ๊ฒฝ ์ฌํญ์ ์๋์ผ๋ก ๊ฐ์งํ๊ณ , ํธ์ํ ๋๋ง๋ค ์๋ ๋ฐฐํฌ๋ฅผ ์ง์ํ์ฌ ํจ์จ์ ์ด๊ณ ๊ฐํธํ๊ฒ ์น์ฌ์ดํธ๋ฅผ ๋ฐฐํฌํ ์ ์์ต๋๋ค. |
PWA | ์น ๊ธฐ์ ๊ธฐ๋ฐ์ผ๋ก ๋ค์ํ ํ๋ซํผ์์ ๋์ํ๊ณ , ์ฑ ์คํ ์ด ์์ด ํ ํ๋ฉด์ ์ถ๊ฐํ ์ ์์ด ์ ๊ทผ์ฑ๊ณผ ํธ์์ฑ์ด ๋ฐ์ด๋๋ฉฐ, ๊ฐ๋ฐ ๋น์ฉ ์ ๊ฐ๊ณผ ๋น ๋ฅธ ๋ฐฐํฌ๊ฐ ๊ฐ๋ฅํฉ๋๋ค. |
- ํด๋๋ช
-
PascalCase
- ํ์ผ๋ช
-
PascalCase
- ํ์
, ์ ํธํจ์ ๋ฑ -
camelCase
- ์์ -
UpperCase
์ปค๋ฐ ๋ฉ์์ง๋ ํ๊ทธ: ์ปค๋ฐ ๋ฉ์์ง
ํ์์ผ๋ก ์์ฑ (ex. git commit -m "feat: ์นด์นด์ค ๋ก๊ทธ์ธ ๊ธฐ๋ฅ ๊ตฌํ")
๐Type
ํ๊ทธ๋ช | commit ๊ท์น |
---|---|
๐ feat | ์๋ก์ด ๊ธฐ๋ฅ ๊ฐ๋ฐ |
๐ fix | UI,UX ๋ฐ ์ฝ๋ ์์ |
๐จ style | CSS ์คํ์ผ๋ง ๋ฐ ํผ๋ธ๋ฆฌ์ฑ ์์ |
๐ docs | ๋ฌธ์ ์์ (REANME.md ๋ฑ) |
๐ test | ๋ฐฐํฌ ํ ์คํธ, QA ํ ์คํ ๊ด๋ จ |
๐งฐ refactor | ์ฝ๋ ๋ฆฌํฉํ ๋ง |
๐ง rename | ํด๋ ํน์ ํ์ผ๋ช ๋ณ๊ฒฝ |
โ๏ธ remove | ํ์ผ ์ญ์ |
-
๊ธฐ๋ฅ ๊ฐ๋ฐ ๊ด๋ จ Issue Template
์ด์์ ๊ดํ ์ค๋ช
- ํ ์ผ 1
-
๋ฒ๊ทธ ์์ ๊ด๋ จ Issue Template
๋ฌด์จ ์๋ฌ์ธ์ง ์ค๋ช !
ํน์ ๊ธฐ๊ธฐ์์๋ง ๋ฐ์ํ๋ ์๋ฌ๋ผ๋ฉด ๋๋ฐ์ด์ค ์ข ๋ฅ, ๋ธ๋ผ์ฐ์ ์ข ๋ฅ ๋ฑ!
์ด๋ป๊ฒ ์ฌํํ๋์ง ์ค๋ช !
์คํฌ๋ฆฐ์ท or GIF ๋ฑ..
- ๊ด๋ จ ์ด์
- ๊ธฐ์กด ์ฝ๋์ ์ํฅ์ ๋ฏธ์น๋ ์์ ์ฌํญ
- ๊ธฐ์กด ์ฝ๋์ ์ํฅ์ ๋ฏธ์น์ง ์๋ ์์ ์ฌํญ
- ์์ ๋ด์ฉ ์คํฌ๋ฆฐ ์ท
- ๋ฆฌ๋ทฐ์ด์๊ฒ ๊ณต์ ํ ๋ด์ฉ
- ์ถํ ์์ ํ ๋ด์ฉ
- main (develop) ๋ธ๋์น pull ์ฌ๋ถ ํ์ธ
๋ธ๋์น ๋ช | ์ญํ |
---|---|
main | ์ต์ข ๋ฐฐํฌ๋ ์๋น์ค์ ๋ธ๋์น |
develop | ๊ฐ๋ฐ ๋ธ๋์น, ํด๋น ๋ธ๋์น์์ ๋ถ๊ธฐ๋ฅผ ํ ์์ ํ merge |
feature | ๊ธฐ๋ฅ ๊ฐ๋ฐ ๋ธ๋์น |
hotfix | main ๋ธ๋์น ๋ฐฐํฌ ํ ๊ธด๊ธ ์์ ์ฌํญ ๋ฐ์ ์ ์ฌ์ฉํ๋ ๋ธ๋์น |
Language:
Java 17
Framework:Spring Boot 3.3.4
Database:MySQL 8.x
ORM:JPA(Hibernate)
CI/CD:Github Actions
Cloud Platform:AWS(EC2, ALB, ACM), GCP(SQL)
Test DB:testcontainer
TDD (ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ)
: ๊ตฌ๋ฌธ ์ปค๋ฒ์ง๋ฆฌ (Statement coverage) ๊ธฐ์ค 80%๋ฅผ ๋ชฉํ๋ก ์ํAgile (์ ์์ผ ํ๋ก์ธ์ค)
: 1์ฃผ ๋จ์ ์คํ๋ฆฐํธ ์ํGithub Flow ์ ๋ต
: ์ด๊ธฐ ๊ฐ๋ฐ ๊ณผ์ ์์ ๋ถํ์ํ ๋ธ๋์น ๊ด๋ฆฌ๋ฅผ ํผํ๊ณ , ๋น ๋ฅธ ๋ฐฐํฌ๋ฅผ ์ํ ์ ๋ต ์ ํCI/CD ํ์ดํ๋ผ์ธ์ ํตํ ๋ฐฐํฌ ์๋ํ
: ์๋น์ค ๊ฐ๋ฐ์ด 50% ์๋ฃ๋ ์์ ์์ ๊ตฌ์ถํ์ฌ ๋ฐฐํฌ ์๋ํ
- Service๋ ๋จ์ ํ ์คํธ, Repository๋ ํตํฉ ํ ์คํธ ์งํ
testcontainer
๋ฅผ ํ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฉฑ๋ฑ์ฑ ๋ณด์ฅ- ํ
์คํธ ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ์ธก์ ํด:
IntelliJ
- summary
- statement coverage ๊ธฐ์ค: 88%
- branch coverage: 54.8%
- class coverage: 100%
- method coverage: 96.7%
- ์ฌ์ฉ ์ธ์คํด์ค ์ ํ:
t2.large (ram 8GB)
- ๋ถํ ํ
์คํธ ์ธก์ ํด:
Jmeter
- summary
- ๋๋ฉ์ธ๋ณ ์ฃผ์ api ํ๊ท 50.3 Throughput
- ์นดํ ๊ณ ๋ฆฌ์์ ์ฐ๊ด ๊ด๊ณ ์ค์ ์ ํตํด ๊ด๊ณํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ์ฉ
- AI ์๋น์ค ํ์ต์ ์ํ soft delete ํ์ฉ
- PR ์ด๋ฒคํธ ๋ฐ์ ์ CI ์คํ (ํ ์คํธ ํฌํจ)
- approve ๋ฐ CI ์ฑ๊ณต ์ merge ๊ฐ๋ฅ
- merge ์ด๋ฒคํธ ๋ฐ์ ์ CI ์คํฌ๋ฆฝํธ ์ํ
- CI ์คํฌ๋ฆฝํธ ์ฑ๊ณต ์ CD ์คํฌ๋ฆฝํธ ์ํ
- Docker ์ด๋ฏธ์ง docker hub์ push
- SSH๋ก AWS EC2 ์ฐ๊ฒฐ
- docker hub์์ ์ด๋ฏธ์ง pull
- dokcer-compose๋ฅผ ํ์ฉํด ์๋น์ค ์คํ ๋ฐ ๋์ปค ๋คํธ์ํฌ ๊ตฌ์ถ