Giter VIP home page Giter VIP logo

very-simple-portfolio's Introduction

vsp This project is licensed under the terms of the MIT license.

๐Ÿ“ very simple portfolio

์‹ฌํ”Œํ•œ ํ”Œ๋žซ ๋””์ž์ธ์˜ ์ •์  ์›น ํฌํŠธํด๋ฆฌ์˜ค/์ด๋ ฅ์„œ ํŽ˜์ด์ง€๋ฅผ ์ œ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ํ…œํ”Œ๋ฆฟ ํ”„๋กœ์ ํŠธ์—์š” ๐Ÿค—


์–ด๋ ค์šธ ๊ฒƒ ๊ฐ™๋‹ค๊ตฌ์š”? ๋Œ“์ธ ๋…ธ๋…ธ.
markdown ๊ณผ json๋งŒ ์ž‘์„ฑํ•  ์ค„ ์•ˆ๋‹ค๋ฉด, ์†์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์š”!๐Ÿ˜‡


์‚ฌ์šฉ๋œ ๊ธฐ์ˆ 

next.js typescript tailwind next-seo react-markdown


๐Ÿง ์™œ ๋งŒ๋“ค์—ˆ๋‚˜์š”?


๐Ÿข ๋ฌธ์„œ ๊ด€๋ฆฌ ์•ฑ์„ ์ด์šฉํ•ด์„œ ์ด๋ ฅ์„œ ๋ฐ ํฌํŠธํด๋ฆฌ์˜ค๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ, ์กฐ๊ธˆ ๋Š๋ฆฌ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜๋‚˜์š”?

โ˜น๏ธ ๋ฌธ์„œ ๊ด€๋ฆฌ ์•ฑ์ด ์ œ๊ณตํ•˜๋Š” ๋””์ž์ธ์ด ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์•˜๋‚˜์š”?

๐Ÿ“ˆ ๋‚ด ์ด๋ ฅ์„œ๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋ฐฉ๋ฌธ๋˜์—ˆ๋Š”์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ์•Œ๊ณ ์‹ถ์ง€ ์•Š์•˜๋‚˜์š”?

๐Ÿ”Ž ๊ตฌ๊ธ€์—์„œ ๋‚ด ์ด๋ ฅ์„œ๊ฐ€ ๊ฒ€์ƒ‰๋˜๋„๋ก ๋งŒ๋“ค๊ณ  ์‹ถ์ง€ ์•Š์•˜๋‚˜์š”?


์ €๋Š” ์œ„์™€ ๊ฐ™์€ ์ด์œ ๋กœ Next.js๋ฅผ ์‚ฌ์šฉํ•œ ์ •์  ์›น ํฌํŠธํด๋ฆฌ์˜ค๋ฅผ ๋งŒ๋“ค๊ธฐ๋กœ ๊ฒฐ์‹ฌํ–ˆ์–ด์š”.
๊ทธ๋Ÿฌ๋‹ค ๋ฌธ๋“, ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋„ ๋‚˜์™€ ๋˜‘๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ๊ฐ–๊ณ  ์žˆ์„ ๊ฑฐ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ์ € ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํฌํŠธํด๋ฆฌ์˜ค ํ…œํ”Œ๋ฆฟ์„ ๋งŒ๋“ค๊ฒŒ ๋˜์—ˆ๋‹ต๋‹ˆ๋‹ค ๐Ÿค—


๐ŸŽจ ๋””์ž์ธ์ด ๊ถ๊ธˆํ•ด์š”!

์ œ ํฌํŠธํด๋ฆฌ์˜ค๋„ very simple portfolio ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ œ์ž‘ํ–ˆ์–ด์š”. ๐Ÿ‘‰๐Ÿ‘‰ ๋งŒ๋“ ์ด ํฌํŠธํด๋ฆฌ์˜ค ๋ณด๋Ÿฌ๊ฐ€๊ธฐ ๐Ÿ‘‰๐Ÿ‘‰

๐Ÿšจ ์ €๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜๊ณผ ํ”„๋กœํ•„ ์‚ฌ์ง„ ๋“ฑ์˜ ์ถ”๊ฐ€ ์ž‘์—…์„ ํ•ด๋‘” ์ƒํƒœ์—์š”. ๐Ÿšจ
๐Ÿšจ ํ…œํ”Œ๋ฆฟ์—๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜๊ณผ ํ”„๋กœํ•„ ์‚ฌ์ง„์ด ํฌํ•จ๋˜์–ด์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค! ๐Ÿšจ


๊ธฐ๋ณธ ๋””์ž์ธ์€ ์ด๋Ÿฐ ๋Š๋‚Œ์ด์—์š” ๐Ÿ‘€

overview.mp4
  • โ˜€๏ธ ๊ฐœ์ธ์ ์ธ ์ทจํ–ฅ์ด์ง€๋งŒ, ๋ผ์ดํŠธ๋ชจ๋“œ๊ฐ€ ๊น”๋”ํ•˜๋‹ˆ ๊ดœ์ฐฎ์•„์š”. (๋‹คํฌ๋ชจ๋“œ๋„ ๋Œ€์‘์€ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ์„ค์ •์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.)

  • ๐ŸŒˆ ์ดˆ๋ก์ดˆ๋กํ•œ ์ปฌ๋Ÿฌ๊ฐ€ ๋ฉ”์ธ์ธ๋ฐ, ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์–ด์š”! ์›ํ•˜๋Š” ์ƒ‰์œผ๋กœ ์ปค์Šคํ…€ํ•˜์—ฌ ์‚ฌ์šฉํ•˜์„ธ์š”.

  • ๐Ÿ“ฑ ๋ฐ˜์‘ํ˜•์œผ๋กœ ๊ฐœ๋ฐœ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.


change log

23.05.18 project activity education ์˜ description ํ•ญ๋ชฉ์— \n์„ ์ž…๋ ฅํ•˜๋ฉด ์ค„๋ฐ”๊ฟˆ์ด ๊ฐ€๋Šฅํ•ด์กŒ์–ด์š”.
(ex. "description": "์ค„๋ฐ”๊ฟˆ\n์ค„๋ฐ”๊ฟˆ")


๐Ÿ› ๏ธ Usage

์ด์ œ, ์–ด๋–ป๊ฒŒ ๋งŒ๋“œ๋Š”์ง€ ์•Œ์•„๋ณผ๊นŒ์š”?





Setup



Step 1๏ธโƒฃ very simple portfolio ๋ฅผ ํด๋ก ํ•ด์ฃผ์„ธ์š”.

git clone https://github.com/sjoleee/very-simple-portfolio.git


Step 2๏ธโƒฃ ์ƒˆ๋กœ์šด ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด, ํด๋ก ํ•œ ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๋„ฃ์–ด์ฃผ์„ธ์š”.

Github์—์„œ ์ƒˆ๋กœ์šด ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•ด์ฃผ์„ธ์š”.

image

โ€ฆor push an existing repository from the command line ๋‚ด์šฉ์„ ๋ณต์‚ฌํ•˜์—ฌ ํ„ฐ๋ฏธ๋„์— ๊ทธ๋Œ€๋กœ ๋ถ™์—ฌ๋„ฃ์–ด์ฃผ์„ธ์š”.

image

- Step๏ธ 3๏ธโƒฃ ์˜์กด์„ฑ์„ ์„ค์น˜ํ•ด์ฃผ์„ธ์š”.

yarn

or

npm install


- Step 4๏ธโƒฃ next ๊ฐœ๋ฐœ ์„œ๋ฒ„๋ฅผ ๋„์šฐ๊ณ  ํ™•์ธํ•˜๋ฉฐ ํฌํŠธํด๋ฆฌ์˜ค๋ฅผ ๋งŒ๋“œ์„ธ์š”.

yarn dev

or

npm run dev




data

๊ธฐ๋ณธ์ ์œผ๋กœ, ํฌํŠธํด๋ฆฌ์˜ค๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋Œ€๋ถ€๋ถ„์˜ ๋ฐ์ดํ„ฐ๋Š” ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— ์žˆ๋Š” data.json์— ์ž‘์„ฑ๋ฉ๋‹ˆ๋‹ค.
์˜ˆ์‹œ๋ฅผ ํ•จ๊ป˜ ์‚ดํŽด๋ณด๋„๋ก ํ•˜์ฃ ! (์•„๋ž˜ ์˜ˆ์‹œ์™€ ๋นˆ ํ…œํ”Œ๋ฆฟ์ธ data.templete.json๊ฐ€ ๋ฃจํŠธ์— ์ž‘์„ฑ๋˜์–ด ์žˆ์œผ๋‹ˆ ์ฐธ๊ณ ํ•˜์„ธ์š”!)

{

// ํฌํŠธํด๋ฆฌ์˜ค ์ตœ์ƒ๋‹จ์˜ ์ œ๋ชฉ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. 
  "resumeTitle": {
    "title": "Hong Gil Dong"
  },


// ์ž์‹ ์˜ ์ธ์ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ์ž‘์„ฑํ•˜๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค.
  "information": {
  
    // ์ด๋ฆ„์„ ์ ์–ด์ฃผ์„ธ์š”
    "name": "ํ™๊ธธ๋™", 
    
    // ๊ฐ์ข… ๋งํฌ๋ฅผ ๊ฑธ์–ด์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. id ์ˆœ์„œ๋Œ€๋กœ ๋‚˜์—ด๋ฉ๋‹ˆ๋‹ค.
    // ๊ฐ€์žฅ ๋Œ€์ค‘์ ์ธ ๊ฒƒ ๊ฐ™์€ 3๊ฐ€์ง€๋ฅผ ๋ฏธ๋ฆฌ ์ž‘์„ฑํ•ด๋’€์–ด์š”. ๋” ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜, ์ œ๊ฑฐํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค.
    // ๋‹จ, ์ด๋ฉ”์ผ์€ isEmail์„ true๋กœ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.
    "contact": [ 
      { "id": 0, "name": "Email", "href": "[email protected]", "isEmail": true }, // href์— ์ด๋ฉ”์ผ์„ ์ ์–ด์ฃผ์„ธ์š”.
      { "id": 1, "name": "Github", "href": "https://github.com/honggildong" }, // href์— ๊นƒํ—ˆ๋ธŒ ์ฃผ์†Œ๋ฅผ ์ ์–ด์ฃผ์„ธ์š”.
      { "id": 2, "name": "Blog", "href": "https://velog.io/@honggildong" } // href์— ๋ธ”๋กœ๊ทธ ์ฃผ์†Œ๋ฅผ ์ ์–ด์ฃผ์„ธ์š”.
    ]
  },

// ์ง์žฅ ๊ฒฝ๋ ฅ์— ๋Œ€ํ•ด ์ž‘์„ฑํ•˜๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค.
// ๊ฐ ์ง์žฅ๋ณ„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฐ์—ด๋กœ ์ž‘์„ฑํ•ด์ฃผ์‹œ๋ฉด ๋˜๋Š”๋ฐ, ํฌํŠธํด๋ฆฌ์˜ค์—์„œ ๋ฐฐ์—ด ์—ญ์ˆœ์œผ๋กœ ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค.
// ๋”ฐ๋ผ์„œ ์˜ค๋ž˜๋œ(์˜ˆ์ „) ๊ฒฝ๋ ฅ์„ ์•ž์—, ์ตœ๊ทผ ๊ฒฝ๋ ฅ์„ ๋’ค์— ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.
  "workExperience": [
    {
      "id": 0,
      "name": "์ปคํ”ผํ”„๋ฆฐ์Šค 1ํ˜ธ์ ", // ์ง์žฅ๋ช…์„ ์ ์–ด์ฃผ์„ธ์š”.
      "position": "Front-end Engineer", // ๋‹ด๋‹น ์ง๋ฌด๋ฅผ ์ ์–ด์ฃผ์„ธ์š”.
      "period": ["2019. 01", "2019. 09"] // ์–ธ์ œ๋ถ€ํ„ฐ ์–ธ์ œ๊นŒ์ง€ ์ผํ•˜์…จ๋Š”์ง€ ์ ์–ด์ฃผ์„ธ์š”.
    },
    {
      "id": 1,
      "name": "์ปคํ”ผํ”„๋ฆฐ์Šค 2ํ˜ธ์ ",
      "position": "๋ฐ”๋ฆฌ์Šคํƒ€",
      "period": ["2022. 01", "now"] // ํ˜„์žฌ ์žฌ์ง์ค‘์ด๋ผ๋ฉด, now๋‚˜ working ๋“ฑ์„ ์ ์–ด์ฃผ์„ธ์š”.
    }
  ],


// ํ”„๋กœ์ ํŠธ ๊ฒฝํ—˜์— ๋Œ€ํ•ด ์ž‘์„ฑํ•˜๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค.
// ์ง์žฅ ๋ฐ์ดํ„ฐ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ๋ฐฐ์—ด ์—ญ์ˆœ์œผ๋กœ ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค.
// ์˜ค๋ž˜๋œ(์˜›๋‚ ) ํ”„๋กœ์ ํŠธ๋ฅผ ์•ž์—, ์ตœ๊ทผ ํ”„๋กœ์ ํŠธ๋ฅผ ๋’ค์— ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.
// isTeam์˜ ๊ฐ’์— ๋”ฐ๋ผ์„œ ํŒ€ ํ”„๋กœ์ ํŠธ์™€ ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ ๊ฐ๊ฐ ๋‚˜๋‰˜์–ด ๋ณด์—ฌ์ง‘๋‹ˆ๋‹ค.
  "project": [
    {
      "id": 0,
      "name": "์ฒซ๋ฒˆ์งธ ํŒ€ ํ”„๋กœ์ ํŠธ", // ํ”„๋กœ์ ํŠธ๋ช…์„ ์ ์–ด์ฃผ์„ธ์š”.
      "description": "ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์„ค๋ช…์„ ์ ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ํ”„๋กœ์ ํŠธ์ธ์ง€ ์ฃผ์ œ๋‚˜ ๊ฐ•์กฐํ•˜๊ณ  ์‹ถ์€ ๋ถ€๋ถ„์„ ์ ์–ด๋ณด์„ธ์š”.",
      "webUrl": "https://github.com/sjoleee/", // ๋ฆด๋ฆฌ์ฆˆ๋œ ํŽ˜์ด์ง€๋‚˜ ์•ฑ์Šคํ† ์–ด ๋“ฑ ์›ํ•˜๋Š” ์›นํŽ˜์ด์ง€ ๋งํฌ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์—†์œผ๋ฉด ์ œ๊ฑฐ!
      "repoUrl": "https://github.com/sjoleee/", // ๊นƒํ—ˆ๋ธŒ ๋ ˆํฌ์ง€ํ† ๋ฆฌ ๋งํฌ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์—†์œผ๋ฉด ์ œ๊ฑฐ!
      "isTeam": true, // ํŒ€ ํ”„๋กœ์ ํŠธ์™€ ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ํŒ€ ํ”„๋กœ์ ํŠธ๋ผ๋ฉด true๋กœ ์ ์–ด์ฃผ์„ธ์š”.
      "period": ["2022. 07", "2022. 09"], // ํ”„๋กœ์ ํŠธ ๊ธฐ๊ฐ„์„ ์ ์–ด์ฃผ์„ธ์š”.
      "stack": ["์‚ฌ์šฉํ•œ ๊ธฐ์ˆ ์„ ์ ์–ด์ฃผ์„ธ์š”", "React.js", "JavaScript", "styled-components", "Recoil"] // ์‚ฌ์šฉํ•œ ๊ธฐ์ˆ ์„ ์ ์–ด์ฃผ์„ธ์š”.
    },
    {
      "id": 1,
      "name": "์ฒซ๋ฒˆ์งธ ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ",
      "description": "ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์„ค๋ช…์„ ์ ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ํ”„๋กœ์ ํŠธ์ธ์ง€ ์ฃผ์ œ๋‚˜ ๊ฐ•์กฐํ•˜๊ณ  ์‹ถ์€ ๋ถ€๋ถ„์„ ์ ์–ด๋ณด์„ธ์š”.",
      "webUrl": "https://github.com/sjoleee/",
      "repoUrl": "https://github.com/sjoleee/",
      "isTeam": false,
      "period": ["2022. 10", "2022. 11"],
      "stack": ["JavaScript", "HTML/CSS"]
    },
  ],

// ๊ฐ์ข… ๊ฒฝํ—˜, ๋Œ€ํšŒ ๋“ฑ์˜ ํ™œ๋™์— ๋Œ€ํ•ด ์ž‘์„ฑํ•˜๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค.
  "activity": [
    {
      "id": 0,
      "name": "์ฒซ๋ฒˆ์งธ ํ™œ๋™", // ํ™œ๋™๋ช…์„ ์ ์–ด์ฃผ์„ธ์š”.
      "period": ["2022. 06", "2022. 08"], // ํ™œ๋™ ๊ธฐ๊ฐ„์„ ์ ์–ด์ฃผ์„ธ์š”.
      "description": "์ฒซ๋ฒˆ์งธ ํ™œ๋™์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ์„ค๋ช…"
    },
    {
      "id": 1,
      "name": "๋‘๋ฒˆ์งธ ํ™œ๋™",
      "period": ["2022. 06", "2022. 08"],
      "description": "๋‘๋ฒˆ์งธ ํ™œ๋™์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ์„ค๋ช…"
    }
  ],
  
// ๋ฐ›์•˜๋˜ ๊ต์œก์— ๋Œ€ํ•ด ์ž‘์„ฑํ•˜๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค.
// ์ˆ˜๋ฃŒํ•œ ๋ถ€ํŠธ์บ ํ”„, ์ „๊ณต ๋“ฑ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.
  "education": [
    {
      "id": 0,
      "name": "์ฒซ๋ฒˆ์งธ ๊ต์œก", // ๊ต์œก๋ช…์„ ์ ์–ด์ฃผ์„ธ์š”.
      "period": ["2013. 02", "2020. 02"], // ๊ต์œก ๊ธฐ๊ฐ„์„ ์ ์–ด์ฃผ์„ธ์š”.
      "description": "์ฒซ๋ฒˆ์งธ ๊ต์œก์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ์„ค๋ช…"
    },
    {
      "id": 1,
      "name": "๋‘๋ฒˆ์งธ ๊ต์œก",
      "period": ["2013. 02", "2020. 02"],
      "description": "๋‘๋ฒˆ์งธ ๊ต์œก์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ์„ค๋ช…"
    }
  ],

// ์ž๊ฒฉ์ฆ์— ๋Œ€ํ•ด ์ž‘์„ฑํ•˜๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค.
// ๊ฐ์ข… ์ž๊ฒฉ์ฆ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.
  "certificate": [
    {
      "id": 0,
      "name": "TOEIC 1000์ ", // ์ž๊ฒฉ์ฆ์˜ ์ด๋ฆ„๊ณผ ์ ์ˆ˜ ํ˜น์€ ๋“ฑ๊ธ‰์„ ์ ์–ด์ฃผ์„ธ์š”.
      "date": "2019. 07. 28", // ์ทจ๋“ ๋‚ ์งœ๋ฅผ ์ ์–ด์ฃผ์„ธ์š”.
      "organizer": "ETS" // ์ฃผ๊ด€์ฒ˜๋ฅผ ์ ์–ด์ฃผ์„ธ์š”.
    },
    {
      "id": 1,
      "name": "OPIC IH",
      "date": "2019. 07. 28",
      "organizer": "ETS"
    }
  ]
}

์ด๋ ‡๊ฒŒ data.json ๋ฅผ ์ž‘์„ฑํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๊ทผ๋ฐ, id ๋Š” ๋ญ๋ƒ๊ตฌ์š”?!

id๋Š” ๋ฐฐ์—ด์—์„œ์˜ ์ˆœ์„œ(index) ๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  ์ž‘์„ฑํ•ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
๋’ค์—์„œ ๋‚˜์˜ฌ markdown ์ด๋‚˜ img ํŒŒ์ผ๊ณผ ๊ฐ ํ•ญ๋ชฉ์„ ๋งค์นญ์‹œ์ผœ์ฃผ๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉ๋˜๋‹ˆ, ์ง€์šฐ์ง€ ๋งˆ์„ธ์š”!!

๊ทธ๋Ÿฐ๋ฐ data.json ์„ ๋น ์ง์—†์ด ์ž‘์„ฑํ•ด๋„ ์ฑ„์›Œ์ง€์ง€ ์•Š๋Š” ์˜์—ญ๋“ค์ด ์žˆ์„๊ฑฐ์—์š”.
์•„๋ž˜์ชฝ์—์„œ ๊ณ„์† ์„ค๋ช…ํ• ๊ฒŒ์š”๐Ÿ˜‡





resumeTitle

resumeTitle

ํฌํŠธํด๋ฆฌ์˜ค ์ตœ์ƒ๋‹จ์˜ ์ œ๋ชฉ์ด์—์š”.
์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ์‹œ๋ ค๋ฉด ๋นˆ ๋ฌธ์ž์—ด์„ ์ „๋‹ฌํ•ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค!

  "resumeTitle": {
    "title": "Hong Gil Dong"
  }




information

image

์ธ์ ์‚ฌํ•ญ์„ ๋ณด์—ฌ์ฃผ๋Š” ๋ณธ๋ฌธ ์ตœ์ƒ๋‹จ ์˜์—ญ์ด์—์š”.

๋‹จ, ์Šคํฌ๋ฆฐ์ƒท์—์„œ ๋ณด์ด๋Š” ์•ˆ๋…•ํ•˜์„ธ์š”, ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž ํ™๊ธธ๋™์ž…๋‹ˆ๋‹ค. ๋ฌธ๊ตฌ๋Š” data.json์—์„œ ์ž‘์„ฑํ•œ ๊ฒƒ์ด ์•„๋‹ˆ์—์š”.
์ง์ ‘ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค! ๊ฐ€์žฅ ๋จผ์ € ๋ณด์ด๋Š” ์ œ๋ชฉ์ด๋ฏ€๋กœ, ๊ฐœ์ธ์ด ์›ํ•˜๋Š” ๋Œ€๋กœ ์ทจํ–ฅ๊ป ์ปค์Šคํ…€ํ•ด์ฃผ์„ธ์š”. ๊ฒฝ๋กœ๋Š” /src/components/Information/index.tsx ์ด๋ฉฐ, 11๋ฒˆ ๋ผ์ธ์— ์ฃผ์„์„ ๋‚จ๊ฒจ๋‘์—ˆ์–ด์š”.

ํ˜น์€, ํ•„์š”ํ•˜๋‹ค๋ฉด ํฌ์ง€์…˜๋งŒ ์ˆ˜์ •ํ•ด์„œ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค! ex) ์•ˆ๋…•ํ•˜์„ธ์š”, ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž ํ™๊ธธ๋™์ž…๋‹ˆ๋‹ค.

image
  "information": {
    "name": "ํ™๊ธธ๋™", 
    "contact": [ 
      { "id": 0, "name": "Email", "href": "[email protected]", "isEmail": true },
      { "id": 1, "name": "Github", "href": "https://github.com/honggildong" },
      { "id": 2, "name": "Blog", "href": "https://velog.io/@honggildong" }
    ]
  }

๊ทธ๋Ÿฐ๋ฐ, ์Šคํฌ๋ฆฐ์ƒท์˜ ditto ๊ฐ€์‚ฌ๋Š” ์–ด๋””์— ์ž…๋ ฅ๋œ ๊ฒƒ์ผ๊นŒ์š”?๐Ÿง

ํ•ด๋‹น ์˜์—ญ์€ Markdown ์„ ์‚ฌ์šฉํ•ด์„œ ๋ณ„๋„์˜ ํŒŒ์ผ๋กœ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
์•„๋ฌด๋ž˜๋„ ๋ฌธ์ž์—ด๋กœ ์ญ‰~ ์ ๋Š” ๊ฒƒ ๋ณด๋‹จ Markdown ์„ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ๋”์šฑ ๋ณด๊ธฐ๋„ ์ข‹๊ณ , ์ž˜ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒ ์ฃ ?๐Ÿ˜‰ ๋…ธ์…˜ ์ฒ˜๋Ÿผ์š”!

Markdown ์ž‘์„ฑ ์œ„์น˜๋Š” /public/markdown/information/introduce.md ์ž…๋‹ˆ๋‹ค.
๋…ธ์…˜์— ์ž‘์„ฑํ•˜๋“ฏ ์ž‘์„ฑํ•ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค!

image



workExperience

image

์ง์žฅ ๊ฒฝ๋ ฅ์„ ๋ณด์—ฌ์ฃผ๋Š” ์˜์—ญ์ด์—์š”.

data.json์˜ ๋ฐฐ์—ด ์—ญ์ˆœ์œผ๋กœ ์ •๋ ฌ๋ฉ๋‹ˆ๋‹ค.
๋ฐฐ์—ด์˜ ๋’ค์ชฝ์œผ๋กœ ๊ฐˆ์ˆ˜๋ก ์ตœ์‹  ๊ฒฝ๋ ฅ์„ ์ถ”๊ฐ€ํ•  ๊ฒฝ์šฐ, ์ƒˆ๋กœ์šด ๊ฒฝ๋ ฅ์„ ์ถ”๊ฐ€ํ•  ๋•Œ ์ด์ „ ๊ฒฝ๋ ฅ์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š์•„๋„ ๋˜๋ฏ€๋กœ ์ด๋ ‡๊ฒŒ ๊ตฌ์„ฑํ–ˆ์–ด์š”.

  "workExperience": [
    {
      "id": 0,
      "name": "์ปคํ”ผํ”„๋ฆฐ์Šค 1ํ˜ธ์ ",
      "position": "Front-end Engineer",
      "period": ["2019. 01", "2019. 09"]
    },
    {
      "id": 1,
      "name": "์ปคํ”ผํ”„๋ฆฐ์Šค 2ํ˜ธ์ ",
      "position": "๋ฐ”๋ฆฌ์Šคํƒ€",
      "period": ["2022. 01", "now"]
    }
  ]

markdown

๊ทธ๋Ÿฐ๋ฐ, Foo Team, Bar Team ๋“ฑ์˜ ๊ฒฝ๋ ฅ ์ƒ์„ธ ์‚ฌํ•ญ์„ ์ ์„ ์ˆ˜๊ฐ€ ์—†์ฃ ?
๊ฒฝ๋ ฅ ์ƒ์„ธ ์—ญ์‹œ Markdown ์„ ์‚ฌ์šฉํ•ด์„œ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
์•„๋ฌด๋ž˜๋„ ๋ฌธ์ž์—ด๋กœ ์ญ‰~ ์ ๋Š” ๊ฒƒ ๋ณด๋‹จ Markdown ์„ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ๋”์šฑ ๋ณด๊ธฐ๋„ ์ข‹๊ณ , ์ž˜ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒ ์ฃ ?๐Ÿ˜‰

Markdown ์ž‘์„ฑ ์œ„์น˜๋Š” /public/markdown/workExperience/[id].md ์ž…๋‹ˆ๋‹ค.
data.json์— ๊ธฐ์ž…ํ•œ id์™€ ํŒŒ์ผ๋ช…์„ ๋งค์นญ์‹œ์ผœ์ฃผ์„ธ์š”. ๐Ÿค—

image

image

ํ•˜๋‚˜ ๋”, ์ดˆ๋ก์ƒ‰ ๋„ค๋ชจ ์ž๋ฆฌ์— ์ด๋ฏธ์ง€๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ์–ด์š”!
png ํŒŒ์ผ์„ /public/images/workExperience/[id].png ๊ฒฝ๋กœ์— ์ €์žฅํ•ด์ฃผ์„ธ์š”.
(์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€ ํŒŒ์ผ ์—†์ด ํ…์ŠคํŠธ๋กœ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์–ด์š”.)

์ด๋ฏธ์ง€๋Š” png ํ˜•์‹๋งŒ ๊ฐ€๋Šฅํ•˜๋ฉฐ, 120px ์ด์ƒ์˜ ์ •๋ฐฉํ˜• ์ด๋ฏธ์ง€ ๋ฅผ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค!

image



project

image

์ง€๊ธˆ๊นŒ์ง€ ์ง„ํ–‰ํ–ˆ๋˜ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋Š” ์˜์—ญ์ด์—์š”.

๊ฐ„๋žตํ•œ ์„ค๋ช…์„ ์ ๋Š” description์€ \n์œผ๋กœ ์ค„๋ฐ”๊ฟˆ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
data.json์˜ project์— ์ž‘์„ฑํ•˜์‹ค๋•Œ, isTeam: boolean ์„ ๊ธฐ์ž…ํ•จ์œผ๋กœ์จ ํŒ€ ํ”„๋กœ์ ํŠธ์™€ ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ๋ฅผ ๋‚˜๋ˆ ์„œ ๋ณด์—ฌ์ฃผ๊ฒŒ ๊ตฌ์„ฑํ–ˆ์–ด์š”.
isTeam: true์ธ ํ•ญ๋ชฉ๋ผ๋ฆฌ ํŒ€ ํ”„๋กœ์ ํŠธ์— ๋ฐฐ์—ด ์—ญ์ˆœ์œผ๋กœ ๋ณด์—ฌ์ง€๊ณ , isTeam: false์ธ ํ•ญ๋ชฉ๋ผ๋ฆฌ ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ์— ๋ฐฐ์—ด ์—ญ์ˆœ์œผ๋กœ ๋ณด์—ฌ์ง‘๋‹ˆ๋‹ค.

//๊ฐ„์†Œํ™”๋œ ์˜ˆ์‹œ

  "project": [
    {
      "name": "ํŒ€ ํ”„๋กœ์ ํŠธ 1",
      "description": "ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์„ค๋ช…์„ ์ ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.\n ์–ด๋–ค ํ”„๋กœ์ ํŠธ์ธ์ง€ ์ฃผ์ œ๋‚˜ ๊ฐ•์กฐํ•˜๊ณ  ์‹ถ์€ ๋ถ€๋ถ„์„ ์ ์–ด๋ณด์„ธ์š”.",
      "isTeam": true,
    },
    {
      "name": "๊ฐœ์ธ ํ”„๋กœ์ ํŠธ 1",
      "isTeam": false,
    },
    {
      "name": "ํŒ€ ํ”„๋กœ์ ํŠธ 2",
      "isTeam": true,
    },
    {
      "name": "๊ฐœ์ธ ํ”„๋กœ์ ํŠธ 2",
      "isTeam": false,
    },
  ],

์œ„ ๊ฒฝ์šฐ, ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค.

  • Team Project
    • ํŒ€ ํ”„๋กœ์ ํŠธ 2
    • ํŒ€ ํ”„๋กœ์ ํŠธ 1
  • Personal Project
    • ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ 2
    • ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ 1

markdown & image

์ง์žฅ ๊ฒฝ๋ ฅ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, markdown ์œผ๋กœ ๋‚ด์šฉ์„ ์ž‘์„ฑํ•˜๋ฉฐ, image ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.
markdown ๊ฒฝ๋กœ๋Š” /public/markdown/project/[id].md
image ๊ฒฝ๋กœ๋Š” /public/images/project/[id].md ์ž…๋‹ˆ๋‹ค.

image



activity

image

๋Œ€ํšŒ, ์ˆ˜์ƒ, ํ•ด์ปคํ†ค ๋“ฑ ๊ฐ์ข… ๊ฒฝํ—˜์„ ์ž‘์„ฑํ•˜๋Š” ๊ณณ์ด์—์š”.
๊ฐ„๋žตํ•œ ์„ค๋ช…์„ ์ ๋Š” description์€ \n์œผ๋กœ ์ค„๋ฐ”๊ฟˆ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
์—ฌ๊ธฐ๋Š” markdown ์ด๋‚˜ image ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
๊ตณ์ด ์—ฌ๊ธฐ๊นŒ์ง€...? ๋ผ๋Š” ์ƒ๊ฐ์— ๊ฐ„๋‹จํ•œ ์„ค๋ช… ์ •๋„๋งŒ ๋ฌธ์ž์—ด๋กœ ์ถœ๋ ฅํ•˜๊ฒŒ ํ•ด๋‘์—ˆ๋Š”๋ฐ, ํ•„์š”ํ•˜๋‹ค๋ฉด markdown ๋ฐ image ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์—…๋ฐ์ดํŠธํ•ด๋ณผ๊ฒŒ์š”!

  "activity": [
    {
      "id": 0,
      "name": "์ฒซ๋ฒˆ์งธ ํ™œ๋™",
      "period": ["2022. 06", "2022. 08"],
      "description": "์ฒซ๋ฒˆ์งธ ํ™œ๋™์— ๋Œ€ํ•œ\n ๊ฐ„๋žตํ•œ ์„ค๋ช…"
    },
    {
      "id": 1,
      "name": "๋‘๋ฒˆ์งธ ํ™œ๋™",
      "period": ["2022. 06", "2022. 08"],
      "description": "๋‘๋ฒˆ์งธ ํ™œ๋™์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ์„ค๋ช…"
    }
  ],




education

image

์ „๊ณต, ๋ถ€ํŠธ์บ ํ”„, ๊ฐ์ข… ๊ต์œก์— ๋Œ€ํ•ด ์ ์–ด์ฃผ์„ธ์š”.
๊ฐ„๋žตํ•œ ์„ค๋ช…์„ ์ ๋Š” description์€ \n์œผ๋กœ ์ค„๋ฐ”๊ฟˆ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
์œ„์˜ activity์™€ ๋™์ผํ•œ ๊ตฌ์„ฑ์ด๋ผ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค~ ํœ˜๋ฆฌ๋ฆญ~ ๐Ÿ˜‡

๋Œ€์ถฉ ๋”์ด์ƒ์˜ ์ž์„ธํ•œ ์„ค๋ช…์€ ์ƒ๋žตํ•œ๋‹ค ์งค

  "education": [
    {
      "id": 0,
      "name": "์ฒซ๋ฒˆ์งธ ๊ต์œก",
      "period": ["2013. 02", "2020. 02"],
      "description": "์ฒซ๋ฒˆ์งธ ๊ต์œก์—\n ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ์„ค๋ช…"
    },
    {
      "id": 1,
      "name": "๋‘๋ฒˆ์งธ ๊ต์œก",
      "period": ["2013. 02", "2020. 02"],
      "description": "๋‘๋ฒˆ์งธ ๊ต์œก์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ์„ค๋ช…"
    }
  ],




certificate

image

๊ฐ์ข… ์ž๊ฒฉ ์ฆ๋ช…์— ๋Œ€ํ•ด ์ ์–ด์ฃผ์„ธ์š”. ์ž๊ฒฉ ์‹œํ—˜์˜ ์ฃผ๊ด€์ฒ˜๋„ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.
์—ฌ๊ธฐ๋„ ์œ„์™€ ๊ฑฐ์˜ ๋™์ผํ•œ ๊ตฌ์„ฑ์ด๋ผ... ํ•˜ํ•ซ... ๐Ÿ˜…

  "certificate": [
    {
      "id": 0,
      "name": "TOEIC 1000์ ",
      "date": "2019. 07. 28",
      "organizer": "ETS" // ์ฃผ๊ด€์ฒ˜๋ฅผ ์ ์–ด์ฃผ์„ธ์š”.
    },
    {
      "id": 1,
      "name": "OPIC IH",
      "date": "2019. 07. 28",
      "organizer": "ETS"
    }
  ]




COLOR ๋ณ€๊ฒฝํ•˜๊ธฐ

๐Ÿšจ ๋ฐ˜๋“œ์‹œ ์ปฌ๋Ÿฌ๋ฅผ ๋ณ€๊ฒฝํ•ด์ฃผ์„ธ์š” ๐Ÿšจ

์—ฌ๋Ÿฌ ์‚ฌ๋žŒ์ด ๋„ˆ๋ฌด๋‚˜๋„ ๋˜‘๊ฐ™์€ ๋””์ž์ธ์˜ ํฌํŠธํด๋ฆฌ์˜ค๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด ๊ทธ๊ฒƒ๋„ ๋ฌธ์ œ๊ฒ ์ฃ ?๐Ÿ˜‰
tailwind ์˜ theme ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŽธํ•˜๊ฒŒ ์ปฌ๋Ÿฌ๋ฅผ ์ปค์Šคํ…€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด๋‘์—ˆ์œผ๋‹ˆ ๊ผญ ๋ณ€๊ฒฝํ•ด์„œ ์‚ฌ์šฉํ•ด์ฃผ์„ธ์š”!

ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ ๊ฒฝ๋กœ์˜ /tailwind.config.js ๋ฅผ ์ˆ˜์ •ํ•ด์ฃผ์„ธ์š”.
๊ฒ€์ •, ํฐ์ƒ‰ ๊ณ„ํ†ต์˜ ๋ชจ๋…ธํ†ค์€ ํฐํŠธ ์ปฌ๋Ÿฌ, ๊ฐ€๋กœ์„ , ๋ฐฐ๊ฒฝ์ƒ‰ ๋“ฑ์— ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตณ์ด ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์•„๋„ ๊ดœ์ฐฎ์•„์š”.
PRIMARY_LIGHT PRIMARY PRIMARY_HEAVY GRADIENT_FROM GRADIENT_TO 5๊ฐ€์ง€ ์ƒ‰๋งŒ ๋ณ€๊ฒฝํ•ด์ฃผ์„ธ์š”!

...
theme: {
    extend: {
      // NOTE: ๋ณธ ํ…œํ”Œ๋ฆฟ์€ ๋Œ€๋ถ€๋ถ„์ด ๋ชจ๋…ธํ†ค์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. primary ์ปฌ๋Ÿฌ๋งŒ ์ˆ˜์ •ํ•˜์—ฌ ์‚ฌ์šฉํ•˜์‹œ๋Š” ๊ฒƒ์„ ๊ถŒ์žฅ๋“œ๋ฆฝ๋‹ˆ๋‹ค.
      colors: {
        GRAY_LIGHT: "#f1f3f5",
        GRAY: "#adb5bd",
        GRAY_HEAVY: "#868e96",
        GRAY_EXTRAHEAVY: "#495057",
        BLACK: "#212529",
        /**
         * @description selection(๋“œ๋ž˜๊ทธ ๋ธ”๋ก)์— ์‚ฌ์šฉ๋˜๋Š” ์ปฌ๋Ÿฌ์ž…๋‹ˆ๋‹ค.
         */
        PRIMARY_LIGHT: "#c3fae8",

        /**
         * @description ์ž๊ธฐ์†Œ๊ฐœ์˜ ์ด๋ฆ„ ๋ถ€๋ถ„, code tag์˜ darkmode์— ์‚ฌ์šฉ๋˜๋Š” ์ปฌ๋Ÿฌ์ž…๋‹ˆ๋‹ค.
         */
        PRIMARY: "#12b886",

        /**
         * @description code tag, link hover icon์— ์‚ฌ์šฉ๋˜๋Š” ์ปฌ๋Ÿฌ์ž…๋‹ˆ๋‹ค.
         */
        PRIMARY_HEAVY: "#087f5b",

        /**
         * @description ํŽ˜์ด์ง€ ์ตœ์ƒ๋‹จ gradient์˜ ์‹œ์ž‘ ์ปฌ๋Ÿฌ์ž…๋‹ˆ๋‹ค.
         */
        GRADIENT_FROM: "#51cf66",

        /**
         * @description ํŽ˜์ด์ง€ ์ตœ์ƒ๋‹จ gradient์˜ ์ข…๋ฃŒ ์ปฌ๋Ÿฌ์ž…๋‹ˆ๋‹ค.
         */
        GRADIENT_TO: "#0c8599",
      },
    },
  },

๋‚˜๋Š” ์–ด๋–ค ์ƒ‰ ์กฐํ•ฉ์ด ์ข‹์€์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค! ๊ณ ๋ฏผ์ด์‹  ๋ถ„๋“ค์€ ๋งˆ์Œ์— ๋“œ๋Š” ๋ฉ”์ธ ์ปฌ๋Ÿฌ ํ•˜๋‚˜๋งŒ ์ •ํ•˜์‹  ํ›„, ์–ด๋„๋น„ ์ปฌ๋Ÿฌ ์—์„œ ์œ ์‚ฌ ์Œ์˜ ์œผ๋กœ ์–ด์šธ๋ฆฌ๋Š” ์ƒ‰์„ ์ฐพ์•„๋ณด์…”๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”๐Ÿ˜‰ ํ˜น์€, ์–ด๋„๋น„ ์ปฌ๋Ÿฌ์˜ ํƒ์ƒ‰ ํƒญ์—์„œ ์ธ์‚ฌ์ดํŠธ๋ฅผ ์–ป์–ด๋ณด์…”๋„ ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.๐ŸŒˆ





SEO

์ด์ œ SEO๋ฅผ ํ–ฅ์ƒ์‹œ์ผœ ๋ณผ๊นŒ์š”?
very simple portfolio ๋Š” ํŽธํ•œ SEO ์„ค์ •์„ ์œ„ํ•ด next-seo ๋ฅผ ์„ค์น˜ํ•ด๋‘์—ˆ์–ด์š”.

/src/pages/_app.tsx ๊ฒฝ๋กœ์˜ DEFAULT_SEO ๋งŒ ์ˆ˜์ •ํ•ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค! ๊ฐ ์˜ต์…˜์— ๋Œ€ํ•œ ์ •๋ณด๋Š” next-seo ๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”!

/**
 * @description SEO๋ฅผ ์œ„ํ•ด ๋ณธ์ธ์˜ ์ •๋ณด๋กœ ์ˆ˜์ •ํ•ด์ฃผ์„ธ์š”.
 */
const DEFAULT_SEO = {
  title: "ํ™๊ธธ๋™ | Front-End Dev",
  description: "์•ˆ๋…•ํ•˜์„ธ์š”, ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž ํ™๊ธธ๋™์ž…๋‹ˆ๋‹ค.",
  canonical: "https://www.naver.com/",
  openGraph: {
    type: "website",
    locale: "ko_KR",
    url: "https://www.naver.com/",
    title: "ํ™๊ธธ๋™ | Front-End Dev",
    site_name: "ํ™๊ธธ๋™ | Front-End Dev",
    images: [
      {
        url: "/share.png", // ์นด์นด์˜คํ†ก์„ ๋น„๋กฏํ•œ ๊ณต์œ ์šฉ ์ด๋ฏธ์ง€ ๊ฒฝ๋กœ public/share.png์— ์›ํ•˜๋Š” ์ด๋ฏธ์ง€๋ฅผ ์ €์žฅํ•ด์ฃผ์„ธ์š”.
        width: 285,
        height: 167,
        alt: "ํ™๊ธธ๋™ | Front-End Dev",
      },
    ],
  },
  additionalLinkTags: [
    {
      rel: "icon",
      href: "/favicon.ico",
    },
  ],
  additionalMetaTags: [
    {
      name: "application-name",
      content: "ํ™๊ธธ๋™ | Front-End Dev",
    },
    {
      name: "msapplication-tooltip",
      content: "ํ™๊ธธ๋™ | Front-End Dev",
    },
    {
      name: "viewport",
      content: "width=device-width, initial-scale=1",
    },
  ],
};

์žŠ์ง€๋ง๊ณ  favicon๋„ ์„ค์ •ํ•ด์ฃผ์„ธ์š”! (ํƒญ์˜ ์กฐ๊ทธ๋งˆํ•œ ์•„์ด์ฝ˜)
/public/favicon.ico ๊ฒฝ๋กœ์— ico ํŒŒ์ผ์„ ์ €์žฅํ•ด์ฃผ์„ธ์š”.
์›ํ•˜๋Š” ์ด๋ฏธ์ง€๋ฅผ favicon์œผ๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” realfavicongenerator๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์…”๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”.

image





Vercel ๋ฐฐํฌํ•˜๊ธฐ

Vercel์€ ํด๋ฆญ ๋ช‡ ๋ฒˆ์œผ๋กœ ์•„์ฃผ์•„์ฃผ ํŽธํ•˜๊ฒŒ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฐํฌ, ํ˜ธ์ŠคํŒ… ์„œ๋น„์Šค์—์š”.
https://vercel.com/new ์—์„œ github์œผ๋กœ ๋กœ๊ทธ์ธํ•˜์‹  ํ›„, ํฌํŠธํด๋ฆฌ์˜ค ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์„ ํƒํ•˜์—ฌ ๋ฐฐํฌํ•ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค!

๋„ˆ๋ฌด ํŽธํ•˜๋‹ค...!

image



Google Analytics

ํฌํŠธํด๋ฆฌ์˜ค์— ๋ฐฉ๋ฌธ์ž๊ฐ€ ๋ช‡๋ช…์ธ์ง€ ๊ถ๊ธˆํ•˜์ง€ ์•Š์œผ์…จ๋‚˜์š”?๐Ÿ•ต๏ธโ€โ™€๏ธ
๊ฐ„๋‹จํ•œ GA ์„ค์ •๋งŒ์œผ๋กœ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค!



Step 1๏ธโƒฃ Google Analytics์— ๊ฐ€์ž…ํ•ด์ฃผ์„ธ์š”.

https://analytics.google.com/ ์— ๋ฐฉ๋ฌธํ•˜์—ฌ ๊ฐ€์ž…์„ ์ง„ํ–‰ํ•ด์ฃผ์„ธ์š”.
๊ฐ„๋‹จํ•œ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•˜๊ณ , ํ”Œ๋žซํผ์„ ์›น์œผ๋กœ ์„ ํƒํ•ด์ฃผ์‹œ๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ํ™”๋ฉด์ด ๋‚˜์˜ต๋‹ˆ๋‹ค.

image

์—ฌ๊ธฐ์˜ Vercel๋กœ ๋ฐฐํฌํ•œ ์šฐ๋ฆฌ ํฌํŠธํด๋ฆฌ์˜ค์˜ url์„ ์ž‘์„ฑํ•ด์ค๋‹ˆ๋‹ค.
๊ทธ๋Ÿผ ์•„๋ž˜์™€ ๊ฐ™์ด G- ๋กœ ์‹œ์ž‘ํ•˜๋Š” ์ธก์ • ID ๋ฅผ ์ œ๊ณตํ•ด์ค„๊ฑฐ์—์š”.

image

- Step 2๏ธโƒฃ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ ๊ฒฝ๋กœ์— /.env ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.
์ธก์ • ID๋ฅผ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๊ณ , ์™ธ๋ถ€๋กœ ๋…ธ์ถœ๋˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. (gitignore๋Š” ์ด๋ฏธ ์ž‘์„ฑํ•ด๋‘์—ˆ์–ด์š”!)


NEXT_PUBLIC_GOOGLE_ANALYTICS = 'G-0000000000' // ์•„๊นŒ ๋ฐ›์€ ์ธก์ • ID๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.


์ด์ œ, /src/lib/gtag.ts ํด๋”์™€ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.
GA์—์„œ ์ œ๊ณตํ•˜๋Š” ํƒœ๊ทธ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š” ํŽ˜์ด์ง€๊ฐ€ ๋ณด์—ฌ์ง€๋ฉด ์ง‘๊ณ„๋  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” pageview ํ•จ์ˆ˜๊ฐ€ ์ž‘์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
์•„๋งˆ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ• ํ…๋ฐ, ๊ณ„์†ํ•ด์„œ ์ง„ํ–‰ํ•˜์‹œ๋ฉด ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค!

const GA_TRACKING_ID = process.env.NEXT_PUBLIC_GOOGLE_ANALYTICS;

export const pageview = (url: URL) => {
  window.gtag("config", GA_TRACKING_ID, {
    page_path: url,
  });
};

interface GTagEvent {
  action: string;
  category?: string;
  label?: string;
  value?: string;
}

export const event = ({ action, category, label, value }: GTagEvent) => {
  window.gtag("event", action, {
    event_category: category,
    event_label: label,
    value: value,
  });
};

๋ฃจํŠธ ๊ฒฝ๋กœ์— /environment.d.ts ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.

namespace NodeJS {
  interface ProcessEnv extends NodeJS.ProcessEnv {
    NEXT_PUBLIC_GOOGLE_ANALYTICS: string;
  }
}

ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ํ™˜๊ฒฝ์ด๋ฏ€๋กœ gtag์˜ ํƒ€์ž…์„ ์„ค์น˜ํ•ด์ค๋‹ˆ๋‹ค. > ์ œ๊ฐ€ ์ด๋ฏธ ์„ค์น˜ํ•ด๋‘์—ˆ์–ด์š” ๐Ÿ˜‰

yarn add -D @types/gtag.js

or

npm install @types/gtag.js --dev

/src/pages/_app.tsx ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

import * as gtag from "../lib/gtag";
const GA_TRACKING_ID = process.env.NEXT_PUBLIC_GOOGLE_ANALYTICS;

const App = ({ Component, pageProps }: AppProps) => {
  const router = useRouter();

  useEffect(() => {
    const handleRouteChange = (url: URL) => {
      gtag.pageview(url);
    };
    router.events.on("routeChangeComplete", handleRouteChange);
    router.events.on("hashChangeComplete", handleRouteChange);
    return () => {
      router.events.off("routeChangeComplete", handleRouteChange);
      router.events.off("hashChangeComplete", handleRouteChange);
    };
  }, [router.events]);

  return (
    <>
      {/* Global Site Tag (gtag.js) - Google Analytics */}
      <Script
        strategy="afterInteractive"
        src={`https://www.googletagmanager.com/gtag/js?id=${GA_TRACKING_ID}`}
      />
      <Script
        id="gtag-init"
        strategy="afterInteractive"
        dangerouslySetInnerHTML={{
          __html: `
        window.dataLayer = window.dataLayer || [];
        function gtag(){dataLayer.push(arguments);}
        gtag('js', new Date());
        gtag('config', '${GA_TRACKING_ID}', {
          page_path: window.location.pathname,
        });
      `,
        }}
      />
      <DefaultSeo {...DEFAULT_SEO} />
      
      ... ํ›„๋žต


- Step 3๏ธโƒฃ Vercel์—์„œ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ๋“ฑ๋กํ•ด์ฃผ์„ธ์š”.

์•„๊นŒ .env๋กœ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ๋“ฑ๋กํ–ˆ์ง€๋งŒ, vercel์— ๋”ฐ๋กœ ๋“ฑ๋กํ•ด์ฃผ์–ด์•ผํ•ด์š”. (.env๋Š” gitignore๋กœ ์ธํ•ด ๊นƒ์— ํฌํ•จ๋˜์ง€ ์•Š์•„์š”)
vercel์—์„œ ํฌํŠธํด๋ฆฌ์˜ค ํ”„๋กœ์ ํŠธ์˜ ์„ค์ •์œผ๋กœ ๋“ค์–ด๊ฐ„ ๋‹ค์Œ, ์•„๋ž˜ ์‚ฌ์ง„์ฒ˜๋Ÿผ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ๋“ฑ๋กํ•ด์ฃผ์„ธ์š”.

image

- Step 4๏ธโƒฃ GA ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘์„ ๊ธฐ๋‹ค๋ ค์ฃผ์„ธ์š”.

GA๊ฐ€ ์—ด์‹ฌํžˆ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜์—ฌ ๋ฉฐ์น ๋‚ด๋กœ ๋ฐ์ดํ„ฐ ์กฐํšŒ๊ฐ€ ๊ฐ€๋Šฅํ•ด์งˆ๊ฑฐ์—์š”.
https://analytics.google.com/ ์—์„œ ํŽ˜์ด์ง€ ๋ฐฉ๋ฌธ๊ณผ ์‹ค์‹œ๊ฐ„ ๋ฐฉ๋ฌธ์ž๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ๋ ๊ฑฐ์—์š”!

๊ทธ๋ฆฌ๊ณ , ๊ตฌ๊ธ€์— ํฌํŠธํด๋ฆฌ์˜ค๊ฐ€ ๊ฒ€์ƒ‰๋  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ๊ธ€ ์„œ์น˜์ฝ˜์†”์— URL ์ƒ‰์ธ ์ƒ์„ฑ์„ ์š”์ฒญํ•˜์„ธ์š”!



Done

์ถ•ํ•˜ํ•ฉ๋‹ˆ๋‹ค! ํฌํŠธํด๋ฆฌ์˜ค๋ฅผ ๋งŒ๋“œ์…จ๊ตฐ์š”! ๐Ÿ‘๐Ÿ‘๐Ÿ‘๐Ÿ‘๐Ÿ‘๐Ÿ‘๐Ÿ‘๐Ÿ‘๐Ÿ‘๐Ÿ‘๐Ÿ‘๐Ÿ‘๐Ÿ‘๐Ÿ‘๐Ÿ‘๐Ÿ‘

๋ฒ„๊ทธ๋‚˜ ๊ฐœ์„  ๋“ฑ์˜ ์˜๊ฒฌ์€ ์–ธ์ œ๋“  ํ™˜์˜์ž…๋‹ˆ๋‹ค! ๐Ÿ‘๐Ÿ‘๐Ÿ‘๐Ÿ‘๐Ÿ‘๐Ÿ‘๐Ÿ‘๐Ÿ‘๐Ÿ‘๐Ÿ‘๐Ÿ‘๐Ÿ‘๐Ÿ‘๐Ÿ‘๐Ÿ‘๐Ÿ‘

very-simple-portfolio's People

Contributors

sjoleee avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.