์ „์ฒด ๊ธ€

์ „์ฒด ๊ธ€

    HTTP Method

    ›ํ”„๋กœ์ ํŠธ๋ฅผ ์ •๋ฆฌํ•˜๋‹ค๊ฐ€ API ํ†ต์‹ ์—์„œ ์‚ฌ์šฉํ–ˆ๋˜ http ๋ฉ”์†Œ๋“œ๊ฐ€ ๊ถ๊ธˆํ•ด์ ธ ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค ๐Ÿ˜€ HTTP ๋ฉ”์†Œ๋“œ๋ž€? : ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์—๊ฒŒ ์‚ฌ์šฉ์ž ์š”์ฒญ์˜ ๋ชฉ์ ์„ ์•Œ๋ฆฌ๋Š” ๊ฐ€์ด๋“œ๋ผ์ธ์ด๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐ€์ด๋“œ๋ผ์ธ์„ ์ž˜์ง€์ผœ์•ผ RESTfulํ•œ API๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. RESTfulํ•œ API๋Š” REST ํŠน์ง•์„ ์ง€ํ‚จ API์ธ๋ฐ, ์—ฌ๊ธฐ์„œ REST๋Š” http ํ†ต์‹ ์—์„œ ์–ด๋–ค ์ž์›์— ๋Œ€ํ•œ CRUD(Create, Read, Update, Delete) ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด Resource(URI)๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ์ด๋ผ๊ณ  ํ•œ๋‹ค. ํ‚. (*URI์€ URL์„ ํฌํ•จํ•˜๋Š” ๊ฐœ๋…!) ์•„์ง๊นŒ์ง€๋Š” REST๋ฅผ API๋ฅผ ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค ๊ฒƒ์ธ๊ฐ€์— ๋Œ€ํ•œ ํ‘œ์ค€ ์ •๋„๋กœ ์ƒ๊ฐํ•˜๊ณ  ์žˆ๋‹ค. ์•„๋ฌดํŠผ ์ด๋Ÿฌํ•œ RESTful API์˜ ๊ตฌ์„ฑ์š”์†Œ ์ค‘ ํ•˜๋‚˜์ธ Met..

    [AWS] EC2 ์ธ์Šคํ„ด์Šค - SSH ์—ฐ๊ฒฐ ์‹œ Error ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

    ์ฒ˜์Œ์—๋Š” linux ์šฉ AWS EC2 ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ ํ›„ SSH๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ–ˆ๋‹ค. ๋‚ด๊ฐ€ ssh ์—ฐ๊ฒฐ์„ ์œ„ํ•ด ์ž‘์„ฑํ•œ ๋ช…๋ น์–ด: ssh -i *.pem linux@{๋‚ด ํผ๋ธ”๋ฆญ IPv4 ์ฃผ์†Œ} ์ฒซ ๋ฒˆ์งธ๋กœ ์ง๋ฉดํ•œ ๋ฌธ์ œ: Permissions 0644 for 'flask.pem' are too open. ๋‹ค์šด๋กœ๋“œํ•œ ํ‚ค ํŽ˜์–ด๊ฐ€ too open ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— connecting์„ ๊ฑฐ์ ˆ๋‹นํ–ˆ๋‹ค. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: ์•„๋ž˜ ์ฝ”๋“œ๋กœ ํ‚ค ํŽ˜์–ด์˜ ๊ถŒํ•œ์„ ์†Œ์œ ์ž์—๊ฒŒ๋งŒ ์ฝ๊ธฐ ๊ถŒํ•œ์ด ์žˆ๋„๋ก ๋ณ€๊ฒฝํ•ด์ค€๋‹ค. chmod 400 flask.pem ๋‘ ๋ฒˆ์งธ๋กœ ์ง๋ฉดํ•œ ๋ฌธ์ œ: Permission denied (publickey, gssapi-keyex, gssapi-with-mic). ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: ๋‚ด instance user name์„ ์ œ๋Œ€๋กœ ์•ˆ ..

    [JavaScript] ๋™๊ธฐ & ๋น„๋™๊ธฐ

    ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ์ฝ”๋“œ๊ฐ€ ์ž‘์„ฑ๋œ ์ˆœ์„œ๋Œ€๋กœ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, ์ด์ „ ์ž‘์—…์ด ์ง„ํ–‰ ์ค‘์ผ ๋•Œ๋Š” ๋‹ค์Œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ณ  ๊ธฐ๋‹ค๋ฆฐ๋‹ค. ์ด๋Ÿฐ Task ์ฒ˜๋ฆฌ ๋ฐฉ์‹์„ ๋™๊ธฐ ๋ฐฉ์‹์˜ ์ฒ˜๋ฆฌ๋ผ๊ณ  ํ•œ๋‹ค. function TaskA() { console.log("TASK A"); } function TaskB() { console.log("TASK B"); } function TaskC() { console.log("TASK C"); } TaskA(); TaskB(); TaskC(); ๋™๊ธฐ์  ์ฒ˜๋ฆฌ์˜ ๋‹จ์ ์€ ํ•˜๋‚˜์˜ ์ž‘์—…์ด ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค๋ฉด ๋ชจ๋“  ์ž‘์—…์ด ํ•ด๋‹น ์ž‘์—…์ด ์ข…๋ฃŒ๋˜๊ธฐ ์ „๊นŒ์ง€ STOP ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ „์ฒด ํ๋ฆ„์ด ์ง€์ฒด๋œ๋‹ค. ์ฆ‰, ์„ฑ๋Šฅ ์ƒ์˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ๋‹ค๋ฅธ ์–ธ์–ด(C, C++ ... )์—์„œ๋Š” ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ..

    [JavaScript] spread | ์ „๊ฐœ ์—ฐ์‚ฐ์ž

    ์Šคํ”„๋ ˆ๋“œ ์—ฐ์‚ฐ์ž('...')๋Š” ์—ฐ๊ฒฐ, ๋ณต์‚ฌ ๋“ฑ์˜ ์šฉ๋„๋กœ ์‚ฌ์šฉ๋˜๋ฉฐ ๋ฐฐ์—ด๊ณผ ๊ฐ์ฒด๋ฅผ ํ•œ ์ค„๋กœ ํŽผ์น˜๋Š” ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฐฐ์—ด์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. const coffee = ["์•„๋ฉ”๋ฆฌ์นด๋…ธ", "๋ฐ”๋‹๋ผ๋ผ๋–ผ"]; const juice = ["ํฌ๋„์ฃผ์Šค", "์˜ค๋ Œ์ง€์ฃผ์Šค", "ํ† ๋งˆํ† ์ฃผ์Šค"]; const menu = [...coffee, "์ƒˆ๋กœ์šด ์Œ๋ฃŒ", ...juice]; console.log(menu); // ["์•„๋ฉ”๋ฆฌ์นด๋…ธ", "๋ฐ”๋‹๋ผ๋ผ๋–ผ", "์ƒˆ๋กœ์šด ์Œ๋ฃŒ", "ํฌ๋„์ฃผ์Šค", "์˜ค๋ Œ์ง€์ฃผ์Šค", "ํ† ๋งˆํ† ์ฃผ์Šค"] ์ƒ๋‹นํžˆ ์ง๊ด€์ ์ธ ์˜ˆ์‹œ๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค ^-^! ๊ฐ์ฒด์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. const latte = { base: "milk", from: "Starbucks" }; const bani..

    [JavaScript] ๋น„๊ตฌ์กฐํ™” ํ• ๋‹น ๊ทธ๋ฆฌ๊ณ  SWAP

    ๋ฐฐ์—ด์˜ ๋น„๊ตฌ์กฐํ™” ํ• ๋‹น ๋ฐฐ์—ด์—์„œ ๋น„๊ตฌ์กฐํ™” ํ• ๋‹น์„ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ๋ฐฐ์—ด ์•ˆ์— ์žˆ๋Š” ๊ฐ’์„ ์ถ”์ถœํ•ด์„œ ๋ณ€์ˆ˜ / ์ƒ์ˆ˜๋กœ ๋ฐ”๋กœ ์„ ์–ธ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ๋ฐฐ์—ด ์•ˆ์— ์žˆ๋Š” ์›์†Œ๋ฅผ ์ƒˆ๋กœ ์„ ์–ธํ•ด์ฃผ๊ณ  ์‹ถ์„ ๋•Œ ๊ต‰์žฅํžˆ ์œ ์šฉํ•œ ๋ฌธ๋ฒ•์ด๋‹ค. # Case 1: ๊ธฐ์กด ํ• ๋‹น ๋ฐฉ๋ฒ• let colors = ["red", "green", "blue"]; let color0 = colors[0]; let color1 = colors[1]; let color2 = colors[2]; console.log(color0, color1, color2); // red green blue # Case 2: ๋น„๊ตฌ์กฐํ™” ํ• ๋‹น let [color1, color2, color3] = ["red", "green", "blue"]; console.log(color0, color..

    [Swift] Protocols | Delegate๋ฅผ ์‚ด์ง ๊ณ๋“ค์ธ

    ํ”„๋กœํ† ์ฝœ์ด๋ž€? ํ”„๋กœํ† ์ฝœ: ์ตœ์†Œํ•œ์œผ๋กœ ๊ฐ€์ ธ์•ผํ•  ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ํ•ด๋‹น Object๊ฐ€ task๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„ํ•ด์•ผํ•˜๋Š” ๊ฒƒ์„ ์ •์˜ํ•ด์ค€๋‹ค. Java์˜ interface์™€ ๋น„์Šทํ•œ ์—ญํ• ์„ ํ•œ๋‹ค. protocol์€ ์„ ์–ธ์ด๊ณ , type์—์„œ ๊ตฌํ˜„ํ•ด์ค˜์•ผํ•œ๋‹ค. ex1) Swift์—์„œ ์ œ๊ณตํ•˜๋Š” ํ”„๋กœํ† ์ฝœ ์˜ˆ์‹œ ์ค‘ ํ•˜๋‚˜์ธ CustomStringConvertible์„ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ •ํ•œ ํ‹€๋Œ€๋กœ class๋ฅผ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค. var greeting = "Hello, playground" class person: CustomStringConvertible { let name: String let age: Int let isFemale: Bool init(name: String, age: Int..

    [JavaScript] Truthy & Falsy

    Truthy: ์ฐธ์ด ์•„๋‹ˆ๋ผ ์ฐธ๊ฐ™์€ ๊ฐ’ Falsy: ๊ฑฐ์ง“์ด ์•„๋‹ˆ๋ผ ๊ฑฐ์ง“๊ฐ™์€ ๊ฐ’ ์ด๊ฒŒ ๋ฌด์Šจ ์†Œ๋ฆฌ์ธ๊ฐ€ ์˜ˆ์‹œ๋ฅผ ๋ณด์ž Truthy ex: {} ๋นˆ ๊ฐ์ฒด [] ๋นˆ ๋ฐฐ์—ด 0์„ ์ œ์™ธ ํ•œ ์ˆซ์ž๊ฐ’ ๋นˆ ๋ฌธ์ž์—ด์„ ์ œ์™ธํ•œ ๋ฌธ์ž์—ด Falsy ex: null defined 0 ๋นˆ ๋ฌธ์ž์—ด NaN ์˜ˆ์‹œ๋ฅผ ๋ณด๋‹ˆ๊น ๊ฐ์ด ์˜จ๋‹ค. ํŒŒ์ด์ฌ์—์„œ๋„ ๋นˆ ๋ฐฐ์—ด์ธ์ง€ ํ™•์ธํ•  ๋•Œ # python arr = [] if not arr: print("๋นˆ ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค.") else: print("๋นˆ ๋ฐฐ์—ด์ด ์•„๋‹™๋‹ˆ๋‹ค.") ์œ„ ์˜ˆ์‹œ์ฒ˜๋Ÿผ arr๋ฅผ true/false๋กœ ๋ฐ˜ํ™˜ํ•˜์—ฌ ํŒ๋‹จํ•˜๋Š”๋ฐ, ์ด๋Ÿฐ ๊ฑธ truthy/falsy๋ผ๊ณ  ํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ์œ„์˜ Python ์˜ˆ์‹œ๋ฅผ JavaScript๋กœ ๋ฐ”๊ฟ”๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. # JavaScript const arr = [] if (!a..

    [Algorithm] ํž™ | ์ตœ๋Œ€ ํž™, ์ตœ์†Œ ํž™

    heap์ด๋ž€? : ์šฐ์„  ์ˆœ์œ„ ํ(priority queue)๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ ์ค‘ ํ•˜๋‚˜๋กœ, ์™„์ „์ด์ง„ํŠธ๋ฆฌ๋ฅผ base๋กœ ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ. ์šฐ์„ ์ˆœ์œ„ ํ๋Š” ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์žฅ ๋จผ์ € ์‚ญ์ œํ•˜๋Š” ์ ์ด ํŠน์ง• ์ตœ์†Œ ํž™: ๋ถ€๋ชจ ๋…ธ๋“œ์˜ ํ‚ค ๊ฐ’์ด ์ž์‹ ๋…ธ๋“œ์˜ ํ‚ค ๊ฐ’๋ณด๋‹ค ํ•ญ์ƒ ์ž‘์€ ํž™ ์ตœ๋Œ€ ํž™: ๋ถ€๋ชจ ๋…ธ๋“œ์˜ ํ‚ค ๊ฐ’์ด ์ž์‹ ๋…ธ๋“œ์˜ ํ‚ค ๊ฐ’๋ณด๋‹ค ํ•ญ์ƒ ํฐ ํž™ ์ž๋ฃŒ๊ตฌ์กฐ ์ถ”์ถœ๋˜๋Š” ๋ฐ์ดํ„ฐ ์Šคํƒ(stack) ๊ฐ€์žฅ ๋‚˜์ค‘์— ์‚ฝ์ž…๋œ ๋ฐ์ดํ„ฐ ํ(queue) ๊ฐ€์žฅ ๋จผ์ € ์‚ฝ์ž…๋œ ๋ฐ์ดํ„ฐ ์šฐ์„ ์ˆœ์œ„ ํ(priority queue) ๊ฐ€์žฅ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋†’์€ ๋ฐ์ดํ„ฐ ์ตœ์†Œ ํž™ (min heap) : ๊ฐ’์ด ๊ฐ€์žฅ ๋‚ฎ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋จผ์ € ์‚ญ์ œ import heapq heap = [] heapq.heappush(heap, 5) heapq.heap..