๐ฅ๏ธ Cheer-haํ๋ก์ ํธ/โ๏ธ TIL
[ TIL ] ์ต์ข
ํ๋ก์ ํธ_Day 17
by carrot0911
2025. 2. 27.
์ค๋ ์งํํ ๋ด์ฉ๋ค ๐ง
์ง๊ธ๊น์ง ์งํํ ๋ด์ฉ๋ค ์ ๋ฆฌ
V1 (MVP ๊ตฌํ)
1. ์ ์ฒด ์ฑ์ฉ ๊ณต๊ณ ์กฐํ API
- ๊ธฐ๋ฅ
- ์ฌ์ฉ์๊ฐ ์ ์ฒด ์ฑ์ฉ ๊ณต๊ณ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ์ ์๊ณ ํํฐ๋ง ๋ฐ ๊ฒ์์ด๋ฅผ ํตํด ํจ์จ์ ์ผ๋ก ์กฐํํ ์ ์๋๋ก ๊ตฌํํ์ต๋๋ค.
- ์ธ๋ถ ์ฌํญ
๊ธฐ๋ฅ |
์ค๋ช
|
์ ์ฒด ๋ฐ์ดํฐ ์กฐํ |
๋ณ๋์ ๊ฒ์์ด๋ ํํฐ ์กฐ๊ฑด ์์ด ๋ชจ๋ ์ฑ์ฉ ๊ณต๊ณ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ์ ์์ต๋๋ค. |
ํํฐ๋ง์ ํตํ ๋ฐ์ดํฐ ์กฐํ |
์ฌ์ฉ์๊ฐ ์
๋ ฅํ ์กฐ๊ฑด์ ๋ฐ๋ผ ์กฐ๊ฑด์ ์ค์ ํ์ฌ ์ฑ์ฉ ๊ณต๊ณ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ์ ์์ต๋๋ค. - ํํฐ ์กฐ๊ฑด: ์ง์ญ, ๊ณ ์ฉ ํํ, ํ๋ ฅ, ์ต์/์ต๋ ๊ฒฝ๋ ฅ, ์ฑ์ฉ ์์/๋ง๊ฐ ๊ธฐ๊ฐ, ์๊ฒฉ ์๊ฑด |
๊ฒ์์ด๋ฅผ ํตํ ๋ฐ์ดํฐ ์กฐํ |
ํน์ ๊ฒ์์ด๋ฅผ ์
๋ ฅํ๋ฉด ์ฑ์ฉ ๊ณต๊ณ ์ ๋ชฉ์ ๊ธฐ์ค์ผ๋ก ๊ฒ์ํ์ฌ ๊ด๋ จ ์ฑ์ฉ ๊ณต๊ณ ๋ฅผ ์กฐํํ ์ ์์ต๋๋ค. |
๋ฐ์ดํฐ ์ ๋ ฌ |
์ฑ์ฉ ๊ณต๊ณ ๋ ์ต์ ๋ฑ๋ก์(createdAt DESC)์ผ๋ก ์ ๋ ฌ๋ฉ๋๋ค. |
ํ์ด์ง๋ค์ด์
|
๋๋์ ๋ฐ์ดํฐ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์กฐํํ ์ ์๋๋ก ํ์ด์ง ๋จ์๋ก ์ ๊ณตํฉ๋๋ค. |
์ํฉ |
์๋ต ์ฝ๋ |
์๋ชป๋ ํํฐ๋ง ๊ฐ ์
๋ ฅ |
400 Bad Request |
2. ์ต๊ทผ ๊ธฐ๋ก ๊ฒ์ ์กฐํ API
- ๊ธฐ๋ฅ
- ์ฌ์ฉ์๊ฐ ์ต๊ทผ ๊ฒ์ํ ๊ธฐ๋ก์ ์ ์ฅํ๊ณ , ์ด๋ฅผ ์ต์ ์์ผ๋ก ์กฐํํ ์ ์๋๋ก ๊ตฌํํ์์ต๋๋ค.
- ๋์ผํ ๊ฒ์์ด๋ฅผ ๋ฐ๋ณต ์
๋ ฅํ๋ ๊ฒฝ์ฐ ์ค๋ณต ์ฒ๋ฆฌ๋ฅผ ์ํํ์ฌ ์ต์ ๊ฒ์์ด๊ฐ ํญ์ ์์์ ๋
ธ์ถ๋๋๋ก ์ค๊ณํ์์ต๋๋ค.
- ์ธ๋ถ ์ฌํญ
๊ธฐ๋ฅ |
์ค๋ช
|
๊ฒ์์ด ์ ์ฅ |
์ฌ์ฉ์๊ฐ ์
๋ ฅํ ๊ฒ์์ด๋ฅผ DB์ ์ ์ฅํฉ๋๋ค. |
์ต๊ทผ ๊ฒ์์ด ์กฐํ |
์ฌ์ฉ์๊ฐ ์ต๊ทผ ์
๋ ฅํ ๊ฒ์์ด ๋ชฉ๋ก์ ์กฐํํ ์ ์์ต๋๋ค. |
์ค๋ณต ์ฒ๋ฆฌ |
๋์ผํ ๊ฒ์์ด๋ฅผ ๋ค์ ์
๋ ฅํ๋ฉด ๊ธฐ์กด ๊ฒ์์ด๋ฅผ ์ต์ ๊ฒ์์ด๋ก ์
๋ฐ์ดํธํฉ๋๋ค. |
์ ๋ ฌ |
๊ฒ์์ด๋ ์ ์ฅ๋ ์ต์ ์(createdAt DESC)์ผ๋ก ์ ๋ ฌ๋ฉ๋๋ค. |
- ์์ธ ์ฒ๋ฆฌ
์ํฉ |
๋ฐํ |
์ค๋ช
|
๊ฒ์ ๊ฒฐ๊ณผ ์์ |
๋น ๋ฐฐ์ด ๋ฐํ |
์ฌ์ฉ์์ ์ต๊ทผ ๊ฒ์์ด ๊ธฐ๋ก์ด ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ |
V2 (์ฑ๋ฅ ๊ฐ์ ๋ฐ Elasticsearch ์ฑ๋ฅ ํ์ธ)
1. ์ ์ฒด ํ์ด์ง ์กฐํ ์ฑ๋ฅ ๊ฐ์
- ๊ธฐ๋ฅ
- ํํฐ๋ง์ ํตํ ์ฑ์ฉ ๊ณต๊ณ ์กฐํ ์ ๋ฐ์ดํฐ ์กฐํ ์๋๋ฅผ ์ต์ ํํ๊ธฐ ์ํด ์ธ๋ฑ์ค๋ฅผ ์ ์ฉํ์์ต๋๋ค.
- ๋จ์ผ ์ธ๋ฑ์ค์ ๋ณตํฉ ์ธ๋ฑ์ค๋ฅผ ๊ฐ๊ฐ ์คํํ์ฌ ์ฑ๋ฅ์ ๋น๊ตํ๊ณ , ์ต์ ์ ์ธ๋ฑ์ค ์ ๋ต์ ๊ฒฐ์ ํ์์ต๋๋ค.
- ์ฃผ์ ๊ฐ์ ์ฌํญ
์ ์ฉ ๋ฐฉ์ |
์ค๋ช
|
๋จ์ผ ์ธ๋ฑ์ค ์ ์ฉ |
๊ฐ๋ณ ์ปฌ๋ผ์ ์ธ๋ฑ์ค๋ฅผ ์ ์ฉํ๊ณ ์ฟผ๋ฆฌ ์คํ ์๋๋ฅผ ๋น๊ต ๋ถ์ํ์ต๋๋ค. ex) location, employmentType, minExperienceYears, maxExperienceYears ๋ฑ |
๋ณตํฉ ์ธ๋ฑ์ค ์ ์ฉ |
์ฌ์ฉ์๊ฐ ์์ฃผ ํจ๊ป ์กฐํํ๋ ์ปฌ๋ผ์ ๋ฌถ์ด์ ๋ณตํฉ ์ธ๋ฑ์ค๋ฅผ ์์ฑํ๊ณ ์ฑ๋ฅ ์ฐจ์ด๋ฅผ ๋น๊ต ๋ถ์ํ์ต๋๋ค. ex) (hiringStartAt, hiringEndAt), (minExperienceYears, maxExperienceYears) |
- ๋ชฉํ
- ์ฟผ๋ฆฌ ์ฑ๋ฅ ์ต์ ํ
- MySQL์์ WHERE ์กฐ๊ฑด์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๋๋ก ํ๋
- ๋ถํ์ํ Full Table Scan์ ์ค์ด๊ณ , Index Scan์ ์ต์ ํ
- ์ฟผ๋ฆฌ ๋น์ฉ ๊ฐ์
- ์ต์ ์ ์ธ๋ฑ์ค๋ฅผ ์ ์ ํ์ฌ DB ๋ฆฌ์์ค ์ฌ์ฉ๋์ ๊ฐ์
- ์กฐํ ์๋ ๊ฐ์
- ์ค์ API ์๋ต ์๊ฐ์ ๋น๊ตํ์ฌ ๊ฐ์ ํจ๊ณผ ํ์ธ
2. ์ต๊ทผ ๊ธฐ๋ก ๊ฒ์ ์กฐํ ์ฑ๋ฅ ๊ฐ์
- ๊ธฐ๋ฅ
- ์ต๊ทผ ๊ฒ์์ด ์กฐํ ์ ์๋ต ์๋๋ฅผ ๊ฐ์ ํ๊ณ DB ๋ถํ๋ฅผ ์ค์ด๊ธฐ ์ํด Redis ์บ์ฑ์ ์ ์ฉํ์์ต๋๋ค.
- ์ด๋ฅผ ํตํด ๋น ๋ฅธ ๊ฒ์์ด ์กฐํ ์ฑ๋ฅ์ ๋ณด์ฅํ๋ฉด์, MySQL์ ๋ถํ์ํ ์กฐํ ๋ถ๋ด์ ์ต์ํํ๋ ๋ฐฉํฅ์ผ๋ก ์ต์ ํํ์์ต๋๋ค.
- ์ฃผ์ ๊ฐ์ ์ฌํญ
์ ์ฉ ๋ฐฉ์ |
์ค๋ช
|
Redis ์บ์ ์ ์ฉ |
๊ธฐ์กด์๋ ์ฌ์ฉ์์ ์ต๊ทผ ๊ฒ์์ด๋ฅผ MySQL์์ ์ง์ ์กฐํํ์ง๋ง, Redis๋ฅผ ํ์ฉํ ์บ์ฑ ๊ธฐ๋ฒ์ ๋์
ํ์ฌ ์กฐํ ์๋๋ฅผ ๊ฐ์ ํ์ต๋๋ค. |
Redis Sorted Set ํ์ฉ |
์ฌ์ฉ์๋ณ ๊ฒ์์ด ๋ชฉ๋ก์ Redis์ Sorted Set ์๋ฃ๊ตฌ์กฐ๋ก ๊ด๋ฆฌํ์ฌ, ์ต์ ๊ฒ์์ด๋ฅผ ๋น ๋ฅด๊ฒ ์ ๋ ฌํ๊ณ ์กฐํํ ์ ์๋๋ก ์ต์ ํํ์ต๋๋ค. |
MySQL๊ณผ Redis์ ๋๊ธฐํ |
Redis์์ ์ผ์ ์ฃผ๊ธฐ(30๋ถ)๋ง๋ค MySQL๊ณผ ๋๊ธฐํ๋ฅผ ์งํํ์ฌ, ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ ์ ์งํ๋๋ก ํ์ต๋๋ค. |
- ๋ชฉํ
- ์กฐํ ์๋ ํฅ์
- ๊ฒ์์ด ์กฐํ API์ ์๋ต ์๋๋ฅผ ๊ฐ์
- DB ๋ถํ ๊ฐ์
- ๊ฒ์์ด ์กฐํ ์ MySQL์ ๋ถํ์ํ ์กฐํ ํ์๋ฅผ ์ค์ด๊ณ , ํธ๋ํฝ ๋ถ๋ด์ ์ต์ํ
- Redis ์บ์ฑ ํ์ฉ์ผ๋ก DB ๋ถํ์จ ๊ฐ์ ๋ฐ ์ ์ฒด ์์คํ
์์ ์ฑ ํฅ์
V3 (Elasticsearch ์ฐ๋ API ์์ฑ)
1. Elasticsearch์์ ์ ์ฒด ํ์ด์ง ์กฐํ ์ฑ๋ฅ ํ์ธ
- ๊ธฐ๋ฅ
- ๊ธฐ์กด MySQL ๊ธฐ๋ฐ ๊ฒ์๊ณผ Elasticsearch ๊ธฐ๋ฐ ๊ฒ์์ ์ฑ๋ฅ์ ๋น๊ต ๋ถ์ํ์์ต๋๋ค.
- ์ด๋ฅผ ์ํด Elasticsearch์ ๋ฐ์ดํฐ๋ฅผ ์์ธ(indexing)ํ์ฌ ๊ฒ์์ ์ํํ๊ณ , ๋์ผํ ๊ฒ์ ์กฐ๊ฑด์์ MySQL ๋๋น ์๋ต ์๋๋ฅผ ๋น๊ตํ๋ ์คํ์ ์งํํ์์ต๋๋ค.
- ์ธ๋ถ ์ฌํญ
์ ์ฉ ๋ฐฉ์ |
์ค๋ช
|
Elasticsearch ๋ฐ์ดํฐ ์ ์ฌ |
CSV ํ์ผ์ Elasticsearch์ ์์ธํ์ฌ ๊ฒ์ ๋ฐ ํํฐ๋ง์ด ๊ฐ๋ฅํ๋๋ก ์ค์ ํ์ต๋๋ค. |
Elasticsearch ์ธ๋ฑ์ค ์์ฑ |
job-opening ์ธ๋ฑ์ค๋ฅผ ์์ฑํ์ฌ, ํค์๋ ๊ฒ์ ๋ฐ ํํฐ๋ง ๊ธฐ๋ฅ์ ์ ๊ณตํ ์ ์๋๋ก ๋งคํ์ ์ค์ ํ์ต๋๋ค. |
Elasticsearch vs MySQL ์ฑ๋ฅ ๋น๊ต |
๋์ผํ ๊ฒ์ ์กฐ๊ฑด์ ์ ์ฉํ์ฌ Elasticsearch์ MySQL์ ์๋ต ์๊ฐ์ ๋น๊ต ๋ถ์ํ์ต๋๋ค. |
- ๋ชฉํ
- Elasticsearch ์ ์ฉ ์ /ํ ๊ฒ์ ์๋ ๋น๊ต
- ๊ธฐ์กด MySQL ๋๋น Elasticsearch์ ์ฑ๋ฅ ์ฐ์๋ฅผ ๊ฐ๊ด์ ์ผ๋ก ๋ถ์
- ์ค์ API ํธ์ถ์ ํตํด ์๋ต ์๋ ์ฐจ์ด ์ธก์
- MySQL ๋๋น Elasticsearch์ ๊ฒ์ ํจ์จ์ฑ ํ์ธ
- Elasticsearch๊ฐ ๋๋์ ๋ฐ์ดํฐ์์ ๋น ๋ฅด๊ฒ ๊ฒ์ํ ์ ์๋์ง ๊ฒ์ฆ
- MySQL ๋๋น ๊ฒ์ ์๋ ๋ฐ ํํฐ๋ง ์ฒ๋ฆฌ ์๋ ํฅ์ ์ฌ๋ถ ํ์ธ
2. Elasticsearch ์ฐ๋ ์กฐํ API
- ๊ธฐ๋ฅ
- Elasticsearch์ ์ฐ๋ํ์ฌ ๋๋์ ์ฑ์ฉ ๊ณต๊ณ ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ฒ ์กฐํํ ์ ์๋๋ก API๋ฅผ ๊ตฌํํ์์ต๋๋ค.
- ์ด๋ฅผ ํตํด ๊ธฐ์กด MySQL ๊ธฐ๋ฐ ๊ฒ์๊ณผ ๋น๊ตํ์ฌ๊ฒ์ ์๋์ ์ฑ๋ฅ์ ๋ถ์ํ ์ ์๋๋ก ์ค๊ณํ์์ต๋๋ค.
- ์ธ๋ถ ์ฌํญ
๊ธฐ๋ฅ |
์ค๋ช
|
์ ์ฒด ๋ฐ์ดํฐ ์กฐํ |
๋ณ๋์ ๊ฒ์์ด๋ ํํฐ ์กฐ๊ฑด ์์ด ๋ชจ๋ ์ฑ์ฉ ๊ณต๊ณ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ์ ์์ต๋๋ค. |
ํํฐ๋ง์ ํตํ ๋ฐ์ดํฐ ์กฐํ |
์ฌ์ฉ์๊ฐ ์
๋ ฅํ ์กฐ๊ฑด์ ๋ฐ๋ผ ์กฐ๊ฑด์ ์ค์ ํ์ฌ ์ฑ์ฉ ๊ณต๊ณ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ์ ์์ต๋๋ค. |
๊ฒ์์ด๋ฅผ ํตํ ๋ฐ์ดํฐ ์กฐํ |
ํน์ ๊ฒ์์ด๋ฅผ ์
๋ ฅํ๋ฉด ์ฑ์ฉ ๊ณต๊ณ ์ ๋ชฉ์ ๊ธฐ์ค์ผ๋ก ๊ฒ์ํ์ฌ ๊ด๋ จ ์ฑ์ฉ ๊ณต๊ณ ๋ฅผ ์กฐํํ ์ ์์ต๋๋ค. |
๋ฐ์ดํฐ ์ ๋ ฌ |
์ฑ์ฉ ๊ณต๊ณ ๋ ์ต์ ๋ฑ๋ก์(createdAt DESC)์ผ๋ก ์ ๋ ฌ๋ฉ๋๋ค. |
ํ์ด์ง๋ค์ด์
|
๋๋์ ๋ฐ์ดํฐ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์กฐํํ ์ ์๋๋ก ํ์ด์ง ๋จ์๋ก ์ ๊ณตํฉ๋๋ค. |
๋ด์ผ ๊ณํ โฐ
- ํผ๋๋ฐฑ ๋ฐ์ํด์ ์ฝ๋ ๋ฆฌํฉํ ๋ง
- ์ ์ฒด์ ์ธ ์ฝ๋ ๋ฆฌํฉํ ๋ง ํ์
+ ์ถ๊ฐ ๊ณํ์ด ์๊ธธ ์๋ ์์ต๋๋ค ~_~