JavaScript ๋™์ž‘ ์›๋ฆฌ :: ๋Ÿฐํƒ€์ž„ ๊ตฌ์„ฑ๊ณผ ๋น„๋™๊ธฐ ๋™์ž‘ (feat. ๋น„๋™๊ธฐ ์ฝœ๋ฐฑ)
์›น (WEB)/๊ณต๋ถ€ 2021. 4. 1. 21:56

JS ๋™์ž‘์›๋ฆฌ js๋Š” ์‹ฑ๊ธ€ ์“ฐ๋ ˆ๋“œ ๊ธฐ๋ฐ˜ ์–ธ์–ด์ด๋ฏ€๋กœ ํ˜ธ์ถœ ์Šคํƒ์ด ํ•˜๋‚˜๊ณ  ํ•œ ๋ฒˆ์— ํ•œ ์ž‘์—…๋งŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด์— ๋”ฐ๋ฅธ ๋ฌธ์ œ๋Š” ํ•˜๋‚˜์˜ ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ์— ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋ฉด ๋‹ค๋ฅธ ๋กœ์ง์ด ๋ฉˆ์ถฐ๋ฒ„๋ฆฐ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๋น„๋™๊ธฐ ์ฝœ๋ฐฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋Ÿฐํƒ€์ž„ js ๋Ÿฐํƒ€์ž„์€ JS์—”์ง„, web api, task queue, event loop, render queue๋กœ ๋˜์–ด์žˆ๋‹ค. ์—”์ง„ js ์—”์ง„์˜ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋Š” Google์˜ V8 ์—”์ง„์ด๋‹ค. Chrome๊ณผ Node.js์—์„œ ์ด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. memory heap : ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น call stack : ํ˜ธ์ถœ ์Šคํƒ ์œ„์˜ ๋‘๊ฐ€์ง€๋กœ ์—”์ง„์€ ๊ตฌ์„ฑ๋˜์–ด์žˆ๋‹ค. Web API DOM, Ajax, TimeOut ๋“ฑ์˜ Web API๊ฐ€ ์ž‡๋‹ค. Callstack์—์„œ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๊ฐ€ ..

React array state๊ฐ€ ๊ฐฑ์‹ ๋˜์–ด๋„ view๊ฐ€ ๋ฐ”๋€Œ์ง€ ์•Š์„ ๋•Œ
์›น (WEB)/์—๋Ÿฌํ•ด๊ฒฐ 2021. 3. 14. 20:22

React array state๊ฐ€ ๊ฐฑ์‹ ๋˜์–ด๋„ view๊ฐ€ ๋ฐ”๋€Œ์ง€ ์•Š์„ ๋•Œ const [members, setMembers] = useState([]); const deleteMember = (index: number) => { // member ์‚ญ์ œ const tmp = members; tmp.splice(index, 1); setMembers(tmp); } return( { members.map((member: string, index: number) => {member} } ); members๋ผ๋Š” Array state์˜ ๊ฐ’ ํ•˜๋‚˜๋ฅผ ์‚ญ์ œํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค. ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ด๋„ ํ‘œ์‹œ๋˜๋Š” ํ•™์ƒ์ด ๋ณ€ํ•˜์ง€ ์•Š๋Š” ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฐœ๋ฐœ์ž๋„๊ตฌ๋ฅผ ํ†ตํ•ด์„œ ๋ณด๋ฉด ๋ถ„๋ช… ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ์˜ members State๋Š” ๋ณ€๊ฒฝ๋˜..

[React] React ํ™˜๊ฒฝ๋ณ€์ˆ˜, ๊ฐœ๋ฐœ ๋ฐ ๋ฐฐํฌ ์‹œ์— ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ• ๊นŒ? (Docker, github action ์‚ฌ์šฉ ์‹œ)
์›น (WEB)/๊ณต๋ถ€ 2021. 3. 14. 11:59

React ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๋“ฑ๋ก ๊ธฐ์กด ๊ฐœ๋ฐœ ์‹œ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ React๋ฅผ ํ”„๋ก ํŠธ๋กœ ์‚ฌ์šฉํ•  ๋•Œ, ์ฝ”๋“œ ์‚ฌ์•„์—์„œ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ? ์ตœ์ƒ์œ„ ํด๋”์— .env ํŒŒ์ผ์„ ๋งŒ๋“ ๋‹ค. .env ํŒŒ์ผ์— REACT_APP์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•œ๋‹ค. REACT_APP_ADMIN_KEY=hi ์ฝ”๋“œ ์ƒ์—์„œ process.env.REACT_APP_ADMIN_KEY์™€ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ๊ฐ„ํŽธํ•˜๊ฒŒ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค! ๋ฐฐํฌ ์‹œ ํ•˜์ง€๋งŒ ์„œ๋น„์Šค๋ฅผ ์œ„ํ•œ build ํ›„์—๋Š” ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์ฝ์–ด๋“ค์ผ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— build์™€ ๋™์‹œ์— build์— ๋Œ€ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜(argument)๋กœ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์„ธํŒ…ํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค. NERA๋Š” github action์—์„œ docker/build-push-action@v1.1.0 ์ด๋ผ๋Š” action..

์ฟ ํ‚ค๊ฐ€ ๋ฐœ๊ธ‰๋˜์ง€ ์•Š์„ ๋•Œ, Access-Control-Allow-Origin ์˜ค๋ฅ˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•
์›น (WEB)/์—๋Ÿฌํ•ด๊ฒฐ 2021. 2. 6. 23:35

์ฟ ํ‚ค๊ฐ€ ๋ฐœ๊ธ‰๋˜์ง€ ์•Š์„ ๋•Œ KOS ํ”„๋กœ์ ํŠธ๋Š” ํ”„๋ก ํŠธ์—”๋“œ์— React.js๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์„œ๋ฒ„๋Š” go lang ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ gin์„ ์ด์šฉํ•˜์—ฌ ์ง„ํ–‰์ค‘์ด๋‹ค. ์ฒ˜์Œ์— api๋ฅผ ๋งŒ๋“ค๊ณ  ๋‚˜์„œ๋Š” postman์ด๋ผ๋Š” ํˆด๋กœ ์ œ๋Œ€๋กœ ๋™์ž‘ํ•˜๋Š”์ง€ ๊ฒ€์‚ฌํ•œ๋‹ค. ์ฒ˜์Œ์—๋Š” api์—ฐ๊ฒฐ์ด ์ˆœ์กฐ๋กญ๊ฒŒ ๋˜๋‹ค๊ฐ€ ๋กœ๊ทธ์ธ์„ ์œ„ํ•ด์„œ ์ฟ ํ‚ค๋ฅผ ๋ฐœ๊ธ‰ํ•˜๋Š” api๋ฅผ ์ž‘์„ฑํ•œ ์ดํ›„์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ์ฟ ํ‚ค๊ฐ€ ๋ฐœ๊ธ‰๋˜์ง€ ์•Š๋Š”๋‹ค. ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ๋ฐ›์€ Network๋„ 200์œผ๋กœ ์ •์ƒ์ด๊ณ  set-cookie๋˜๋Š” ๊ฒƒ๊นŒ์ง€ ๋ณด์ด๋ฉฐ response๋ฅผ ์ถœ๋ ฅํ•ด๋ณด์•„๋„ ์ •์ƒ์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์™œ ์ฟ ํ‚ค๊ฐ€ ๋ฐœ๊ธ‰๋˜์ง€ ์•Š์„๊นŒ? ๋ฐฑ์—”๋“œ์—์„œ ํ”„๋ก ํŠธ์—”๋“œ์— ์ฟ ํ‚ค๋ฅผ ์ €์žฅ์‹œํ‚ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ์–‘์ชฝ์˜ credential ์†์„ฑ์„ ๋ชจ๋‘ ON ํ•ด์ฃผ์–ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋จผ์ € ๋ฐฑ์—”๋“œ(go lang)์˜ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. // ..

Ajax์—์„œ ํ•„์š”ํ•œ SOP(Same Origin Policy), CORS(Cross-Origin Resource Sharing) ์ •๋ฆฌ
์›น (WEB)/๊ณต๋ถ€ 2021. 2. 6. 23:07

SOP, COP Same Origin Policy document ๊ฐ์ฒด๋Š” ์ถœ์‹ ์ธ origin์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , ์ด๋Š” js์—์„œ `document.location.origin`์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. document ๋‚ด์—์„œ ๋ฆฌ์†Œ์Šค๋“ค๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•  ๋•Œ, origin์ด ๋‹ค๋ฅด๋‹ค๋ฉด ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์— ์žˆ์–ด์„œ ์ œํ•œ์„ ๋‘๊ฒ ๋‹ค๋Š” ๊ฒƒ์ด SOP(Same Origin Policy)์ด๋‹ค. Origin ํŒ๋‹จ Origin์ด ๊ฐ™์€ ์ง€๋Š” Protocol, Host, Port๋กœ ํŒ๋‹จํ•˜๋Š”๋ฐ url ๊ตฌ์กฐ๋ฅผ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. http://localhost:3000 Protocol://Host:Port ์„ธ ๊ฐ€์ง€๊ฐ€ ๋ชจ๋‘ ๊ฐ™์œผ๋ฉด ๊ฐ™์€ Origin์ด๋ผ๊ณ  ํŒ๋‹จ๋˜๋Š” ๊ฒƒ์ด๋‹ค. IE๋Š” ์–‘์ชฝ ๋„๋ฉ”์ธ ๋ชจ๋‘ ๋†’์Œ ๋‹จ๊ณ„์˜ ๋ณด์•ˆ ์ˆ˜์ค€์ผ ๊ฒฝ์šฐ Same Origin ..

Ajax(Asynchronous Javascript And Xml)
์›น (WEB)/๊ณต๋ถ€ 2021. 2. 6. 23:04

Ajax๋Š” js๋ฅผ ์ด์šฉํ•œ ๋น„๋™๊ธฐ ํ†ต์‹ ์œผ๋กœ, ํด๋ผ์ด์–ธํŠธ ์„œ๋ฒ„ ๊ฐ„์˜ xml(Extensible Markup Language)๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๊ธฐ์ˆ ์ด๋‹ค. ์ „์ฒด ํŽ˜์ด์ง€๋ฅผ ๋ฆฌ๋กœ๋“œํ•˜์ง€ ์•Š๊ณ  ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. Ajax ๋ฐฉ์‹์„ ์ด์šฉํ•œ ์›น API๋Š” XMLHttpRequest ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ fetch๋ฅผ ๊ฑฐ์ณ axios๊นŒ์ง€ ๋‹ค์–‘ํ•˜๋‹ค. XMLHttpRequest๋Š” ๋ณต์žกํ•˜๊ณ  ๊ฐ€๋…์„ฑ์ด ๋–จ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— fetch api๊ฐ€ ES6์—์„œ๋ถ€ํ„ฐ ํ‘œ์ค€์ด ๋˜์—ˆ๋Š”๋ฐ, ๋”ฐ๋ผ์„œ ํ˜„์žฌ fetch api๋Š” ๊ธฐ๋ณธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋”ฐ๋กœ ์„ค์น˜ํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉํ•ด๋„ ๋œ๋‹ค. axios๋Š” Node.js์—์„œ XMLHttpRequests๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹๊ฒŒ ๋งŒ๋“ค์–ด๋‘” api์ด๋ฉฐ ๋”ฐ๋กœ ์„ค์น˜ํ•ด์ฃผ์–ด์•ผ ๋™์ž‘ํ•œ๋‹ค. TOP Ajax API๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉด ๋” ๋งŽ์€..

[ECMAScript] ES5, ES6 ๋ฌธ๋ฒ• ์ •๋ฆฌ
์›น (WEB)/๊ณต๋ถ€ 2021. 2. 3. 21:57

ECMAScript ๊ณต๋ถ€ ES5 ์ด์ „ ES3 (1999) : ์ •๊ทœํ‘œํ˜„์‹, try/catch๋ฌธ string string.length : ๊ธธ์ด ์†์„ฑ string.indexOf(string, [start]) : ํ•ด๋‹น ๊ธ€์ž์˜ ์‹œ์ž‘ index ์œ„์น˜ ๋ฐ˜ํ™˜ string.lastIndexOf(string, [start]) : ํ•ด๋‹น ๊ธ€์ž์˜ ๋งˆ์ง€๋ง‰ ์‹œ์ž‘ index ์œ„์น˜ ๋ฐ˜ํ™˜ string.search(string) : indexOf์™€ ๋น„์Šทํ•˜์ง€๋งŒ ์ •๊ทœํ‘œํ˜„์‹ ์‚ฌ์šฉ x string.slice(index, index2) : index๋ถ€ํ„ฐ index2-1๊นŒ์ง€ ์ž๋ฅด๊ธฐ ์Œ์ˆ˜ index๋Š” ๋’ค์—์„œ๋ถ€ํ„ฐ ์…ˆ string.substring(index, index2) : slice์™€ ๋น„์Šทํ•˜์ง€๋งŒ, ์Œ์ˆ˜ ๋ถˆ๊ฐ€ string.substr(index, l..

[go lang] api ๋™์‹œ ํ˜ธ์ถœ ์•ˆ๋˜๋Š” ์˜ค๋ฅ˜ ๊ฐœ์„ ํ•˜๊ธฐ :: No database selected error
์›น (WEB)/์—๋Ÿฌํ•ด๊ฒฐ 2021. 2. 3. 18:55

ํ”„๋ก ํŠธ์—์„œ 2๊ฐ€์ง€ ํ˜ธ์ถœ api๋ฅผ ๊ฐ™์€ ํ•จ์ˆ˜์— ๋‘๊ณ  ๋™์‹œ์— ํ˜ธ์ถœํ•˜์˜€๋”๋‹ˆ, ์„œ๋ฒ„์—์„œ ๋’ท ์ˆœ์„œ๋กœ ํ˜ธ์ถœ๋œ api ์‹คํ–‰ ์‹œ No database selecte error ๊ฐ€ ๋‚œ๋‹ค. ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• : gorm.DB์— ์žˆ๋Š” sql.DB์˜ SetMaxOpenConns ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•˜์—ฌ, ๋™์‹œ์— ํ—ˆ์šฉ ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€ ์ปค๋„ฅ์…˜ ๊ฐœ์ˆ˜๋ฅผ ์ œํ•œํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค. Config.DB, err = gorm.Open(mysql.Open(Config.DBURL(Config.BuildDBConfig())), &gorm.Config{}) if err != nil { fmt.Println("Status: ", err) return } // ์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค. db, err := Config.DB.DB() if err != nil { fmt.Print..