B-Tree Index B-Tree ์ธ๋ฑ์ค๋ ์ธ๋ฑ์ฑ ์๊ณ ๋ฆฌ์ฆ ์ค ๊ฐ์ฅ ๋ฒ์ฉ์ ์ผ๋ก ์ฌ์ฉ๋๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค. ์ฌ๊ธฐ์ B ๋ Balanced ๋ฅผ ์๋ฏธํ๋ค. (Binary ์๋) B-Tree index๋ ๊ตฌ์กฐ์ฒด ๋ด์์ ํญ์ ์ ๋ ฌ๋ ์ํ๋ฅผ ์ ์งํ๋ค.
๊ตฌ์กฐ ๋ฐ ํน์ง B-Tree ์ธ๋ฑ์ค๋ Root / Branch / Leaf ์ 3๊ฐ์ง์ ๋
ธ๋๋ก ๊ตฌ๋ถ๋๋ค. ์ฌ๊ธฐ์ Leaf ๋
ธ๋๋ ์ค์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ ๋ฐ์ดํฐ ํ์ผ์ ์ฃผ์๋ฅผ ๊ฐ๋ฅดํค๊ณ ์๋ค.
์ ๊ทธ๋ฆผ์ ๋ณด๋ฉด, ์ธ๋ฑ์ค๋ ํญ์ ์ ๋ ฌ๋ ์ฑ๋ก ์ ์ง๋์ง๋ง, ๋ฐ์ดํฐ ํ์ผ์ ๋ฌด์์์ ์์๋ก ์ ์ฅ๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ์ด ์ด์ ๋ ๋ฐ์ดํฐ ํ์ผ์ ์ผ๋ถ ๋ ์ฝ๋๊ฐ ์ญ์ ๋์ด ๋น ๊ณต๊ฐ์ด ์๊ธฐ๊ฒ ๋๋ฉด ํด๋น ๊ณต๊ฐ์ ์ฌํ์ฉํ๊ธฐ ๋๋ฌธ์ด๋ค.
๊ฐ์ ์ต๊ทผ ํ๋ฌ ๋์ ํ ์คํํธ์
์์ ์ธํด ๊ทผ๋ฌด๋ฅผ ํ๋ฉฐ, typeorm์ ์จ๋ณธ ํ๊ธฐ๋ฅผ ๋งํ๊ณ ์ ํ๋ค. ์ฐ๋ฆฌ ํ์ฌ๋ nest.js + typeorm ์ฐ๊ณ ์๊ณ , ๊ธฐ์กด์ ๋ ๊ฑฐ์ ์ฝ๋๋ฅผ typeorm ์ผ๋ก ๋ณํํ๋ฉด์ ๋ง์ ๊ณ ์ถฉ๋ ๋๋ผ๊ณ ์์ง๋ง, ๊ฝค ๊ด์ฐฎ์ orm์ด๋ผ๋ ์๊ฐ๋ ๋ค๊ณ ์๋ค. ๊ทธ๋์ ๋ด๊ฐ typeorm์ ์ฐ๋ฉด์ ๋๊ผ๋ ๊ด์ฐฎ์ ์ ๊ณผ ์์ฌ์ด ์ ์ ๋ํด ํฌ์คํธํ๊ณ ์ ํ๋ค.
์ฅ์ QueryBuilder ๋ฅผ ์ฌ์ฉํด์ ์ฟผ๋ฆฌ์ ๋ฐ๋ณต์ ์ค์ผ ์ ์๋ค. ๋ค์๊ณผ ๊ฐ์ ์ฟผ๋ฆฌ๊ฐ ์๋ค๊ณ ๊ฐ์ ํ์.
1 2 3 4 5 6 7 8 9 10 11 SELECT * FROM A LEFT JOIN B on A.
Gmail ์ฑ ๋น๋ฐ๋ฒํธ ์ค์ nodemailer๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์ , ์ด๋ฉ์ผ์ ๋ณด๋ด๋ ์ฃผ์ฒด๊ฐ ํ์ํ๋ฐ, ์ด๋ฅผ ์ํด์ ์ด๋ฒ ํฌ์คํธ์์ Gmail์ ์ฌ์ฉํ ์์ ์ด๋ค. nodemailer๊ฐ Gmail์ ์ ๊ทผํ ๋ ์ธ์ฆ๋ ์ฌ์ฉ์์ธ์ง ํ์ธํ๊ธฐ ์ํด credentail ๊ฐ์ ๊ตฌ๊ธ ์์ด๋ / ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๊ณตํ๋๋ฐ, ์ด๋ ๋น๋ฐ๋ฒํธ๋ ๊ตฌ๊ธ ๊ณ์ ์์ ์์ฑํ ๋ฌด์์์ ์๋ฌธ์ 16์๋ก ์ด๋ฃจ์ด์ง ์ฑ ๋น๋ฐ๋ฒํธ์ด๋ค. ์ด๋ฅผ ์์ฑํ๊ธฐ ์ํด์ ๋ค์๊ณผ ๊ฐ์ ์กฐ๊ฑด์ด ๋ง์กฑ๋์ด์ผ ํ๋ค.
ํ์ฌ, ํ๊ต, ์กฐ์ง์ ๊ณ์ ์ด๋ฉด ์๋๋ค. 2์ฐจ ์ธ์ฆ์ ํด์ผ ์ฌ์ฉํ ์ ์๋ค. ์ด๋ฌ๊ณ ๋์๋ ํ๋ฉด์ ํ์๋์ง ์์๋ค๋ฉด, ํ์ฑํ๋ 2๋จ๊ณ ์ธ์ฆ ํญ์ ๋ค์ด๊ฐ ์ ์ผ ํ๋จ์ ์ฑ ๋น๋ฐ๋ฒํธ๋ฅผ ์์ฑํด์ฃผ๋ฉด ๋๋ค.
๊ฐ์ ์ด๋ฒ ํฌ์คํ
์์๋ public/private s3๋ฅผ ์์ฑํ๊ณ ๊ฐ๊ฐ ์ด๋ป๊ฒ ์ ๊ทผํ๋์ง, ๊ทธ๋ฆฌ๊ณ ์ฝ๋๋ก์๋ ์ด๋ป๊ฒ ๊ตฌํํ๋์ง์ ๋ํด ์์๋ณด๊ฒ ๋ค.
IAM User ์์ฑ AWS Root user๋ ๋ชจ๋ ์๋น์ค์ ๋ํ ๊ถํ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ at least privilege ์ ์์น์ ์ด๊ธ๋๋ค. ๋ฐ๋ผ์ IAM User ๋ฅผ ์์ฑํด S3์ ๋ํ ์ ๊ทผ ๊ถํ๋ง์ ๋ถ์ฌํ๋๋ก ํ๋ค.
Public/Private S3 ์์ฑ Public ๋ชจ๋ ํผ๋ธ๋ฆญ ์์ธ์ค ์ฐจ๋จ ์ฒดํฌ๋ฐ์ค๋ฅผ ํด์ ํ๊ณ ์์ฑํ๋ค. ์ถ๊ฐ๋ก, Bucket Policy ์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ์ฌ, url์ ํตํด bucket์ ์ ๊ทผํ ์ ์๋๋ก ํ๋ค.
๊ฐ์ Nest.js Framework(Spring, Angular ๋ฑ)๋ฅผ ์ฌ์ฉํด์ ์์
์ ํ๋ค๋ณด๋ฉด, Dependency Injection, Inversion of Controll ๊ฐ์ ๋จ์ด๋ค์ด ์์ฃผ๋ณด์ธ๋ค. ํ์๋ ์ด ๋จ์ด๋ค์ด ์ด๋ค ์๋ฏธ๋ฅผ ๊ฐ๋์ง ๋ชจ๋ฅด๊ณ ๊ฐ๋ฐ์ ํ๋ค๋ณด๋ ๊ณ์ ๊ตฌ๋ ํ
์ด์ ๋น ์ง๋ ๊ธฐ๋ถ์ด๋ผ ์ด์ ๋ํด ๋ง์ ํฌ์คํธ/ ๋น๋์ค๋ฅผ ๋ณด๊ณ ์ ๋ฆฌํ์๋ค. ํฌ์คํธ๋ ๋ค์๊ณผ ๊ฐ์ ์์๋ก ๊ตฌ์ฑ๋๋ค. Nest.js์์ DI๋ฅผ ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง๋ฅผ Nest.js ๋ฉ์ธํ
์ด๋์ ์ค๋ช
์ ํ ๋๋ก ์์ฑํ์๋ค. ๊ทธ๋ฆฌ๊ณ DI๊ฐ ๊ฐ๋
์ ์ผ๋ก ๋ฌด์์ธ์ง, ์ ์ฌ์ฉํด์ผ ํ๋์ง, ์ด๋ป๊ฒ ์ฌ์ฉํ๋ฉด ๋๋์ง์ ๋ํด ํฌ์คํธํ๋ ค๊ณ ํ๋ค.
Nest.js ์์ DI๋? Nest๋ฅผ ์ฌ์ฉํ๋ค๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์์ฃผ ๋ณผ ์ ์๋ค.
๊ฐ์ ๋ฉด์ ์์ ์ด๋ฒคํธ ๋ฃจํ๊ฐ ๋ญ๋๋ ์ง๋ฌธ์ ์ ํ ๋๋ตํ์ง ๋ชปํด์ ์ฐพ์๋ณด๋ค๊ฐ ์ฌ๋ฌ ์ปค๋ฎค๋ํฐ์์ ์ด๋ฒคํธ ๋ฃจํ์ ์ ํํ ๊ฐ๋
์ ๋ํด ์ฌ๋ ์๊ฒ ์๊ฐํ๋ ๊ฑธ ๋ณด๊ณ ์ ๋ฆฌํ๊ณ ์ ํ์์ต๋๋ค.
setTimeout vs setImmediate 1 2 3 4 5 6 setTimeout(() => { console.log("setTimeout") }, 0) setImmediate(() => { console.log("setImmediate") }) ์ ์ฝ๋๋ฅผ ์คํํ๋ฉด ๋ญ๊ฐ ๋จผ์ ๊ฒฐ๊ณผ๋ก ์ถ๋ ฅ๋ ๊น? ์ ๋ต์ ๋ชจ๋ฅธ๋ค ์
๋๋ค. ๊ทธ ์ด์ ๋ฅผ ์ค๋ช
ํ๊ธฐ ์ํด์ ์ด๋ฒคํธ ๋ฃจํ์ ๊ตฌ์กฐ๋ฅผ ์ดํด๋ด์ผ ํฉ๋๋ค.
Node.js ์ด๋ฒคํธ ๋ฃจํ Node.js๋ฅผ ์ฑ๊ธ ์ค๋ ๋ ๋
ผ ๋ธ๋กํน ์ด๋ผ๊ณ ํฉ๋๋ค.