hanamon.kr์—์„œ ์ด๋ฏธ์ง€์ฐธ์กฐ

 

 

ORM์ด๋ž€?
ORM(Object Relational Mapping)์€ ๊ฐ์ฒด์™€ ๊ด€๊ณ„์™€์˜ ์„ค์ •์„ ์˜๋ฏธํ•œ๋‹ค.

๋” ์ž์„ธํžˆ ๋งํ•˜์ž๋ฉด, ๋งํ•˜๋Š” ๊ฐ์ฒด(Object)๋Š” OOP (Object_Oriented Programming)์˜ ๊ฐ์ฒด๋กœ ๊ตฌํ˜„๋˜๋Š” ํด๋ž˜์Šค์™€ RDB (Realational DataBase)์—์„œ ์“ฐ๋Š” ๋ฐ์ดํ„ฐ์ธ ํ…Œ์ด๋ธ”์„ ์ž๋™์„ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ํด๋ž˜์Šค์™€ ํ…Œ์ด๋ธ”์€ ์„œ๋กœ ํ˜ธํ™˜๊ฐ€๋Šฅ์„ฑ์„ ๋‘๊ณ  ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ์ด ์•„๋‹ˆ๊ธฐ๋•Œ๋ฌธ์— ์ผ์น˜ํ•˜์ง€ ์•Š๋Š”๋ฐ, ์ด๋ฅผ ORM์„ ํ†ตํ•ด ๊ฐ์ฒด ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ SQL๋ฌธ์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜์—ฌ ๋ถˆ์ผ์น˜๋ฅผ ํ•ด๊ฒฐํ•œ๋‹ค. 

 

 

ORM์˜ ์žฅ์ 

 

1. ๊ฐ์ฒด ์ œํ–ฅ์ ์ธ ์ฝ”๋“œ๋กœ ์ธํ•ด ๋” ์ง๊ด€์ ์ด๊ณ  ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ๋” ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ค€๋‹ค. 

  • ORM์„ ์ด์šฉํ•˜๋ฉด SQL๋ฌธ์ด ์•„๋‹Œ ์ง๊ด€์ ์ธ ์ฝ”๋“œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ž‘ํ•˜์—ฌ, ๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋‹ค. 
  • ์„ ์–ธ๋ฌธ, ํ• ๋‹น, ์ข…๋ฃŒ ๊ฐ™์€ ๋ถ€์ˆ˜์ ์ธ ์ฝ”๋“œ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. 
  • ๊ฐ์ข… ๊ฐ์ฒด์— ๋Œ€ํ•œ ์ฝ”๋“œ๋ฅผ ๋ณ„๋„๋กœ ์ž‘์„ฑํ•˜์—ฌ ๊ฐ€๋…์„ฑ์„ ๋†’์ผ ์ˆ˜ ์žˆ๋‹ค.
  • SQL์˜ ์ ˆ์ฐจ์ ์ด๊ณ  ์ˆœ์ฐจ์ ์ธ ์ ‘๊ทผ์œผ๋กœ ๊ฐ์ฒด์ง€ํ–ฅ์  ์ ‘๊ทผ๋งŒ ๊ณ ๋ ค๋˜์–ด ์ƒ์‚ฐ์„ฑ์ด ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

2. ์žฌ์‚ฌ์šฉ, ์œ ์ง€๋ณด์ˆ˜, ๋ฆฌํŒฉํ† ๋ง์ด ํŽธ๋ฆฌํ•˜๋‹ค. 

  • ORM์€ ๊ธฐ์กด ๊ฐ์ฒด์™€ ๋…๋ฆฝ์ ์œผ๋กœ ์ž‘์„ฑ๋˜์–ด ์žˆ์–ด, ํ•ด๋‹น ๊ฐ์ฒด๋“ค์€ ์žฌํ™œ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋งคํ•‘์ •๋ณด๊ฐ€ ๋ช…ํ™•ํ•˜์—ฌ ERD๋ฅผ ๋ณด๋Š” ์˜์กด๋„๋ฅผ ๋‚ฎ์ถœ ์ˆ˜ ์žˆ๋‹ค.

 

3. DRMS (DataBase Management System)์— ๋Œ€ํ•œ ์ข…์†์„ฑ์ด ์ค„์–ด๋“ ๋‹ค. 

  • ๋Œ€๋ถ€๋ถ„ ORM์†”๋ฃจ์…˜์€ DB์— ์ข…์†์ ์ด์ง€ ์•Š๋‹ค. (๊ตฌํ˜„๋ฐฉ๋ฒ•๊ณผ ๋งŽ์€ ์†”๋ฃจ์…˜, ์ž๋ฃŒํ˜• ํƒ€์ž…๊นŒ์ง€ ์ข…์†์ ์ด์ง€ ์•Š๋‹ค.)
  • ๊ฐœ๋ฐœ์ž๋Š” ๊ฐ์ฒด(Object)์— ์ง‘์ค‘ํ•จ์œผ๋กœ์„œ ๊ทน๋‹จ์ ์œผ๋กœ DBMS๋ฅผ ๊ต์ฒดํ•˜๋Š” ํฐ ์ž‘์—…์—๋„ ๋ฆฌ์Šคํฌ๊ฐ€ ์ ๊ณ  ์†Œ์š”์‹œ๊ฐ„๋„ ์ค„์–ด๋“ ๋‹ค. 
  • ์ž๋ฐ”์—์„œ ๊ฐ€๊ณตํ•  ๊ฒฝ์šฐ equals, hashCode์˜ ์˜ค๋ฒ„๋ผ์ด๋“œ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ด์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ๋น ๋ฅด๊ฒŒ ๊ฐ€๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

ORM์˜ ๋‹จ์ 

 

1. ORM์œผ๋กœ๋งŒ ์„œ๋น„์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์–ด๋ ต๋‹ค. 

  • ์‚ฌ์šฉํ•˜๊ธฐ๋Š” ํŽธ๋ฆฌํ•˜์ง€๋งŒ, ์„ค๊ณ„๋Š” ๋งค์šฐ ์‹ ์ค‘ํ•˜๊ฒŒ ํ•ด์•ผํ•œ๋‹ค. 
  • ํ”„๋กœ์ ํŠธ ๋ณต์žก์„ฑ์ด ์ปค์งˆ ๊ฒฝ์šฐ ๋‚œ์ด๋„ ๋˜ํ•œ ์˜ฌ๋ผ๊ฐ€๋ฉฐ, ๋ถ€์กฑํ•œ ์„ค๊ณ„๋กœ ์†๋„ ์ €ํ•˜๋‚˜ ์ผ๊ด€์„ฑ์„ ๋ฌด๋„ˆ๋œจ๋ฆฌ๋Š” ๋ฌธ์ œ์ ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.

 

2. ์ ˆ์ฐจ๊ฐ€ ๋งŽ์€ ์‹œ์Šคํ…œ์—๋Š” ORM์˜ ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ธ ์žฅ์ ์„ ํ™œ์šฉํ•˜๊ธฐ ์–ด๋ ต๋‹ค.

  • ์ ˆ์ฐจ๊ฐ€ ๋งŽ์€ ์‹œ์Šคํ…œ์—์„œ๋Š” ๋‹ค์‹œ ๊ฐ์ฒด๋กœ ๋ฐ”๊ฟ”์•ผํ•˜๋ฉฐ, ๊ทธ ๊ณผ์ •์—์„œ ์ƒ์‚ฐ์„ฑ ์ €ํ•˜ ๋˜๋Š” ๋ฆฌ์Šคํฌ๊ฐ€ ๋งŽ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

ORM๊ณผ Node.js ํ”„๋ ˆ์ž„์›Œํฌ

ORM์€ Node.js ์ถ”์ƒํ™”๊ณ„์ธต์˜ ๊ณ ๋ คํ•ด์•ผํ•  ๊ฐ€์žฅ ๋†’์€ ์ˆ˜์ค€์˜ ์ถ”์ƒํ™”์ด๋‹ค. ORM์˜ ์š”์ ์ฒ˜๋Ÿผ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฐ์ฒด์— ๋งคํ•‘ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. Node.js ORM, Sequelize๋Š” Postgres, MySQL, MariaDB, SQLite ๋“ฑ์„ ์ง€์›ํ•˜๋Š” Promize์— ๊ธฐ๋ฐ˜ํ•œ ๋น„๋™๊ธฐ๋กœ ๋™์ž‘ํ•œ๋‹ค.

 

 

 

 

์•„๋ž˜์˜ ๋ธ”๋กœ๊ทธ๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 

https://yceffort.kr/2021/07/dont-use-nodjs-orm

 

Home

yceffort

yceffort.kr

 

Node.js ํ”„๋กœ์ ํŠธ๋ฅผ 

ํ™œ์„ฑํ™”์‹œํ‚ค๋ฉด์„œ ์ž๋™์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ง€๋Š”

"package.json"

์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ณ ์ž ํ•œ๋‹ค.


npm ์ด๋ž€?

 

npm์€ Node Package Manager์˜ ์•ฝ์–ด๋กœ, ๋ช…์นญ ๊ทธ๋Œ€๋กœ ๋…ธ๋“œ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €์ด๋‹ค.

 

๋…ธ๋“œ๊ฐ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ”„๋กœ๊ทธ๋žจ์„ ์ปดํ“จํ„ฐ์—์„œ๋„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค. 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ”„๋กœ๊ทธ๋žจ์€ ํŒจํ‚ค์ง€๋กœ npm์— ๋“ฑ๋ก๋˜์–ด ์žˆ์œผ๋ฉฐ

ํŠน์ • ๊ธฐ๋Šฅ์˜ ํŒจํ‚ค์ง€๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด npm ์—์„œ ์ฐพ์•„ ์„ค์น˜ํ•˜๋ฉด ๋œ๋‹ค.

 

 

 

package.json

ํ”„๋กœ์ ํŠธ์— ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋ฅผ ์ถ”๊ฐ€ํ•˜๋‹ค๋ณด๋ฉด ํŒจํ‚ค์ง€๊ฐ€ ์–ด๋งˆ์–ด๋งˆํ•ด์ง„๋‹ค.
์‚ฌ์šฉํ•˜๋Š” ํŒจํ‚ค์ง€๋Š” ์ €๋งˆ๋‹ค ๊ณ ์œ ํ•œ ๋ฒ„์ „์ด ์žˆ์œผ๋ฉฐ,
๋™์ผํ•œ ๋ฒ„์ „์„ ์„ค์น˜ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ์ˆ˜ ์žˆ๋‹ค. 

์ด๋•Œ ์„ค์น˜ํ•œ ํŒจํ‚ค์ง€์˜ ๋ฒ„์ „์„ ๊ด€๋ฆฌํ•˜๋Š” ํŒŒ์ผ์„
package.json ์ด๋ผ๊ณ  ํ•œ๋‹ค.

 

 

 

package.json ์„ค์น˜ํ•˜๊ธฐ

ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ํด๋” ๋‚ด๋ถ€์— ๋ฌด์กฐ๊ฑด package.json๋ถ€ํ„ฐ ๋งŒ๋“ค๊ณ  ์‹œ์ž‘ํ•ด์•ผ ํ•œ๋‹ค!

npm init -y

* -y : ๋ชจ๋“  ํ•ญ๋ชฉ์— Yes๋ฅผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

ํ”„๋กœ์ ํŠธ ์ด๋ฆ„, ์„ค๋ช… ๋“ฑ์„ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, 

'npm init'๋กœ ์‹คํ–‰์‹œํ‚ค๊ณ  ์ฝ˜์†”์ฐฝ์—์„œ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

์•„๋ž˜์˜ ํ˜•์‹์œผ๋กœ package.json ๋ฏธ๋ฆฌ๋ณด๊ธฐ๊ฐ€ ๋‚˜์˜จ๋‹ค.

{
  "name": "ํ”„๋กœ์ ํŠธ ์ด๋ฆ„",
  "version": "ํ”„๋กœ์ ํŠธ ๋ฒ„์ „",
  "description": "ํ”„๋กœ์ ํŠธ ์„ค๋ช…",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "์ž‘์„ฑ์ž ์ด๋ฆ„",
  "license": "ISC",
  }
}

 

 

 

package.json ์ž‘์„ฑ์‹œ ์•Œ์•„๋‘๊ธฐ

package name :

ํŒจํ‚ค์ง€ ์ด๋ฆ„์œผ๋กœ Package.json์˜ name ์†์„ฑ์— ์ €์žฅ๋œ๋‹ค. 

 

version :

ํŒจํ‚ค์ง€ ๋ฒ„์ „์€ SemVer์˜ ๋ฐฉ์‹์˜ ๋ฒ„์ „ ๋„˜๋ฒ„๋ง์„ ๋”ฐ๋ผ ํ•ญ์ƒ ์„ธ์ž๋ฆฌ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. 

 

package.json์— ๊ฐ€์žฅ ์ค‘์š”ํ•œ ํ•ญ๋ชฉ์€ "name" ๊ณผ "version" ์ด๋‹ค.

์ด 2๊ฐ€์ง€ ํ•ญ๋ชฉ์„ ํ†ตํ•ด ํŒจํ‚ค์ง€ ๊ณ ์œ ์„ฑ์„ ํŒ๋ณ„ํ•˜๊ฒŒ ๋œ๋‹ค.

ํ•„์ˆ˜ ํ•ญ๋ชฉ์ด๋ฉฐ, ํ•ด๋‹น ๋‚ด์šฉ์ด ์—†์œผ๋ฉด ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ ํ•  ์ˆ˜ ์—†๋‹ค.

 

 

description :

๋ฌธ์ž์—ด๋กœ ๊ธฐ์ž…ํ•ด์•ผํ•˜๋ฉฐ, 

npm search๋กœ ๊ฒ€์ƒ‰๋œ ๋ฆฌ์ŠคํŠธ์— ํ‘œ์‹œ๋˜์–ด ๋งŒ๋“ค์–ด์ง„ ํŒจํ‚ค์ง€๋ฅผ ์ฐพ๊ณ  ์ดํ•ดํ•˜๋Š” ๋„์›€์„ ์ค€๋‹ค. 

 

entry point :

์ž๋ฐ”์Šคํฌ๋ฆผํŠธ ์‹คํ–‰ํŒŒ์ผ ์ง„์ž…์ . ๋ณดํ†ต ๋งˆ์ง€๋ง‰์œผ๋กœ module.exports๋ฅผ ํ•˜๋Š” ํŒŒ์ผ์„ ์ง€์ •ํ•œ๋‹ค. 

package.json์˜ main์†์„ฑ์— ์ €์žฅ๋œ๋‹ค.

 

test commend

์ฝ”๋“œ ํ…Œ์ŠคํŠธ ์‹œ ์ž…๋ ฅํ•˜๋Š” ๋ช…๋ น์–ด๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

package.json scripts ์†์„ฑ์•ˆ์˜ test ์†์„ฑ์— ์ €์žฅ๋œ๋‹ค.

 

git repository :

์ฝ”๋“œ๋ฅผ ์ €์žฅํ•ด๋‘” ๊นƒ ์ €์žฅ์†Œ ์ฃผ์†Œ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

์†Œ์Šค์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋ฉด ์‚ฌ์šฉ์ž๋“ค์ด ์ด ์ €์žฅ์†Œ์— ๋ฐฉ๋ฌธ์— ๋ฌธ์ œ๋ฅผ ์ œ๊ธฐํ•˜๊ฑฐ๋‚˜

์ฝ”๋“œ ์ˆ˜์ •๋ณธ์„ ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋‹ค. package.json repository ์†์„ฑ์— ์ €์žฅ๋œ๋‹ค.

 

keywords : ํ‚ค์›Œ๋“œ๋ฅผ ๋ฌธ์ž์—ด ๋ฐฐ์—ด๋กœ ์„ค๋ช…๋˜๋ฉฐ,

npm search๋กœ ๊ฒ€์ƒ‰๋œ ๋ฆฌ์ŠคํŠธ์— ํ‘œ์‹œ๋˜์–ด ๋งŒ๋“ค์–ด์ง„ ํŒจํ‚ค์ง€๋ฅผ ์ฐพ๊ณ  ์ดํ•ดํ•˜๋Š” ๋„์›€์„ ์ค€๋‹ค.

 

bugs :

ํ”„๋กœ์ ํŠธ์˜ ์ด์Šˆ์™€ ๋ฒ„๊ทธ ํŠธ๋ ˆํ‚น์„ ๋ณผ์ˆ˜์žˆ๋Š” url ๋˜๋Š” ์ด์Šˆ๋ฅผ ์•Œ๋ฆด email ์ฃผ์†Œ๋ฅผ ์ž…๋ ฅํ•œ๋‹ค. 

ํŒจํ‚ค์ง€ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ์‹œ ๋„์›€์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

 

 license

ํŒจํ‚ค์ง€ ์‚ฌ์šฉ์ž๋“ค์ด ๋งŒ๋“ค์–ด์ง„ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ป๊ฒŒ ๊ถŒํ•œ์„ ์–ป๊ณ ,

์–ด๋–ค ๊ธˆ๊ธฐ ์‚ฌํ•ญ์ด ์žˆ๋Š”์ง€ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ๋ผ์ด์„ผ์Šค๋ฅผ ๋ช…์‹œํ•ด์•ผ ํ•œ๋‹ค. 

 

dependencies :

ํŒจํ‚ค์ง€ ์„ค์น˜์‹œ, ํŒจํ‚ค์ง€ ์ด๋ฆ„๊ณผ ํ•จ๊ป˜ ์„ค์น˜๋œ ๋ฒ„์ „์ด ์ €์žฅ๋œ๋‹ค.  

 

devDenpendencies :

ํŒจํ‚ค์ง€ ๋ชจ๋“ˆ์„ ์ด์šฉํ•˜๋Š” ์‚ฌ๋žŒ์ด๋ผ๋ฉด, ํŒจํ‚ค์ง€ ํ…Œ์ŠคํŠธ ๋ฐ ๋ฌธ์„œ ์ž‘์„ฑ์— ์‚ฌ์šฉ๋˜๋Š”

์™ธ๋ถ€ ํ”„๋ ˆ์ž„ ์›Œํฌ๋Š” ๋‹ค์šด๋กœ๋“œ๋ฅผ ์›ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค. 

์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ, devDependencies ๊ฐ์ฒด์— ๋””ํŽœ๋˜์‹œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋‹ค.  

 

 

 

 

๋” ์ž์„ธํ•œ ์‚ฌํ•ญ์€ ์•„๋ž˜์˜ ๋งํฌ๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.

https://docs.npmjs.com/cli/v8/configuring-npm/package-json

 

 

JavaScript์—์„œ ES ๋ž€?

ECMASCRIPT์˜ ์•ฝ์–ด๋ฅผ ๋œปํ•˜๋ฉฐ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํ‘œ์ค€, ๊ทœ๊ฒฉ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์šฉ์–ด์ด๋‹ค.

 

๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ํ‘œ์ค€ํ™”๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํ•„์š”ํ•ด์ง€๋ฉด์„œ

๋น„์˜๋ฆฌ ํ‘œ์ค€ํ™” ๊ธฐ๊ตฌ์ธ ECMA ์ธํ„ฐ๋„ค์…”๋„์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ํ‘œ์ค€ํ™”๋ฅผ ์š”์ฒญํ•˜์˜€๋‹ค.

 

ES5 ๋Š” 2009๋…„๋„์— HTML5์™€ ํ•จ๊ป˜ ์ถœ์—ฐํ•œ ํ‘œ์ค€ ์‚ฌ์–‘์ด๋ฉฐ,

ES6๋Š” 2015๋…„์— ๋ฒ„์ „์—…์„ํ•˜์—ฌ ์ถœ์‹œํ•œ ๋ฒ„์ „์ด๋‹ค. 

ES6 ์ดํ›„๋กœ๋„ ๋งค๋…„ ์—…๋ฐ์ดํŠธ๊ฐ€ ๋˜๊ณ  ์žˆ๊ณ , ์ดํ›„๋ฅผ '๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ'๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

 

์•„๋ž˜์—๋Š” ES6์— ํฌํ•จ๋œ

let, const ํ‚ค์›Œ๋“œ /  ํ™”์‚ดํ‘œ ํ•จ์ˆ˜ / ํด๋ž˜์Šค / ๋ชจ๋“ˆ ๋‹ค๋ฃจ๊ณ  ์žˆ๋‹ค.

 

 


 

 

let, const ํ‚ค์›Œ๋“œ

ES5

ES5์˜ ๋ณ€์ˆ˜ ์„ ์–ธ ๋ฐฉ๋ฒ•์€ var๊ฐ€ ์œ ์ผํ•˜๋‹ค.

 

var :  ์„ ์–ธ๊ณผ ์ดˆ๊ธฐํ™”๊ฐ€ ๋™์‹œ์— ์‹คํ–‰ 

 

๋‹จ์ : 

ํ•จ์ˆ˜ ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„ ์ง€์› → ์ง€์—ญ๋ณ€์ˆ˜๋ฅผ ์ „์—ญ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉ๋‚จ๋ฐœ

varํ‚ค์›Œ๋“œ ์ƒ๋žต ํ—ˆ์šฉ → ์•”๋ฌต์  ์ „์—ญ๋ณ€์ˆ˜ ์–‘์‚ฐ

๋ณ€์ˆ˜ ์ค‘๋ณต ์„ ์–ธ ํ—ˆ์šฉ ๋ณ€์ˆ˜๊ฐ’์˜ ์˜๋„์น˜ ์•Š์€ ๋ณ€๊ฒฝ

๋ณ€์ˆ˜ ํ˜ธ์ด์ŠคํŒ…  → ์„ ์–ธํ•˜๊ธฐ ์ด์ „์— ์ฐธ์กฐ

 

 

ES6

 var ํ‚ค์›Œ๋“œ์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•˜๊ธฐ์œ„ํ•ด

let๊ณผ const ํ‚ค์›Œ๋“œ๊ฐ€ ๋„์ž…๋˜์—ˆ๋‹ค. 

 

const : ์ƒ์ˆ˜(๋ณ€ํ•˜์ง€ ์•Š๋Š” ๊ฐ’, ์žฌํ• ๋‹น x)

let : ์žฌํ• ๋‹น์ด ๊ฐ€๋Šฅํ•œ ๊ฐ’

 

๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„ ์ง€์—ญ๋ณ€์ˆ˜{ } ์—์„œ ์‚ฌ์šฉ๋œ ๋ณ€์ˆ˜๋Š” ์ฝ”๋“œ ๋ธ”๋กœ๋‚ด์—์„œ๋งŒ ์œ ํšจ

๋ณ€์ˆ˜ ์ค‘๋ณต ์„ ์–ธ ๊ธˆ์ง€ →  ์ค‘๋ณต ์„ ์–ธ์‹œ, ๋ฌธ๋ฒ•์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒ

ํ˜ธ์ด์ŠคํŒ… ๋ณ€์ˆ˜ ์„ ์–ธ ์ด์ „์—๋Š” ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋‹ค. 

 

๋ณ€์ˆ˜ ์„ ์–ธ์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ const๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , 

let์€ ์žฌํ• ๋‹น์ด ํ•„์š”ํ•œ ๊ฒฝ์›จ ํ•œ์ •ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. 

 

์ „์—ญ ๋ณ€์ˆ˜ (Global scope)
์ „์—ญ์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜์ด๋ฉฐ, ์–ด๋””์—์„œ๋“ ์ง€ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค. 

์ง€์—ญ ๋ณ€์ˆ˜ (Local scope of Function-level scope)
์ง€์—ญ(ํ•จ์ˆ˜) ๋‚ด์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜์ด๋ฉฐ, ๊ทธ ์ง€์—ญ๊ณผ ๊ทธ์ง€์—ญ์˜ ํ•˜๋ถ€์ง€์—ญ์—์„œ๋งŒ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.
ํ•จ์ˆ˜ ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„ (Function-level scope) 
ํ•จ์ˆ˜ ๋‚ด์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ํ•จ์ˆ˜ ๋‚ด์—์„œ๋งŒ ์œ ํšจ, ํ•จ์ˆ˜ ์™ธ๋ถ€์—์„œ๋Š” ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋‹ค. 
์ฆ‰, ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์„ ์–ธ๋ณ€์ˆ˜๋Š” ์ง€์—ญ๋ณ€์ˆ˜ / ํ•จ์ˆ˜ ์™ธ๋ถ€์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ์ „์—ญ  ๋ณ€์ˆ˜

๋ธ”๋ก ๋ ˆ๋ฒจ ์Šค์ฝ”ํ”„ (Block-level scope)
๋ชจ๋“  ์ฝ”๋“œ ๋ธ”๋ก(ํ•จ์ˆ˜ if๋ฌธ, for๋ฌธ, while๋ฌธ, try/catch ๋ฌธ ๋“ฑ)๋‚ด์—์„œ ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋Š” ์ฝ”๋“œ ๋ถˆ๋ก ๋‚ด์—์„œ๋งŒ ์œ ํšจ, 
์ฝ”๋“œ ๋ธ”๋ก ์™ธ๋ถ€์—์„œ๋Š” 

 

 

 

ํ™”์‚ดํ‘œ ํ•จ์ˆ˜(Arrow function)์˜ ์„ ์–ธ

 

ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” functionํ‚ค์›Œ๋“œ ๋Œ€์‹  (=>)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•œ๋‹ค.

// ๋งค๊ฐœ๋ณ€์ˆ˜ ์ง€์ • ๋ฐฉ๋ฒ•
    () => { ... } // ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์„ ๊ฒฝ์šฐ
     x => { ... } // ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ํ•œ ๊ฐœ์ธ ๊ฒฝ์šฐ, ์†Œ๊ด„ํ˜ธ๋ฅผ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๋‹ค.
(x, y) => { ... } // ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ์ธ ๊ฒฝ์šฐ, ์†Œ๊ด„ํ˜ธ๋ฅผ ์ƒ๋žตํ•  ์ˆ˜ ์—†๋‹ค.

 

ES5๋ณด๋‹ค  ES6์˜ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” ์ข€๋” ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ‘œํ˜„๋œ๋‹ค.

// ES5
var pow = function (x) { return x * x; };
console.log(pow(10)); // 100

// ES6
const pow = x => x * x;
console.log(pow(10)); // 100

๊ธฐ์กด์˜ ํ•จ์ˆ˜์™€ this ๋ฐ”์ธ๋”ฉ์ด ๋‹ค๋ฅด๋ฉฐ,

Lexical this๋ฅผ ์ง€์›ํ•˜๋ฏ€๋กœ ์ฝœ๋ฐฑํ•จ์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ํŽธ๋ฆฌํ•˜๋‹ค.

(์ด ๋ถ€๋ถ„์€ ์ถ”๊ฐ€์ ์œผ๋กœ ๊ณต๋ถ€๊ฐ€ ํ•„์š”ํ•  ๊ฒƒ๊ฐ™๋‹ค.)

 

 

 

ํด๋ž˜์Šค(Class)

ES5

์ƒ์„ฑ์ž ํ•จ์ˆ˜์™€ ํ”„๋กœํ† ํƒ€์ž…, ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ

๊ฐ์ฒด ์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

 

// ES5
var Person = (function () {
  // Constructor
  function Person(name) {
    this._name = name;
  }

  // public method
  Person.prototype.sayHi = function () {
    console.log('Hi! ' + this._name);
  };

  // return constructor
  return Person;
}());

var me = new Person('Lee');
me.sayHi(); // Hi! Lee.

console.log(me instanceof Person); // true

 

 

ES6

๊ธฐ์กด ๋ฐฉ์‹๋ณด๋‹ค ๋‹จ์ˆœ๋ช…๋ฃŒํ•œ ์ƒˆ๋กœ์šด ๋ฌธ๋ฒ•์œผ๋กœ Classํ•จ์ˆ˜๊ฐ€ ์ถ”๊ฐ€ ๋˜์—ˆ๋‹ค.

 

// ํด๋ž˜์Šค ์„ ์–ธ๋ฌธ
class Person {
  // constructor(์ƒ์„ฑ์ž)
  constructor(name) {
    this._name = name;
  }

  sayHi() {
    console.log(`Hi! ${this._name}`);
  }
}

// ์ธ์Šคํ„ด์Šค ์ƒ์„ฑ
const me = new Person('Lee');
me.sayHi(); // Hi! Lee

console.log(me instanceof Person); // true

(๋””ํ…Œ์ผํ•œ ๋‚ด์šฉ์€ ์ถ”๊ฐ€ ๊ณต๋ถ€๊ฐ€ ํ•„์š”ํ• ๊ฒƒ๊ฐ™๋‹ค.)

 

 

 

๋ชจ๋“ˆ (Module)

๋ชจ๋“ˆ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฐœ๋ณ„์  ์š”์†Œ๋กœ์„œ ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ ์กฐ๊ฐ์„ ๋งํ•œ๋‹ค. 

๋ชจ๋“ˆ์€ ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ์บก์Šํ™”ํ•˜๊ณ  ๊ณต๊ฐœ๊ฐ€ ํ•„์š”ํ•œ API๋งŒ์„ ์™ธ๋ถ€์— ๋…ธ์ถœํ•œ๋‹ค.

 

๋ชจ๋“ˆ์€ ํŒŒ์ผ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์œผ๋ฉฐ ํ•„์š”์— ๋”ฐ๋ผ ๋ชจ๋“ˆ์„ ๋กœ๋“œํ•˜์—ฌ ์žฌ์‚ฌ์šฉํ•œ๋‹ค. 

 

script ํƒœ๊ทธ์— type="module" ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ชจ๋“ˆ๋กœ์„œ ๋™์ž‘ํ•œ๋‹ค. 

ES6 ๋ชจ๋“ˆ์˜ ํŒŒ์ผ ํ™•์žฅ์ž๋Š” ๋ชจ๋“ˆ์ž„์„ ๋ช…ํ™•ํ•˜๊ธฐ ์œ„ํ•ด mjs๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ๊ถŒ์žฅํ•œ๋‹ค.

<script type="module" src="lib.mjs"></script>
<script type="module" src="app.mjs"></script>

 

๋ชจ๋“ˆ์€ ๋ชจ๋“ˆ ์Šค์ฝ”ํ”„๋ฅผ ๊ฐ€์ง„๋‹ค. 

๋ชจ๋“ˆ ๋‚ด์—์„œ var ํ‚ค์›๋“œ๋กœ ์„ ์–ธํ•œ ๋ณ€์ˆ˜๋Š” ๋”์ด์ƒ ์ „์—ญ ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ฉฐ

window ๊ฐ์ฒด ํ”„๋กœํผ๋””๋„ ์•„๋‹ˆ๋‹ค.

// foo.mjs
var x = 'foo';

console.log(x); // foo
// ๋ณ€์ˆ˜ x๋Š” ์ „์—ญ ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ฉฐ window ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋„ ์•„๋‹ˆ๋‹ค.
console.log(window.x); // undefined
// bar.mjs
// ๋ณ€์ˆ˜ x๋Š” foo.mjs์—์„œ ์„ ์–ธํ•œ ๋ณ€์ˆ˜ x์™€ ์Šค์ฝ”ํ”„๊ฐ€ ๋‹ค๋ฅธ ๋ณ€์ˆ˜์ด๋‹ค.
var x = 'bar';

console.log(x); // bar
// ๋ณ€์ˆ˜ x๋Š” ์ „์—ญ ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ฉฐ window ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ๋„ ์•„๋‹ˆ๋‹ค.
console.log(window.x); // undefined
<!DOCTYPE html>
<html>
<body>
  <script type="module" src="foo.mjs"></script>
  <script type="module" src="bar.mjs"></script>
</body>
</html>

 

 

Export: ์™ธ๋ถ€์— ๊ณต๊ฐœํ•˜์—ฌ ๋‹ค๋ฅธ ๋ชจ๋“ˆ๋“ค์ด ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๊ฒŒํ•œ๋‹ค.

// lib.mjs
const pi = Math.PI;

function square(x) {
  return x * x;
}

class Person {
  constructor(name) {
    this.name = name;
  }
}

// ๋ณ€์ˆ˜, ํ•จ์ˆ˜ ํด๋ž˜์Šค๋ฅผ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋กœ ๊ตฌ์„ฑํ•˜์—ฌ ๊ณต๊ฐœ
export { pi, square, Person };

 

 

Import: ๋ชจ๋“ˆ์—์„œ ๊ณต๊ฐœํ•œ (export)ํ•œ ๋Œ€์ƒ์„ ๋กœ๋“œํ•˜๋ ค๋ฉด import ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

์•„๋ž˜์˜ import 3๊ฐ€์ง€ ๋ฐฉ์‹์„ ์ฐธ๊ณ ํ•  ์ˆ˜ ์žˆ๋‹ค.

// app.mjs
// ๊ฐ™์€ ํด๋” ๋‚ด์˜ lib.mjs ๋ชจ๋“ˆ์„ ๋กœ๋“œ.
// lib.mjs ๋ชจ๋“ˆ์ด exportํ•œ ์‹๋ณ„์ž๋กœ importํ•œ๋‹ค.
// ES6 ๋ชจ๋“ˆ์˜ ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ ์ƒ๋žตํ•  ์ˆ˜ ์—†๋‹ค.
import { pi, square, Person } from './lib.mjs';                      // import ์ฒซ๋ฒˆ์งธ ๋ฐฉ์‹
import * as lib from './lib.mjs';                                    // import ๋‘๋ฒˆ์งธ ๋ฐฉ์‹
import { pi as PI, square as sq, Person as P } from './lib.mjs';     // import ์„ธ๋ฒˆ์งธ ๋ฐฉ์‹

console.log(pi);         // 3.141592653589793
console.log(square(10)); // 100
console.log(new Person('Lee')); // Person { name: 'Lee' }

 

 

<์ฐธ๊ณ ์šฉ>

lib.mjs / app.mjs / html ์—์„œ import์™€ export ๋™์ž‘ ์‚ฌ์šฉ๋ฐฉ๋ฒ• 

// lib.mjs
export default x => x * x;
// app.mjs
// ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ๋Š” ๋ชจ๋“ˆ์˜ ํŒŒ์ผ ํ™•์žฅ์ž๋ฅผ ์ƒ๋žตํ•  ์ˆ˜ ์—†๋‹ค.
// ๋ชจ๋“ˆ์˜ ํŒŒ์ผ ํ™•์žฅ์ž๋Š” .mjs๋ฅผ ๊ถŒ์žฅํ•œ๋‹ค.
import square from './lib.mjs';

console.log(square(10)); // 100
<!DOCTYPE html>
<html>
<body>
  <script type="module" src="./lib.js"></script>
  <script type="module" src="./app.js"></script>
</body>
</html>

 

 

'์˜ค๋Š˜์˜ ๊ณ„์ ˆ, ์˜ค๋Š˜์˜ ๋…ธ๋ž˜' ๋ผ๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ

JWT๋ฐฉ์‹์œผ๋กœ ๋กœ๊ทธ์ธ+ํšŒ์›๊ฐ€์ž…์„  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•ด๋ณด์•˜์ง€๋งŒ, 

JWT์™€ ์นœํ•ด์ง€์ง€ ์•Š์•„ ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ธฐ๋กœ ํ•ด๋ณด์•˜๋‹ค.

 


JWT ๋Š” ๋ฌด์—‡์ผ๊นŒ?

JWT๋Š” JSON Web Token์˜ ์•ฝ์ž๋กœ ์ „์ž ์„œ๋ช… ๋œ URL-safe (URL๋กœ ์ด์šฉํ•  ์ˆ˜์žˆ๋Š” ๋ฌธ์ž ๋งŒ ๊ตฌ์„ฑ๋œ)์˜ JSON์ž…๋‹ˆ๋‹ค.

 

 

JWS (Jason Web Signature) : JSON์„ ์•”ํ˜ธํ™”ํ•˜์—ฌ URL-safe ๋ฌธ์ž์—ด๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ

JWE (Jason Web Encryption) : JSON ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•”ํ˜ธํ™” ๋ฐฉ๋ฒ•

*URL Safe : URL์— ํฌํ•จ ํ•  ์ˆ˜ ์—†๋Š” ๋ฌธ์ž๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ๊ฒƒ

 

 

 

JWT ํ† ํฐ ๊ตฌ์„ฑ

JWT ํ† ํฐ ๊ตฌ์„ฑ์€ ํ—ค์–ด(header) + ํŽ˜์ด๋กœ๋“œ(payload) + ์„œ๋ช…(Signature)๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ,

๊ฐ ๋ถ€๋ถ„์€  Base64๋กœ ์ธ์ฝ”๋”ฉ ๋˜์–ด ํ‘œํ˜„๋œ๋‹ค. 

 

ํ—ค์–ด(header) : ํ† ํฐ์˜ ์œ ํ˜• (JWT) +  HMAC, HS256(SHA256) ๋˜๋Š” RSA์™€ ๊ฐ™์€ ํ•ด์‹œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

ํŽ˜์ด๋กœ๋“œ(payload) : ํ† ํฐ์— ๋‹ด์„ (name/value)๋ฅผ ํ•œ์Œ์œผ๋กœ ์ด๋ฃฌ ํด๋ ˆ์ž„(claim)์ •๋ณด๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. 
                                   ํด๋ ˆ์ž„ ์ •๋ณด๋Š” ๋“ฑ๋ก๋œ ํด๋ ˆ์ž„, ๊ณต๊ฐœ ํด๋ ˆ์ž„, ๋น„๊ณต๊ฐœ ํด๋ ˆ์ž„์œผ๋กœ ๋‚˜๋‰œ๋‹ค.

์„œ๋ช…(Signature) : secret key๋ฅผ ํฌํ•จํ•˜์—ฌ ์•”ํ˜ธํ™” ๋˜์–ด์žˆ๋‹ค.

 

 

JWT Process 

- ํด๋ผ์ด์–ธํŠธ์˜ ๋กœ๊ทธ์ธ ์ •๋ณด๋ฅผ ์„œ๋ฒ„์— ์ €์žฅํ•˜์ง€ ์•Š์•„, ํ† ํฐ๊ธฐ๋ฐ˜ ์ธ์ฆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•œ๋‹ค.

- ๋กœ๊ทธ์•„์›ƒ ์‹œ, ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€ ์ €์žฅ๋œ JWT ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค.

 

 

 JWT์˜ ์ ์šฉ

  • ํšŒ์›์ธ์ฆ : JWT์˜ ๊ฐ€์žฅ ํ”ํ•œ ๋ฐฉ๋ฒ• 
  • ์ •๋ณด๊ต๋ฅ˜ : ๋‘ ๊ฐœ์ฒด ์‚ฌ์ด์—์„œ ์•ˆ์ •์„ฑ์žˆ๊ฒŒ ์ •๋ณด๋ฅผ ๊ตํ™˜ํ•˜๊ธฐ์— ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋‹ค.  
                    ์ •๋ณด๊ฐ€ ์„œ๋ช…๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ณด๋‚ธ์ด๊ฐ€ ๋ฐ”๋€Œ์ง„ ์•Š์•˜๋Š”์ง€ ๋„์ค‘์— ์กฐ์ž‘๋˜์ง€ ์•Š์•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

JWT ์žฅ์   

  • ์‚ฌ์šฉ์ž ์ธ์ฆ์— ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๋Š” ํ† ํฐ ์ž์ฒด์— ํฌํ•จ๋˜์–ด ๋ณ„๋„ ์ธ์ฆ ์ €์žฅ์†Œ๊ฐ€ ํ•„์š”์—†๋‹ค.
  • ๋””๋ฒ„๊น… ๋ฐ ๊ด€๋ฆฌ๊ฐ€ ์šฉ์ดํ•˜๋‹ค.
  • ํŠธ๋ž˜ํ”ฝ ๋ถ€๋‹ด์ด ๋‚ฎ๋‹ค.    
  • ๋…๋ฆฝ์ ์ธ JWT

 

JWT ๋‹จ์  

  • ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ• ์ˆ˜๋ก ํ† ํฐ์ด ์ปค์ ธ ๋„คํŠธ์›Œํฌ ๋ถ€ํ•˜๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋‹ค. 
  • JWT๋Š” ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š์•„ ์ œ์–ด๊ฐ€ ์–ด๋ ต๋‹ค. 
  • ์ž„์˜๋กœ ํ† ํฐ์„ ์‚ญ์ œํ•  ์ˆ˜ ์—†์–ด 'ํ† ํฐ ๋งŒ๋ฃŒ ์‹œ๊ฐ„'์„ ๊ผญ ๋„ฃ์–ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.
  • Payload ๋Š” ์•”ํ˜ธํ™” ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์—
  • JWE๋ฅผ ์•”ํ˜ธํ™” ํ•˜๊ฑฐ๋‚˜ Payload์— ์ค‘์š”ํ•œ ๋ฐ์ž‰ํ„ฐ๋ฅผ ๋„ฃ์ง€ ๋ง์•„์•ผํ•œ๋‹ค.

 

 

 

 

opennaru blog, 'JWT(JSON Web Token) ์ดํ•ด์™€ ํ™œ์šฉ' ์ฐธ๊ณ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

http://www.opennaru.com/opennaru-blog/jwt-json-web-token/

 

 

- CSS ์‚ฌ์šฉํ•˜๊ธฐ (๊ตฌ๊ธ€์›นํฐํŠธ, ์ด๋ฏธ์ง€ ๋„ฃ๊ธฐ)
- ๋ถ€ํŠธ์ŠคํŠธ๋žฉ์‚ฌ์šฉํ•˜๊ธฐ
- ํฌ์ŠคํŒ…๋ฐ•์Šค ๋งŒ๋“ค๊ธฐ

 

 

 

 

<!doctype html>
<html lang="en">

<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet"
          integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js"
            integrity="sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM"
            crossorigin="anonymous"></script>

    <title>์ŠคํŒŒ๋ฅดํƒ€์ฝ”๋”ฉํด๋Ÿฝ | ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ์—ฐ์Šตํ•˜๊ธฐ</title>
   <link href="https://fonts.googleapis.com/css2?family=Poor+Story&display=swap" rel="stylesheet">
    <style>
        *{
            font-family: 'Poor Story', cursive;
        }
        .mytitle {

            max-width: 100%;
            height: 600px;

            background-image: linear-gradient(0deg, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.5)), url("https://img.vogue.co.kr/vogue/2021/12/style_61c299401f4b3.jpeg");
            background-position: center;
            background-size: cover;

            color: white;

            display: flex;
            flex-direction: column;
            justify-content: center;
            align-items: center;
        }
        .card {
            max-width: 95%;
            width: 500px;
            height:100px;

            margin: 10px auto 0px auto;
        ;
        }
        .mypost {
            max-width: 95%;
            width: 500px;
            height: 300px;

            background-color: transparent;
            color: black;
            border-radius: 5px;

            border: 1px solid grey;

            margin: 20px auto;
            padding: 20px;
        }
        .mypost > button {
            margin: 20px auto;
        }
    </style>
</head>

<body>
    <div class="mytitle">
        <h1>์•„์ด์œ  ํŒฌ๋ช…๋ก</h1>
    </div>

    <div class="mypost">
        <div class="form-floating mb-3">
          <input type="email" class="form-control" id="floatingInput" placeholder="๋‹‰๋„ค์ž„">
          <label for="floatingInput">๋‹‰๋„ค์ž„</label>
        </div>

        <div class="form-floating">
            <textarea class="form-control" placeholder="Leave a comment here" id="floatingTextarea2"
                      style="height: 100px"></textarea>
            <label for="floatingTextarea2">์‘์›๋Œ“๊ธ€</label>
        </div>

        <button type="button" class="btn btn-dark">์‘์›๋‚จ๊ธฐ๊ธฐ</button>
    </div>

    <div class="card">
      <div class="card-body">
        <blockquote class="blockquote mb-0">
          <p>์•จ๋ฒ” ๋„ˆ๋ฌด ์ข‹์•„์š”!</p>
          <footer class="blockquote-footer">์•„์ด๋Ÿฌ๋ธŒ์œ </cite></footer>
        </blockquote>
      </div>
    </div>
    <div class="card">
      <div class="card-body">
        <blockquote class="blockquote mb-0">
          <p>์•จ๋ฒ” ๋„ˆ๋ฌด ์ข‹์•„์š”!</p>
          <footer class="blockquote-footer">์•„์ด๋Ÿฌ๋ธŒ์œ </cite></footer>
        </blockquote>
      </div>
    </div>
    <div class="card">
      <div class="card-body">
        <blockquote class="blockquote mb-0">
          <p>์•จ๋ฒ” ๋„ˆ๋ฌด ์ข‹์•„์š”!</p>
          <footer class="blockquote-footer">์•„์ด๋Ÿฌ๋ธŒ์œ </cite></footer>
        </blockquote>
      </div>
    </div>

</body>

</html>

+ Recent posts