Skip to content

Latest commit

ย 

History

History
224 lines (149 loc) ยท 9.13 KB

What i learned.md

File metadata and controls

224 lines (149 loc) ยท 9.13 KB

Next.js

โœ… json ํŒŒ์ผ ์ฝ์–ด์˜ค๊ธฐ

const conceptList = require('../../../public/data/concept.json')

require ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. parse ์•ˆํ•ด๋„ ๋ฐ”๋กœ object ํ˜•ํƒœ๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

โœ… className ์—ฌ๋Ÿฌ๊ฐœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

import classNames from 'classnames';
...
className={classNames({[styles.conceptitem]: true, [styles.active]: selectedItem === item})}

react์—์„œ๋Š” ๊ณต๋ฐฑ์œผ๋กœ ๋„์›Œ์„œ ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, next.js ๋Š” ์ง€์›๋˜์ง€ ์•Š๋Š”๋‹ค. ์ข€ ๊ดด์ƒํ•ด๋ณด์ด๋Š” ๋ชจ์Šต์ด์ง€๋งŒ, ์œ„ ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•˜๋ฉด ์กฐ๊ฑด๋ถ€ ์Šคํƒ€์ผ๋ง์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

โœ… ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—๋Š” ์ด๋ฒคํŠธ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

โŒ Bad

<ConceptItem selectedItem={selectedItem} onclick={() => clickItem()} item={ele} key={ ele.title }/>

๐ŸŸข Good

<ConceptItem selectedItem={selectedItem} clickItem={clickItem} item={ele} key={ ele.title }/> // ๋ถ€๋ชจ
...
<div onClick={() => clickItem(item)}></div> // ์ž์‹

์ปดํฌ๋„ŒํŠธ์— onclickItem ์„ ์‚ฌ์šฉํ•˜๋ฉด, ์ด๋ฅผ props ๋กœ ์ธ์‹ํ•œ๋‹ค. ์ด๋ฒคํŠธ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ „์ฒด๋ฅผ div ๋“ฑ์˜ html ํƒœ๊ทธ๋กœ ๋ฌถ๊ฑฐ๋‚˜, ์ž์‹ ์ปดํฌ๋„ŒํŠธ์— ํ•จ์ˆ˜ ์ž์ฒด๋ฅผ props ๋‚ด๋ ค์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

React & Library

โœ… project start

ํ”„๋กœ์ ํŠธ ์‹œ์ž‘ํ•˜๊ธฐ

npm creat-react-app <app name>

โœ… import local image(resource)

<StyledPeopleSayImg src={ `assets/peopleSay/${item.name}.png` }/>

react์—์„œ๋Š” image ๋ผ๋Š” ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, ์ด๋ฏธ์ง€์˜ ๊ฒฝ๋กœ๋ฅผ import ํ•˜์—ฌ ๊ฐ์ฒด๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ด๋ฏธ์ง€๋ฅผ ๋™์ ์œผ๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด, ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ์•„์ดํ…œ์„ ๋ณด์—ฌ์ฃผ๋ ค๊ณ  ํ• ๋•Œ, ๋ฐ˜๋ณต๋˜๋Š” ๋ชจ๋“  ์•„์ดํ…œ์˜ ์‚ฌ์ง„์„ ๋ชจ๋‘ import ํ•ด์•ผํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜์ง€ ์•Š๊ณ , ์ด๋ฏธ์ง€๋ฅผ ๋™์ ์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐฑํ‹ฑ ์„ ์‚ฌ์šฉํ•ด์„œ Template literals ์„ ์‚ฌ์šฉํ•œ๋‹ค. ์•ˆํƒ€๊นŒ์šด ์ ์€, react์—์„œ๋Š” ์ด ๋ฐฉ์‹์„ ๊ถŒ์žฅํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฝ๊ณ ๋ฌธ๊ตฌ๋ฅผ ๋ฟœ์–ด๋‚ธ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๋ฐ”๋กœ ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฑ‰์–ด๋‚ธ๋‹ค.

  Line 17:17:  img elements must have an alt prop, either with meang for decorative images  jsx-a11y/alt-text

์ด๊ฒƒ๋ง๊ณ  ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์ฐพ์ง€ ๋ชปํ•ด์„œ, ์ผ๋‹จ์€ ๊ฒฝ๊ณ ๋ฌธ๊ตฌ๋ฅผ ๋ฌด์‹œํ•˜๋ฉด์„œ ์ง„ํ–‰์ค‘์ด๋‹ค.

โœ… github page deploy

์ง€๊ธˆ ํ•˜๋Š” ์ž‘์—…์€ ์„œ๋ฒ„์—†์ด ํ”„๋ก ํŠธ + ์ •์  ํŒŒ์ผ(json, assests)๋กœ๋งŒ ๊ตฌ์„ฑํ•˜๊ณ  ์žˆ๋‹ค. ๊ฐ„๋‹จํ•œ ํ”„๋ก ํŠธ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฐฐํฌํ•˜๋Š” ๋ฐ ๊ตณ์ด ํ”„๋ฆฌํ‹ฐ์–ด ์จ๊ฐ€๋ฉด์„œ aws๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. Netlify ๋ฅผ ์‚ฌ์šฉํ•ด๋„ ์ข‹์ง€๋งŒ, ์ด๋ฒˆ์—๋Š” github page๋กœ ์ดˆ์ดˆ์ดˆ์ดˆ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ•ด๋ดค๋‹ค. ์ฐธ๊ณ ํ•œ ๋ธ”๋กœ๊ทธ๋Š” ์—ฌ๊ธฐ

๋ฐฉ๋ฒ•

  1. github์— ํ”„๋กœ์ ํŠธ๋ฅผ ์˜ฌ๋ฆฐ๋‹ค.

  2. local์—์„œ gh-pages ๋ฅผ ์„ค์น˜ํ•œ๋‹ค.

  3. scripts ์— ์•„๋ž˜ ๋‚ด์šฉ์„ ์ถ”๊ฐ€ or ์ˆ˜์ •ํ•œ๋‹ค.

    "predeploy": "npm run build",
    "deploy": "gh-pages -d build"
  4. ๋งจ์œ„์— homepage๋ฅผ https://<๋‚ด id>.github.io/<๋‚ด ๋ ˆํฌ ์ด๋ฆ„> ์œผ๋กœ ์ˆ˜์ •ํ•œ๋‹ค. ์ด ์ฃผ์†Œ๋Š” ๋‚ด ํ”„๋กœ์ ํŠธ ๋ ˆํฌ์ง€ํ† ๋ฆฌ์—์„œ setting > GitHub Pages ์— ์žˆ๋Š” ๋งํฌ์™€ ๋™์ผํ•˜๋‹ค. ex) "homepage": "https://parkjisu6239.github.io/2021_Portfolio",

  5. ์ •์  ๋ฆฌ์†Œ์Šค base_url์„ ์ˆ˜์ •ํ•ด์•ผ, ํŽ˜์ด์ง€์— ์ •์ƒ์ ์œผ๋กœ ๋žœ๋”๋œ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด router๋ฅผ ์ •์˜ํ•œ ์ปดํฌ๋„ŒํŠธ(์ผ๋ฐ˜์ ์œผ๋กœ App.js) ๋กœ ๊ฐ€์„œ ์•„๋ž˜ ์ฒ˜๋Ÿผ ์ˆ˜์ •ํ•œ๋‹ค.

    import './App.css';
    ...
    import { BrowserRouter, Route, Switch } from 'react-router-dom'
    
    function App() {
      return (
        <BrowserRouter basename={process.env.PUBLIC_URL}>
          <div className="App">
            ...
          </div>
        </BrowserRouter>
      );
    }
    
    export default App;
    
  6. ์ดํ›„ terminal์—์„œ npm run develop ๋ฅผ ํ•˜๋ฉด, ๋‚ด ๋ ˆํฌ์ง€ํ† ๋ฆฌ์— gh-pages ๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ๋ธŒ๋žœ์น˜๊ฐ€ ์ž๋™ ์ƒ์„ฑ๋˜๊ณ , build ํŒŒ์ผ์ด push ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์œ„์—์„œ ์„ค์ •ํ•œ homepage ์ฃผ์†Œ๋กœ ์ ‘์†ํ•˜๋ฉด, ๋ฐฐํฌ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

โœ… Add style

react์—์„œ ์Šคํƒ€์ผ์„ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๊ฝค๋‚˜ ๋‹ค์–‘ํ•˜๋‹ค. ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•œ ๋ฐฉ๋ฒ•์€ ํฌ๊ฒŒ 3๊ฐ€์ง€๋กœ, ์‚ฌ์‹ค ์ •ํ™•ํžˆ ๋ญ๊ฐ€ ๋‚ซ๋‹ค๊ฑฐ๋‚˜ ๋ฌด์—‡์ด ์˜ณ๋‹ค๋Š” ๋ชจ๋ฅด๊ฒ ๊ณ , ์ด๋Ÿฐ ๋ฐฉ๋ฒ•๋“ค์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ •๋ฆฌํ•˜๊ณ ์ž ํ•œ๋‹ค.

1. vanilla(?) css

์—ฌ๋Š ํ”„๋ก ํŠธ์—”๋“œ ํ˜น์€ ํ”„๋ ˆ์ž„์›Œํฌ ์—†์ด html์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, element์— class (react์—์„œ๋Š” className)์„ ์ง€์ •ํ•˜๊ณ , ์Šคํƒ€์ผ์‹œํŠธ(.css) ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์„œ ์ ์šฉํ•˜๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•. ํด๋ž˜์Šค๋ฅผ ๋ฌธ์ž์—ด๋กœ ์ง€์ •ํ•˜๋ฉฐ, ์—ฌ๋Ÿฌ๊ฐœ์ผ ๊ฒฝ์šฐ ๋„์–ด์“ฐ๊ธฐ๋ฅผ ํ•˜๋ฉด ๋˜๊ณ , ๋ฐฑํ‹ฑ์„ ์‚ฌ์šฉํ•ด์„œ ์กฐ๊ฑด๋ถ€ ํด๋ž˜์Šค ์ง€์ •๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

  • ์žฅ์ : js์™€ css ๋ถ„๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ์‚ฌ์šฉ์ด ์‰ฝ๋‹ค.
  • ๋‹จ์ : ๋™์ผํ•œ ์ด๋ฆ„์˜ class๊ฐ€ ์žˆ๋‹ค๋ฉด, ์ด์— ์ ์šฉ๋œ ์Šคํƒ€์ผ์ด ์ค‘์ฒฉ๋œ๋‹ค. ์Šค์ฝ”ํ”„๋ฅผ ๊ณ ๋ คํ•ด์•ผํ•˜๋ฉฐ, ๊ทธ๊ฒŒ ์•„๋‹ˆ๋ผ๋ฉด ์ด๋ฆ„์„ unique ํ•˜๊ฒŒ ์ง“๋Š” ๊ฒƒ์ด ์•ˆ์ „ํ•œ๋‹ค.

2. module.css

1๋ฒˆ์˜ ๋‹จ์ ์„ ๋ณด์™„ํ•˜๊ณ ์ž, ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ธ ๊ฒƒ ๊ฐ™๋‹ค. style๋„ ๋ชจ๋“ˆํ™”ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ. ์‚ฌ์šฉ๋ฐฉ๋ฒ•์€ js ํŒŒ์ผ์—์„œ ์•„๋ž˜์™€ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ importํ•˜๊ณ  ์‚ฌ์šฉํ•œ๋‹ค. ํด๋ž˜์Šค๋ฅผ ์˜ค๋ธŒ์ ํŠธ ํ˜•ํƒœ๋กœ ์ง€์ •ํ•˜๋ฉฐ, ๋ฐฑํ‹ฑ์„ ์‚ฌ์šฉํ•ด์„œ ์กฐ๊ฑด๋ถ€ ํด๋ž˜์Šค ์ง€์ •๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

import styles from './NavBar.module.css'

export default function sample() {
    return (
        <div className={styles.title}>
            <div className={styles.hi}>
      			Hi
        	</div>
        </div>
    )
}
  • ์žฅ์  : ์„œ๋กœ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ฐ™์€ ์ด๋ฆ„์˜ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด๋„ ์ค‘์ฒฉ๋˜์ง€ ์•Š๋Š”๋‹ค. module.css๋ฅผ importํ•œ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ์—๋งŒ ์ ์šฉ๋œ๋‹ค. js์™€ css๋ฅผ ๋ณ„๋„๋กœ ๊ด€๋ฆฌ ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹จ์  : ์‹ค์ œ ๋žœ๋”๋ ๋•Œ ์ด๋ฆ„์ด ๋‹ค๋ฅด๋‹ค ์‹ค์ œ ์ด๋ฆ„์€ Concept_title__2xS7g ์ด๋Ÿฐ์‹์œผ๋กœ ์ƒ๊ธด๋‹ค. ๊ทธ๋ž˜์„œ ์ฟผ๋ฆฌ์…€๋ ‰ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ(์•ˆ์“ฐ๋Š”๊ฒŒ ์ข‹์Œ) ์–ด๋ ต๋‹ค.

3. styled component

์•„๋งˆ react์—์„œ ๊ฐ€์žฅ ๋งŽ์ด? ์‚ฌ์šฉํ•˜๋Š” ๋“ฏํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค. css๋ฅผ js๋กœ ํ• ๋‹นํ•œ๋‹ค. ๊ทธ๋ž˜์„œ css๋„ ๋ชจ๋‘ js ํŒŒ์ผ์— ์ž‘์„ฑ๋˜์–ด ์žˆ์–ด, ์ปดํฌ๋„ŒํŠธ๋‹น ํŒŒ์ผ์€ ๋‹จ ํ•œ๊ฐœ๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค. ์‚ฌ์šฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๋“ฏ์ด ์‚ฌ์šฉํ•œ๋‹ค. styled.<ํƒœ๊ทธ ์ด๋ฆ„>์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , element๋ฅผ custom ํ•˜๋Š” ๋Š๋‚Œ์ด๋‹ค. ์ž์‹ ์š”์†Œ๋‚˜ ๊ธฐํƒ€ ์„ ํƒ์ž๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ž๊ธฐ์ž์‹ ์„ &๋กœ ๋‘๊ณ  ์‚ฌ์šฉํ•œ๋‹ค. ๋ฏธ๋””์–ด ์ฟผ๋ฆฌ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

import styled from 'styled-components';

export default function NavBar() {
    const [isShow, setIsShow] = useState(false) 

    return (
        <nav>
            <StyledDropdown/>
        </nav>
    )
}

const StyledDropdown = styled.div`
    position: absolute;
    top: 80px;
    right: 10px;
    z-index: 10;
    height: 0%;
    text-align: center;
    background-color: white;
    border-radius: 3px;
    transition: all 1s ease;
    border: 0px solid grey;
    overflow: hidden;
    & > svg {
        width: 100%;
        height: 42px;
        color: red;
        cursor: pointer
    }
    & > * {
        padding: 10px;
        border-bottom: 1px solid grey;
    }
    & > div:hover {
        color: rgb(84, 105, 190);
    }
    & > div:last-child {
        padding: 10px;
        border-bottom: none;
    }
    &.showMenu {
        height: 360px;
        border: 1px solid grey;
    }
`;
  • ์žฅ์  : ํ•˜๋‚˜์˜ jsํŒŒ์ผ์—์„œ css๋„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. js๋กœ css๋ฅผ ์ œ์–ดํ•œ๋‹ค. props๋ฅผ ๋‚ด๋ฆด ์ˆ˜ ์žˆ์–ด์„œ ํ•จ์ˆ˜์ฒ˜๋Ÿผ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๊ณ  ๋ฐ์ดํ„ฐ์— ๋”ฐ๋ผ ๋™์ ์œผ๋กœ ์›€์ง ์ผ ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹จ์ : style ๊ด€๋ จ ์„ค์ •์ด ๋งŽ์•„์ง€๋ฉด, js๊ฐ€ ์ง€์ €๋ถ„ํ•ด ๋ณด์ธ๋‹ค. ์–ด๋””๊นŒ์ง€๋‚˜ ์ด ํŒŒ์ผ์€ js ํŒŒ์ผ์ด๋ผ์„œ css ์ž๋™์™„์„ฑ์ด ์•ˆ๋œ๋‹ค.

๊ฒฐ๋ก !

  • ๋ญ˜ ์จ์•ผ๋งŒ ํ•œ๋‹ค๋Š” ์ •๋‹ต์€ ์—†์ง€๋งŒ, ํ•˜๋‚˜๋กœ ํ†ต์ผํ•˜๋Š” ๊ฒƒ์ด ๋ณด๊ธฐ ์ข‹์„ ๊ฒƒ ๊ฐ™๊ธดํ•˜๋‹ค. ๋‚œ 3๊ฐœ ๋‹ค ์“ฐ๊ณ ์žˆ์ง€๋งŒ...

  • ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” element์ด๋ฉฐ(์˜ˆ๋ฅผ ๋“ค๋ฉด button) ๋™์ผํ•œ ์Šคํƒ€์ผ์„ ์ ์šฉํ•˜๊ณ ์ž ํ•œ๋‹ค๋ฉด, 1๋ฒˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€์žฅ ์ƒ์œ„ ํŒŒ์ผ(App.js)์— ์ผ๊ด„ ์ ์šฉ์ด ํŽธํ•˜๋‹ค.

    • ๋ฌผ๋ก  ์ด๊ฑด 3๋ฒˆ์„ ์‚ฌ์šฉํ•ด์„œ globalํ•˜๊ฒŒ ์ ์šฉ๋  ์Šคํƒ€์ผ๋งŒ ๋ชจ์•„๋‘๊ณ  export & import ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
  • ๋‚ด๋ถ€์— ๋“ค์–ด๊ฐˆ ์Šคํƒ€์ผ์€ ๋‹ค๋ฅด์ง€๋งŒ, ํด๋ž˜์Šค๋ช…์„ ๋™์ผํ•˜๊ฒŒ ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ(header, title, description ๋“ฑ๋“ฑ ํ”ํ•œ ๋„ค์ด๋ฐ)์€ 2๋ฒˆ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

  • ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋žœ๋”ํ•˜๊ณ , ๊ฐ ๋ฐ์ดํ„ฐ๋งˆ๋‹ค ํ”Œ๋กฏ์€ ๊ฐ™์ง€๋งŒ props๋กœ ์ผ๋ถ€ ๋‹ค๋ฅธ ์Šคํƒ€์ผ์„ ์ ์šฉํ•ด์•ผ ํ•  ๊ฒฝ์šฐ 3๋ฒˆ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

    • data์— ์ƒ‰๊น”์ด ์ง€์ •๋˜์–ด ์žˆ๊ณ , ์ด ์ƒ‰๊น”์„ ๊ทธ element์˜ ๋ฐฐ๊ฒฝ์ƒ‰์œผ๋กœ ์ง€์ •ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒฝ์šฐ
    • title์˜ ๊ธธ์ด์— ๋”ฐ๋ผ ์ƒ‰๊น”์„ ๋‹ค๋ฅด๊ฒŒ ํ•ด์•ผํ•œ๋‹ค๊ฑฐ๋‚˜, ์กฐ๊ฑด๋ถ€ ์Šคํƒ€์ผ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ