/images/profile.png

Hi i'am shy.

B-Tree index

B-Tree Index B-Tree ์ธ๋ฑ์Šค๋Š” ์ธ๋ฑ์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘ ๊ฐ€์žฅ ๋ฒ”์šฉ์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ์—ฌ๊ธฐ์„œ B ๋Š” Balanced ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. (Binary ์•„๋‹˜) B-Tree index๋Š” ๊ตฌ์กฐ์ฒด ๋‚ด์—์„œ ํ•ญ์ƒ ์ •๋ ฌ๋œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•œ๋‹ค. ๊ตฌ์กฐ ๋ฐ ํŠน์ง• B-Tree ์ธ๋ฑ์Šค๋Š” Root / Branch / Leaf ์˜ 3๊ฐ€์ง€์˜ ๋…ธ๋“œ๋กœ ๊ตฌ๋ถ„๋œ๋‹ค. ์—ฌ๊ธฐ์„œ Leaf ๋…ธ๋“œ๋Š” ์‹ค์ œ ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฅดํ‚ค๊ณ  ์žˆ๋‹ค. ์œ„ ๊ทธ๋ฆผ์„ ๋ณด๋ฉด, ์ธ๋ฑ์Šค๋Š” ํ•ญ์ƒ ์ •๋ ฌ๋œ ์ฑ„๋กœ ์œ ์ง€๋˜์ง€๋งŒ, ๋ฐ์ดํ„ฐ ํŒŒ์ผ์€ ๋ฌด์ž‘์œ„์˜ ์ˆœ์„œ๋กœ ์ €์žฅ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ด ์ด์œ ๋Š” ๋ฐ์ดํ„ฐ ํŒŒ์ผ์˜ ์ผ๋ถ€ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์‚ญ์ œ๋˜์–ด ๋นˆ ๊ณต๊ฐ„์ด ์ƒ๊ธฐ๊ฒŒ ๋˜๋ฉด ํ•ด๋‹น ๊ณต๊ฐ„์„ ์žฌํ™œ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

Typeorm์„ ์จ๋ณด๋ฉด์„œ

๊ฐœ์š” ์ตœ๊ทผ ํ•œ๋‹ฌ ๋™์•ˆ ํ•œ ์Šคํƒ€ํŠธ์—…์—์„œ ์ธํ„ด ๊ทผ๋ฌด๋ฅผ ํ•˜๋ฉฐ, 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.

Schedule Email With Nodemailer

Gmail ์•ฑ ๋น„๋ฐ€๋ฒˆํ˜ธ ์„ค์ • nodemailer๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„ , ์ด๋ฉ”์ผ์„ ๋ณด๋‚ด๋Š” ์ฃผ์ฒด๊ฐ€ ํ•„์š”ํ•œ๋ฐ, ์ด๋ฅผ ์œ„ํ•ด์„œ ์ด๋ฒˆ ํฌ์ŠคํŠธ์—์„œ Gmail์„ ์‚ฌ์šฉํ•  ์˜ˆ์ •์ด๋‹ค. nodemailer๊ฐ€ Gmail์— ์ ‘๊ทผํ•  ๋•Œ ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์ธ์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด credentail ๊ฐ’์— ๊ตฌ๊ธ€ ์•„์ด๋”” / ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ œ๊ณตํ•˜๋Š”๋ฐ, ์ด๋•Œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ๊ตฌ๊ธ€ ๊ณ„์ •์—์„œ ์ƒ์„ฑํ•œ ๋ฌด์ž‘์œ„์˜ ์˜๋ฌธ์ž 16์ž๋กœ ์ด๋ฃจ์–ด์ง„ ์•ฑ ๋น„๋ฐ€๋ฒˆํ˜ธ์ด๋‹ค. ์ด๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด์„  ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์กฐ๊ฑด์ด ๋งŒ์กฑ๋˜์–ด์•ผ ํ•œ๋‹ค. ํšŒ์‚ฌ, ํ•™๊ต, ์กฐ์ง์˜ ๊ณ„์ •์ด๋ฉด ์•ˆ๋œ๋‹ค. 2์ฐจ ์ธ์ฆ์„ ํ•ด์•ผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Ÿฌ๊ณ  ๋‚˜์„œ๋„ ํ™”๋ฉด์— ํ‘œ์‹œ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด, ํ™œ์„ฑํ™”๋œ 2๋‹จ๊ณ„ ์ธ์ฆ ํƒญ์— ๋“ค์–ด๊ฐ€ ์ œ์ผ ํ•˜๋‹จ์— ์•ฑ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

public/private s3 ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ํŒŒ์ผ ์—…๋กœ๋“œ ๊ธฐ๋Šฅ ๊ตฌํ˜„

๊ฐœ์š” ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” public/private s3๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ฐ๊ฐ ์–ด๋–ป๊ฒŒ ์ ‘๊ทผํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์ฝ”๋“œ๋กœ์„œ๋Š” ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ๋‹ค. IAM User ์ƒ์„ฑ AWS Root user๋Š” ๋ชจ๋“  ์„œ๋น„์Šค์— ๋Œ€ํ•œ ๊ถŒํ•œ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— at least privilege ์˜ ์›์น™์— ์–ด๊ธ‹๋‚œ๋‹ค. ๋”ฐ๋ผ์„œ IAM User ๋ฅผ ์ƒ์„ฑํ•ด S3์— ๋Œ€ํ•œ ์ ‘๊ทผ ๊ถŒํ•œ๋งŒ์„ ๋ถ€์—ฌํ•˜๋„๋ก ํ•œ๋‹ค. Public/Private S3 ์ƒ์„ฑ Public ๋ชจ๋“  ํผ๋ธ”๋ฆญ ์—‘์„ธ์Šค ์ฐจ๋‹จ ์ฒดํฌ๋ฐ•์Šค๋ฅผ ํ•ด์ œํ•˜๊ณ  ์ƒ์„ฑํ•œ๋‹ค. ์ถ”๊ฐ€๋กœ, Bucket Policy ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•˜์—ฌ, url์„ ํ†ตํ•ด bucket์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

Dependency Injection (feat:Nest)

๊ฐœ์š” Nest.js Framework(Spring, Angular ๋“ฑ)๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ž‘์—…์„ ํ•˜๋‹ค๋ณด๋ฉด, Dependency Injection, Inversion of Controll ๊ฐ™์€ ๋‹จ์–ด๋“ค์ด ์ž์ฃผ๋ณด์ธ๋‹ค. ํ•„์ž๋Š” ์ด ๋‹จ์–ด๋“ค์ด ์–ด๋–ค ์˜๋ฏธ๋ฅผ ๊ฐ–๋Š”์ง€ ๋ชจ๋ฅด๊ณ  ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค๋ณด๋‹ˆ ๊ณ„์† ๊ตฌ๋ ํ……์ด์— ๋น ์ง€๋Š” ๊ธฐ๋ถ„์ด๋ผ ์ด์— ๋Œ€ํ•ด ๋งŽ์€ ํฌ์ŠคํŠธ/ ๋น„๋””์˜ค๋ฅผ ๋ณด๊ณ  ์ •๋ฆฌํ•˜์˜€๋‹ค. ํฌ์ŠคํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆœ์„œ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. Nest.js์—์„œ DI๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€๋ฅผ Nest.js ๋ฉ”์ธํ…Œ์ด๋„ˆ์˜ ์„ค๋ช…์„ ํ† ๋Œ€๋กœ ์ž‘์„ฑํ•˜์˜€๋‹ค. ๊ทธ๋ฆฌ๊ณ  DI๊ฐ€ ๊ฐœ๋…์ ์œผ๋กœ ๋ฌด์—‡์ธ์ง€, ์™œ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€, ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ๋˜๋Š”์ง€์— ๋Œ€ํ•ด ํฌ์ŠคํŠธํ•˜๋ ค๊ณ  ํ•œ๋‹ค. Nest.js ์—์„œ DI๋ž€? Nest๋ฅผ ์‚ฌ์šฉํ•˜๋‹ค๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ž์ฃผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

Node.js ์ด๋ฒคํŠธ ๋ฃจํ”„

๊ฐœ์š” ๋ฉด์ ‘์—์„œ ์ด๋ฒคํŠธ ๋ฃจํ”„๊ฐ€ ๋ญ๋ƒ๋Š” ์งˆ๋ฌธ์— ์ „ํ˜€ ๋Œ€๋‹ตํ•˜์ง€ ๋ชปํ•ด์„œ ์ฐพ์•„๋ณด๋‹ค๊ฐ€ ์—ฌ๋Ÿฌ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์ด๋ฒคํŠธ ๋ฃจํ”„์˜ ์ •ํ™•ํ•œ ๊ฐœ๋…์— ๋Œ€ํ•ด ์‹ฌ๋„ ์žˆ๊ฒŒ ์ƒ๊ฐํ•˜๋Š” ๊ฑธ ๋ณด๊ณ  ์ •๋ฆฌํ•˜๊ณ ์ž ํ•˜์˜€์Šต๋‹ˆ๋‹ค. setTimeout vs setImmediate 1 2 3 4 5 6 setTimeout(() => { console.log("setTimeout") }, 0) setImmediate(() => { console.log("setImmediate") }) ์œ„ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋ญ๊ฐ€ ๋จผ์ € ๊ฒฐ๊ณผ๋กœ ์ถœ๋ ฅ๋ ๊นŒ? ์ •๋‹ต์€ ๋ชจ๋ฅธ๋‹ค ์ž…๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด์„  ์ด๋ฒคํŠธ ๋ฃจํ”„์˜ ๊ตฌ์กฐ๋ฅผ ์‚ดํŽด๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Node.js ์ด๋ฒคํŠธ ๋ฃจํ”„ Node.js๋ฅผ ์‹ฑ๊ธ€ ์Šค๋ ˆ๋“œ ๋…ผ ๋ธ”๋กœํ‚น ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.