Framework/Next.js

[Next.js & React] ์‹œ์ž‘ํ•˜๊ธฐ

yuri lee 2022. 11. 2. 23:19
๋ฐ˜์‘ํ˜•
์ด ๊ธ€์€ udemy์˜ Next.js & React - ์™„๋ฒฝ ์ •๋ณต ๊ฐ€์ด๋“œ (incl. Two Paths) ๊ฐ•์ขŒ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

1. Welcome to the Coursel

์‹œ์ž‘ํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊พธ์ค€ํžˆ ํ™”์ดํŒ… ๐ŸคŸ๐ŸคŸ

 

2. Next.js๋ž€ ๋ฌด์—‡์ธ๊ฐ€? Next.js๋ฅผ ์™œ ์‚ฌ์šฉํ•˜๋Š” ๊ฑธ๊นŒ?

NextJS๋Š” ํ”„๋กœ๋•์…˜์šฉ React ํ”„๋ ˆ์ž„ ์›Œํฌ ์ž…๋‹ˆ๋‹ค. ํฐ ๊ทœ๋ชจ์˜ ํ”„๋กœ๋•์…˜์šฉ React ์•ฑ์„ ์‰ฝ๊ฒŒ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ReactJS๋Š” ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌ์ถ•์„ ์œ„ํ•œ JS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. ์ฆ‰ Third Party ํŒจํ‚ค์ง€๋กœ ํ”„๋ก ํŠธ ์—”๋“œ ํ”„๋กœ์ ํŠธ์— ์ถ”๊ฐ€๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž…๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ํด๋ผ์ด์–ธํŠธ ์ธก JavaScript ์ฝ”๋“œ๋ผ๋Š” ์ด์•ผ๊ธฐ ์ž…๋‹ˆ๋‹ค. ์ฃผ๋กœ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค ๋ถ€๋ถ„์ธ ์ปดํฌ๋„ŒํŠธ, ์ƒํƒœ, ํ”„๋กœํผํ‹ฐ ๋“ฑ์—๋งŒ ์ดˆ์ ์„ ๋งž์ถ”๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋ถ„๋ฅ˜๋ฉ๋‹ˆ๋‹ค. ๋•Œ๋ฌธ์— ๋ผ์šฐํŒ… ํ˜น์€ ์ธ์ฆ ๋“ฑ์ด ํ•„์š”ํ•  ๊ฒฝ์šฐ ์ด๋ฅผ ๋•๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 

 

ํ•œ๋งˆ๋””๋กœ Next.js์˜ ์—ญํ• ์€ React ๊ฐœ๋ฐœ์ž์ธ ์—ฌ๋Ÿฌ๋ถ„์˜ ์—…๋ฌด๋ฅผ ์ˆ˜์›”ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ์ฃผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

3. ํ•ต์‹ฌ ๊ธฐ๋Šฅ : Server-side Page (Pre-) Rendering

์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(SSR)์ด๋ž€, ํด๋ผ์ด์–ธํŠธ ์ธก์ด ์•„๋‹Œ ์„œ๋ฒ„ ์ธก์˜ ํŽ˜์ด์ง€ ์ƒ์— ๋ Œ๋”๋ง ๋˜๋Š” ์ฝ˜ํ…์ธ  ์ฒ˜๋ฆฌ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. React๋งŒ์„ ์ด์šฉํ•ด ๊ตฌ์ถ•๋œ ์ผ๋ฐ˜์ ์ธ React App ์—์„œ ๋กœ๋”ฉ๋œ React ํŽ˜์ด์ง€์˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด ํŽ˜์ด์ง€๊ฐ€ ์‹œ์ž‘๋˜๋Š” ๋ถ€๋ถ„๋ถ€ํ„ฐ ๋น„์–ด์žˆ์Šต๋‹ˆ๋‹ค. 

 

React๋Š” ํด๋ผ์ด์–ธํŠธ ์ธก JavaScript ๋ผ์ด๋ธŒ๋Ÿฌ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ Œ๋”๋ง์€ ์ „๋ถ€ ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์‚ฌ์šฉ์ž๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ๋ฐฉ๋ฌธํ–ˆ์„ ๋•Œ, ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ ์ธก์œผ๋กœ ์ „์†ก๋˜๋Š” HTML ์ฝ”๋“œ์—๋Š” ๋ณ„ ๋‚ด์šฉ์ด ์—†์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ชจ์ž„ ์•ฝ์†๊ณผ ๊ฐ™์ด ๋ณด์—ฌ์ ธ์•ผ ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ fetchํ•˜๋Š” ๊ฒฝ์šฐ, ๋ฐ์ดํ„ฐ๊ฐ€ fetch ๋˜๋Š” ๋™์•ˆ ์ฆ‰ ์š”์ฒญ์ด ์ „์†ก๋  ๋•Œ ์ž ๊น ๋™์•ˆ ํŽ˜์ด์ง€๊ฐ€ ๊นœ๋นก๊ฑฐ๋ฆฌ๋Š” ๋กœ๋”ฉ ์ƒํƒœ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ JavaScript ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋œ ๋’ค์— ๋ฐ์ดํ„ฐ fecth๊ฐ€ ์‹œ์ž‘๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์˜ ๊ด€์ ์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๋กœ๋”ฉ์ด ์ด์ƒ์ ์ด์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

๋ฐ˜๋ฉด ๋กœ๊ทธ์ธ์„ ํ•ด์•ผ์ง€๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ด€๋ฆฌ ๋Œ€์‹œ๋ณด๋“œ์˜ ๊ฒฝ์šฐ์—๋Š” ๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”(SEO)๊ฐ€ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฒ€์ƒ‰ ์—”์ง„์„ ํ†ตํ•ด ๊ฒ€์ƒ‰์ด ๋˜์–ด์•ผ ํ•˜๊ณ  ๋งŽ์€ ์ฝ˜ํ…์ธ ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ๊ณต๊ฐœ ํŽ˜์ด์ง€๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ SEO๊ฐ€ ์ค‘์š”ํ•ด์ง‘๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ๋“ค์—์„œ๋Š” ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(SSR)์ด ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. 

 

ReactJS์— ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(SSR)์„ ์ถ”๊ฐ€ํ•˜๋„๋ก ํ•ด์ฃผ๋Š” ๋‚ด์žฅ ๊ธฐ๋Šฅ์ด ์žˆ๊ธด ํ•˜๋‚˜, ์ œ๋Œ€๋กœ ์ถ”๊ฐ€ํ•˜๊ธฐ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๊ณ  ์ง์ ‘ ๊ฑฐ์ฒ˜์•ผ ํ•˜๋Š” ๋‹จ๊ณ„๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด NextJs์—๋Š” ๋‚ด์žฅ ์„œ๋ฒ„ ์ธก ๋ Œ๋”๋ง์ด ์žˆ์œผ๋ฏ€๋กœ ์ž๋™์œผ๋กœ ํŽ˜์ด์ง€๋ฅผ ๋ฏธ๋ฆฌ ๋ Œ๋”๋ง ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ›จ์”ฌ ์‰ฝ๊ฒŒ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ Html ๋ผˆ๋Œ€๋งŒ ์žˆ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ์„œ๋ฒ„์—์„œ ๋ฐ›์€ ๋ชจ๋“  ์ฝ˜ํ…์ธ ๊ฐ€ ์ด๋ฏธ HTML ํŽ˜์ด์ง€์— ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. 

 

4. ํ•ต์‹ฌ ๊ธฐ๋Šฅ : File-based Routing

NextJs ์—๋Š” ์ฝ”๋“œ ๋‚ด ๋ผ์šฐํŠธ ์ •์˜ ์—†์ด, ํŒŒ์ผ๊ณผ ํด๋”์— ํŽ˜์ด์ง€์™€ ๋ผ์šฐํŠธ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. React์™€ ๋‹ฌ๋ฆฌ ์ถ”๊ฐ€์ ์ธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค. 

 

5. ํ•ต์‹ฌ ๊ธฐ๋Šฅ : Key Feature: Build Fullstack React Apps! 

NextJS๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐœ๋ฐœ์ž๋“ค์ด React ํ”„๋กœ์ ํŠธ์— ๋ฐฑ์—”๋“œ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜์›”ํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ Server-side Rendering ์„ ํ†ตํ•œ ํด๋ผ์ด์–ธํŠธ ์ธก ์ฝ”๋“œ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ NojdeJS ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์‰ฝ๊ฒŒ ๋ฐฑ์—”๋“œ API๋ฅผ React ํ”„๋กœ์ ํŠธ๋กœ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

6. Join Our Learning Community! 

 

7. Creating a NextJS Project 

npx create-next-app@latest
# or
yarn create next-app
# or
pnpm create next-app

Node.js์—๋Š” Node Package Manager๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋Š”๋ฐ, ์ด๋Š” JavaScript ํ”„๋กœ์ ํŠธ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์‹ค์งˆ์ ์ธ ํ‘œ์ค€ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. Next ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ์„ ์œ„ํ•ด ์ด ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด SSR์˜ ๊ฒฝ์šฐ Node.js๋ฅผ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ๋•Œ๋ฌธ์— Node.js๋ฅผ ์„ค์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 

 

prettier extension ์„ค์น˜ ํ›„ ์•„๋ž˜ ์„ค์ •๊นŒ์ง€ ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค.

 

8. ์ƒ์„ฑ๋œ Project ๋ถ„์„ํ•˜๊ธฐ

  • pages : create-react-app์œผ๋กœ ์ƒ์„ฑํ•œ ์ผ๋ฐ˜์ ์ธ ํ‘œ์ค€ React ์•ฑ ๋‚ด์—๋Š” public ํด๋”์— index.html ํŒŒ์ผ์ด ์žˆ๋Š” ๋ฐ˜๋ฉด, NextJS ์•ฑ ๋‚ด์—๋Š” ํŒŒ์ผ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ด๋ฏธ NextJS๊ฐ€ ๋‚ด์žฅ๋œ ์‚ฌ์ „ ๋ Œ๋”๋ง์ด ํฌํ•จ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์š”์ฒญ์ด ์„œ๋ฒ„๋กœ ๋„๋‹ฌํ•  ๋•Œ์— ์‹ฑ๊ธ€ ํŽ˜์ด์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(SPA)์˜ ๋‹จ์ผ ํŽ˜์ด์ง€๊ฐ€ ๋™์ ์œผ๋กœ ์‚ฌ์ „ ๋ Œ๋”๋ง์ด ๋˜์–ด ์ฝ˜ํ…์ธ ๋ฅผ ํฌํ•จํ•œ ์ดˆ๊ธฐ ํŽ˜์ด์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ pages ํด๋”๊ฐ€ ๊ฐ€์žฅ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ํด๋”์— ํŒŒ์ผ ๊ธฐ๋ฐ˜์˜ ๋ผ์šฐํŒ…์„ ์„ค์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. 
  • public 
  • styles

 

9. ์ฒซ๋ฒˆ์งธ ๋ฐ๋ชจ : NextJS ์ง์ ‘ ์‚ฌ์šฉํ•ด๋ณด๊ธฐ

npm run dev
  "scripts": {
    "dev": "next dev",
    "build": "next build",
    "start": "next start",
    "lint": "next lint"
  },

npm run dev ๋Š” ๊ฐœ๋ฐœ ์„œ๋ฒ„๋ฅผ ์‹คํ–‰์‹œํ‚ต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ์„œ๋ฒ„๋Š” NextJs ํŽ˜์ด์ง€ ๋ฐ ์•ฑ์˜ ์ „๋ฐ˜์„ ๋‹ด๋‹นํ•˜๋Š” ๋‚ด์žฅ ์„œ๋ฒ„๋กœ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•ด ํŒŒ์ผ์— ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ €์žฅ๋  ๋•Œ๋งˆ๋‹ค ๋ธŒ๋ผ์šฐ์ €์— ๋‚˜ํƒ€๋‚˜๋Š” ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ๊ณ ์นจ ํ•˜๊ณ  ์—…๋ฐ์ดํŠธ ํ•ด์„œ ์ตœ๊ณ ์˜ ๊ฐœ๋ฐœ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•ด์ค๋‹ˆ๋‹ค. ์ดํ›„ ์•ฑ์˜ ๋ฐฐํฌ ์ค€๋น„๊ฐ€ ๋˜๋ฉด deploy์— ์ตœ์ ํ™”๋œ ์ถœ๋ ฅ๊ฐ’์„ ์œ„ํ•ด npm run build๋ฅผ ์‹คํ–‰ํ•ด์„œ ํ”„๋กœ๋•์…˜ ์šฉ์œผ๋กœ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ ์ตœ์ ํ™”๋œ ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด npm start๋ฅผ ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค. 

 

์‹คํ–‰ํ•œ ํ›„, View Page Sorce๋ฅผ ํด๋ฆญํ•ด ํ™•์ธํ•ด๋ณด๋ฉด HTML ๋งˆํฌ์—… ๋‚ด์— ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚œ ํ…์ŠคํŠธ ๋“ฑ์˜ ๋ชจ๋“  ๋‚ด์šฉ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํŽ˜์ด์ง€๊ฐ€ ์‚ฌ์ „ ๋ Œ๋”๋ง์ด ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด ๋‚ด์žฅ ํŽ˜์ด์ง€ ์‚ฌ์ „ ๋ Œ๋”๋ง ๊ธฐ๋Šฅ์ด ํ‘œ์ค€ React App์— ์—†๋Š” NextJs๊ฐ€ ์ œ๊ณตํ•˜๋Š” ํ•ต์‹ฌ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. 

 

โ“Pre-rendering ์ด๋ž€?

Next.js์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ชจ๋“  ํŽ˜์ด์ง€๋ฅผ ํ”„๋ฆฌ ๋ Œ๋”๋ง ํ•ฉ๋‹ˆ๋‹ค. HTML์ด ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ์—์„œ JS๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ Next.js๊ฐ€ ์‚ฌ์ „์— ๊ฐ ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค์–ด ๋†“์Šต๋‹ˆ๋‹ค. ์ด๋•Œ ๊ฐ HTML์€ ํ•ด๋‹น ํŽ˜์ด์ง€์— ์ตœ์†Œํ•œ์œผ๋กœ ํ•„์š”ํ•œ JS ์ฝ”๋“œ์™€ ๊ฒฐํ•ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ํŽ˜์ด์ง€๊ทธใ… ๋ธŒ๋ผ์šฐ์ €์— ์˜ํ•ด ๋กœ๋“œ๋  ๋•Œ๋Š” hydration์ด๋ผ๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฑฐ์น˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. hydration์€ JS ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜์–ด ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ ์™„์ „ํžˆ ์ธํ„ฐ๋ ‰ํ‹ฐ๋ธŒํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํ”„๋ฆฌ ๋ Œ๋”๋ง์„ ํ•  ๊ฒฝ์šฐ, ํ”„๋ฆฌ ๋ Œ๋”๋ง์„ ํ•˜์ง€ ์•Š์„ ๋•Œ๋ณด๋‹ค ๋” ๋‚˜์€ ์„ฑ๋Šฅ๊ณผ SEO๋ฅผ ๊ฐ€์ถœ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

 

10. About This Course & Course Outline

  • Basics & Foundation
    • File-based Routing
    • Page Pre-Rendering & Data Fetching
    • Combining "Standard React" & NextJS
    • API Routes & Fullstack Capabilities
  • Advanced Concepts
    • Optimization Opportunities
    • Looking Behind the Scenes & Theory
    • Deployment & Configuration
    • Authentication
  • Summaries & Refreshers

https://ahnanne.tistory.com/75

https://www.udemy.com/course/nextjs-react-incl-two-paths/

๋ฐ˜์‘ํ˜•