ํฐ์คํ ๋ฆฌ ๋ทฐ
Next.js + Vercel ํ๊ฒฝ์์ ํ๊ธ ๊ฒ์ ๊ตฌํ ์ฝ์ง๊ธฐ๋ก
siyoon210 2025. 5. 4. 20:23๐ Next.js + Vercel ํ๊ฒฝ์์ ํ๊ธ ๊ฒ์ ๊ตฌํ๊ธฐ: ์ฝ์ง๊ธฐ๋ถํฐ ์ง์ bigram ๊ตฌํ๊น์ง
Next.js + Vercel ํ๊ฒฝ์์ ํ๊ธ ๊ฒ์ ๊ธฐ๋ฅ ๊ตฌํ์ด ์์ธ๋ก ๊ณจ์น ์ํ ์ผ์ด์๊ณ ์ด๋ฅผ ์ ๋ฆฌํ๊ธฐ ์ํด์ ๊ณต์ ํฉ๋๋ค.
1๏ธโฃ LIKE ๊ฒ์? ๊ฐ๋จํ์ง๋ง ์ฑ๋ฅ์ ๋ถ์ ์์
์ฒ์์ ๋๊ตฌ๋ WHERE title LIKE '%๊ฒ์์ด%'๋ก ์์ํฉ๋๋ค.
๊ฐ๋จํ์ฃ . ํ์ง๋ง ๋ค์๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค:
- ์ธ๋ฑ์ค๋ฅผ ํ์ง ๋ชปํด ๋ฐ์ดํฐ๊ฐ ๋ง์์ง๋ฉด ๊ฒ์ ์๋๊ฐ ํ ๋๋ ค์ง
- ์ ์ฒด ์ค์บ์ด ๋ฐ์ํด ๋น์ฉ์ด ๋น์
- ๋จ์ ํฌํจ ๊ฒ์์ด๋ผ ์๋ฏธ ๊ธฐ๋ฐ ๊ฒ์ ๋ถ๊ฐ
๊ทธ๋์ ๋ฐ๋ก ํฌ๊ธฐํ์ต๋๋ค.
2๏ธโฃ PostgreSQL tsvector? …ํ๊ธ ํํ์ ๋ถ์์ ๋ฏธ์ง์ ๐ข
PostgreSQL์ tsvector + to_tsvector ์กฐํฉ์ ํํ
์คํธ ๊ฒ์์ ์ํด ๋งค์ฐ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์
๋๋ค.
์์:
SELECT * FROM posts WHERE to_tsvector('english', title) @@ plainto_tsquery('english', 'search');
ํ์ง๋ง ๋ฌธ์ ๋ ํ๊ธ์ ๋๋ค. PostgreSQL ๊ธฐ๋ณธ ์ค์ ์์ ์์ด, ํ๋์ค์ด ๋ฑ์ ์ง์ํ์ง๋ง ํ๊ตญ์ด๋ ํํ์ ๋ถ์๊ธฐ๊ฐ ์์ด์ ์๋ฏธ ๋จ์๋ก ์ชผ๊ฐค ์ ์์ต๋๋ค.
๊ทธ๋์ tsvector๋ฅผ ๊ทธ๋๋ก ์ธ ์ ์๋ค๋ ํ๊ณ๊ฐ ์์์ฃ .
tsvector?
๊ฐ๋จํ ๋งํด tsvector๋ ๊ฒ์์ ๋น ๋ฅด๊ฒ ํ๊ธฐ ์ํ ํ
์คํธ ์ธ๋ฑ์ค ํฌ๋งท์
๋๋ค.
๋จ์ด ๋จ์๋ก ์ชผ๊ฐ์ ์ธ๋ฑ์ฑํ๊ณ , tsquery๋ก ๋น ๋ฅด๊ฒ ๊ฒ์ํ ์ ์๊ฒ ํด์ค๋๋ค.
3๏ธโฃ ํํ์ ๋ถ์๊ธฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ? → Vercel์์ ๋งํ
์ฌ๋ฌ ํํ์ ๋ถ์๊ธฐ๋ฅผ ํ์ฉํ๋ ค ํ์ง๋ง, Vercel์ ์๋ฒ๋ฆฌ์ค ํ๊ฒฝ์ด๋ผ:
- ๋ณ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ค์นํ๊ฑฐ๋
- ์๋ฐ๋ C++ ๊ธฐ๋ฐ์ผ๋ก ์คํ๋๋ ๊ฒ ์์ฒด๊ฐ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
Vercel์ ๋ฌด์กฐ๊ฑด ๋น ๋ฅด๊ณ ์งง๊ฒ ๋๋๋ ํจ์ ์ค์ฌ์ผ๋ก ๋์๊ฐ๊ธฐ ๋๋ฌธ์, ๋ณ๋ ํํ์ ๋ถ์๊ธฐ๋ ์ ์ด์ ๊ตฌ์กฐ์ ์ผ๋ก ์ด๋ ต์ต๋๋ค.
4๏ธโฃ ETRI ํํ์ ๋ถ์๊ธฐ ์ฌ์ฉ? → IP ์ฐจ๋จ๋จ ๐ญ
๋ค์ ์๋๋ก ETRI ๊ณต๊ฐ API๋ฅผ ํ์ฉํ๋๋ฐ, ์ฌ๊ธฐ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. (https://aiopen.etri.re.kr/)
- ์๋ฒ๋ฆฌ์ค๋ ํธ์ถํ ๋๋ง๋ค ์๋ฒ IP๊ฐ ๋ฐ๋๋ ๊ตฌ์กฐ
- ์ผ์ ํ์ ์ด๊ณผ๋๋ฉด "๋ค์ค IP ์ ๊ทผ์ผ๋ก ์ธํ ์ฐจ๋จ" ๋ฐ์
- ๊ฒฐ๊ณผ์ ์ผ๋ก ETRI API๋ ์ง์์ ์ผ๋ก ์ธ ์ ์์
5๏ธโฃ pg_bigm ํ์ฅ ๋ชจ๋? → Supabase์์ ๋ฏธ์ง์
PostgreSQL์๋ pg_bigm์ด๋ผ๋ ๊ฐ๋ ฅํ Bigram ๊ธฐ๋ฐ ๊ฒ์ ํ์ฅ์ด ์์ต๋๋ค.
ํ๊ธ์ฒ๋ผ ๊ณต๋ฐฑ ์์ด ๋ถ์ด ์๋ ์ธ์ด์์ ์ ์ฉํ์ฃ .
ํ์ง๋ง Supabase์์๋ ์์ง pg_bigm ํ์ฅ์ ๊ณต์ ์ง์ํ์ง ์์ต๋๋ค.
์ค์นํ๋ ค๋ฉด ์ปค์คํ
์๋ฒ๋ฅผ ์จ์ผ ํ๊ณ , ๊ทธ๊ฑด Supabase๋ฅผ ์ฐ๋ ์ด์ ์์ฒด๋ฅผ ํ๋ฆฌ๊ฒ ๋ง๋ค์ฃ .
Bigram?
Bigram์ ๋ฌธ์์ด์ ๋ ๊ธ์์ฉ ๋์ด์ ๋ถ์ํ๋ ๋ฐฉ์
โ ์ต์ข ํด๊ฒฐ์ฑ : ์ง์ Bigram + tsvector ์กฐํฉ ๊ตฌํ
๊ฒฐ๊ตญ ์ ํํ ๋ฐฉ๋ฒ์ ์ง์ Bigram์ผ๋ก ์ชผ๊ฐ์ tsvector ํํ๋ก ์ ์ฅํ๊ณ , ์ด๋ฅผ ํ์ฉํ๋ ๋ฐฉ์์ด์์ต๋๋ค.
์์:
// ์: "ํ๊ตญ์ด๊ฒ์" → ["ํ๊ตญ", "๊ตญ์ด", "์ด๊ฒ", "๊ฒ์"]
function toBigram(str: string): string[] {
const grams = [];
for (let i = 0; i < str.length - 1; i++) {
grams.push(str.slice(i, i + 2));
}
return grams;
}
๊ทธ๋ฆฌ๊ณ ์ด ๊ฒฐ๊ณผ๋ฅผ ๋ฏธ๋ฆฌ tsvector ํ์ ํํ๋ก ๋ณํํด์ ๋ณ๋ ์ปฌ๋ผ์ ์ ์ฅํด๋๊ณ , ๊ฒ์ ํค์๋๋ bigram ํํ๋ก ๋ง๋ค์ด tsquery๋ฅผ ์ํํฉ๋๋ค.
+ ์ปฌ๋ผ์ tsvector ํ์ ์ด์ด์ผ ํ๊ณ , gin ์ธ๋ฑ์ค๋ฅผ ๊ฑธ์ด์ผ ์ฑ๋ฅ์ ์ด์ ์ด ์์ต๋๋ค.
๋ง๋ฌด๋ฆฌ
Next.js + Vercel + Supabase ์กฐํฉ์์ ํ๊ธ ๊ฒ์์ ์ ๋๋ก ๊ตฌํํ๊ธฐ ์ํ ์ฝ์ง๊ธฐ๋ฅผ ์ ๋ฆฌํด๋ดค์ต๋๋ค.
- LIKE๋ ์ฑ๋ฅ์ ํ๊ณ
- PostgreSQL ๊ธฐ๋ณธ tsvector๋ ํ๊ธ ๋ฏธ์ง์
- ์ธ๋ถ ํํ์ ๋ถ์๊ธฐ/์๋น์ค๋ ์๋ฒ๋ฆฌ์ค์์ ์ฌ์ฉ์ด ์ด๋ ค์
- ๊ทธ๋์ ๊ฒฐ๊ตญ Bigram + tsvector ๋ฐฉ์์ผ๋ก ์ง์ ํด๊ฒฐ
๋น์ทํ ํ๊ฒฝ์์ ๊ณ ๋ฏผ ์ค์ด๋ผ๋ฉด, ์ด ๊ธ์ด ์กฐ๊ธ์ด๋๋ง ๋์์ด ๋์์ผ๋ฉด ์ข๊ฒ ์ต๋๋ค.
'Development' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ณ๋ ฌ ์ฒ๋ฆฌ ๋ชจ๋ธ์ ๋ชจ๋ IO ์์ ์ ์ต์ ํ๋์ด ์๋ค (CPU ๋ฐ์ด๋ ์์ ์ ์กฐ์ฌํ์) (0) | 2025.04.16 |
---|---|
WebRTC๋ ๋ฌด์์ธ๊ฐ? (0) | 2024.10.06 |
Null ๊ณตํฌ์ฆ์ ๋ด๋ ค๋์ (1) | 2024.07.24 |
์ ์ฐจ์งํฅ ํ๋ก๊ทธ๋๋ฐ ๋ถ์ ์จ๋ค.. (๊ฐ์ฒด์งํฅ์ ์ฝ๋งค์ด์ง ๋ง์) (0) | 2024.05.15 |
์ฌ๋ ์ฑ ๋ง๋ค๊ธฐ ์ฝ์ง ๊ธฐ๋ก๊ธฐ (0) | 2023.10.15 |