ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

Issue

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

 

๋‹ค์Œ ์„ค๋ช…์€ ๋ฆฌ์•กํŠธ ๊ณต์‹ ์‚ฌ์ดํŠธ์— ์ฒ˜์Œ ๋“ค์–ด๊ฐ€๋ฉด ๋ฉ”์ธ ํŽ˜์ด์ง€์—์„œ ๋ฐ”๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” ์„ ์–ธํ˜•์ด ์ •ํ™•ํžˆ ์–ด๋–ค ์˜๋ฏธ๋ฅผ ์ง€๋‹ˆ๊ณ  ์žˆ๋Š”์ง€, ์‹ค์ œ ์ฝ”๋“œ ํ•„์ž์˜ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ์‚ดํŽด๋ณด๊ณ ์ž ํ•œ๋‹ค.

 

๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ

๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์–ด๋–ป๊ฒŒ ํ•  ๊ฒƒ์ธ๊ฐ€, ์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๋ฌด์—‡์„ ํ•  ๊ฒƒ์ธ๊ฐ€

 

 

๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Imperative Programming)์€ ์–ด๋–ค ๋ฐฉ๋ฒ•(How)์œผ๋กœ ํ•  ๊ฒƒ์ธ์ง€์— ๊ฐ€๊น๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜(๋™์ž‘ ๋ฐฉ์‹)์„ ๋ช…์‹œํ•˜์ง€๋งŒ ๋ชฉํ‘œ(์‹ค์ œ ๋™์ž‘)๋ฅผ ๋ช…์‹œํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

import React, { Component } from 'react';
import { Link } from 'react-router-dom';

class Comments extends Component {
  render() {
    let { name, comment } = this.props;

    let isSkip = false;
    let addVal;
    if (comment.length > 20) {
      comment = comment.slice(0, comment.length - 6);
      isSkip = true;
      addVal = (
        <span style={{ color: '#dee2e6', fontSize: '6px' }}> ๋”๋ณด๊ธฐ...</span>
      );
    }

    return (
      <li className="comment-item">
        <div className="comment">
          <Link to="/login/choi" className="feed-bottom-account profile-name">
            {name}
          </Link>
          <span className="comment-content">{comment}</span>
          {isSkip && addVal}
        </div>
        <button className="comment-heart">
          <img
            src="https://s3.ap-northeast-2.amazonaws.com/cdn.wecode.co.kr/bearu/heart.png"
            alt="heart"
          />
        </button>
      </li>
    );
  }
}

export default Comments;

ํ•ด๋‹น ์ฝ”๋“œ๋Š” ์ด์ „ ํฌ์ŠคํŒ…์—์„œ ์“ฐ์˜€๋˜ ๋Œ“๊ธ€ ๊ด€๋ จ ์ปดํฌ๋„ŒํŠธ์ด๋‹ค.

์ด ์ฝ”๋“œ ์ƒ์—์„œ ๋กœ์ง ์ƒ ๋ฌธ์ œ๋Š” ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋Šฅ ๋™์ž‘์€ ์ œ๋Œ€๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.

 

ํ•˜์ง€๋งŒ ์„ ์–ธํ˜•์„ ์ง€ํ–ฅํ•˜๋Š” ๋ฆฌ์•กํŠธ ์ƒ์—์„œ ์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ์—์„  ์ง€์–‘ํ•ด์•ผ ํ•  ๋ถ€๋ถ„์ด ์žˆ๋‹ค.

render()๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹ค์ œ ํ™”๋ฉด ์ƒ์— ๋ณด์—ฌ์งˆ ๊ตฌ์„ฑ(๋ ˆ์ด์•„์›ƒ)์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์•ฝ์† ๋œ ํ•จ์ˆ˜์ด๋‹ค. 

 

์ด๋Ÿฌํ•œ ํ•จ์ˆ˜์—์„œ ์•„๋ž˜์™€ ๊ฐ™์€ ์—ฐ์‚ฐ ๊ณผ์ •์€ ์‹ค์ œ render() ํ•จ์ˆ˜๊ฐ€ ๋ชฉํ‘œํ•˜๋Š” ๋ฐ”์™€ ์ง์ ‘์ ์œผ๋กœ ์ƒ๊ด€์ด ์—†์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ๊ธฐ๋Šฅ์˜ ํ๋ฆ„๋งŒ์„ ๋ช…์‹œํ•˜๊ณ  ์žˆ์–ด 'So What?' ์ด๋ผ๋Š” ์˜๋ฌธ์„ ์ž์•„๋‚ธ๋‹ค.

let isSkip = false;
    let addVal;
    if (comment.length > 20) {
      comment = comment.slice(0, comment.length - 6);
      isSkip = true;
      addVal = (
        <span style={{ color: '#dee2e6', fontSize: '6px' }}> ๋”๋ณด๊ธฐ...</span>
      );
    }

 

๊ทธ๋ ‡๋‹ค๋ฉด ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์–ด๋– ํ•œ ์‹์œผ๋กœ ์ˆ˜์ •ํ•ด์ฃผ๋ฉด ์ข‹์„๊นŒ.

์ด์— ๋Œ€ํ•œ ํ•ด๋‹ต์„ ๋‚ด๋ฆฌ๊ธฐ ์ „์— ์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ•ด์„œ ๋˜์งš๊ณ  ๋„˜์–ด๊ฐˆ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

 

์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ(Declarative Programming)์€  ๋ฌด์—‡์ธ๊ฐ€(What)์„ ์ž‘์—…ํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์„ ์ •์˜ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

์ œ์–ด ํ๋ฆ„์„ ์„ค๋ช…ํ•˜์ง€ ์•Š๊ณ  ๊ณ„์‚ฐ ๋…ผ๋ฆฌ์— ์ง‘์ค‘ํ•˜๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„์ด๋‹ค.

 

์ฆ‰, ๊ฒฐ๊ณผ์— ์ด๋ฅด๋Š” ๊ณผ์ •์€ ๊ธฐ์ˆ ํ•˜์ง€ ์•Š๊ณ  ๊ฒฐ๊ณผ๋งŒ ๊ธฐ์ˆ ํ•  ๋ฟ์ด๋‹ค.

(์‚ฌ์šฉ์ž์˜ ์˜๋„์— ์ง‘์ค‘ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•์ด๋‹ค)

 

์œ„ ๋‚ด์šฉ๊ณผ ๊ด€๋ จ๋˜์–ด ๋‹ค๋ฅธ ์˜ˆ์‹œ๋ฅผ ์‚ดํŽด๋ณด์ž.

goPath = event => {
    if (event.type === 'keyup' && event.keyCode !== 13) return;

    let { id, pwd } = this.state;
    let { history } = this.props;

    fetch('API ์ฃผ์†Œ', {
      method: 'POST',
      body: JSON.stringify({
        email: id,
        password: pwd,
      }),
    })
      .then(res => res.json())
      .then(res => {
        if (res.message === 'SUCCESS') {
          history.push('/main/choi');
        }
      });
  };

ํ•ด๋‹น goPath() ํ•จ์ˆ˜๋Š” ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๊ฑฐ๋‚˜ ์—”ํ„ฐํ‚ค๋ฅผ ์ณค์„ ๋•Œ, API ์ฃผ์†Œ๋กœ ๋กœ๊ทธ์ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค.

ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•ด๋ณด๋ฉฐ ์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ๋Œ€ํ•ด์„œ ํ•™์Šตํ•ด๋ณด์ž.

 

์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ_ํ•จ์ˆ˜๋ช…์˜ ๋ณ€๊ฒฝ๊ณผ ๊ธฐ๋Šฅ ๋ถ„๋ฆฌ

ํ˜„์žฌ ํ•จ์ˆ˜๋ช…์€ goPath ์ด๋‹ค. 

์ฒ˜์Œ์— ํ•จ์ˆ˜๋ช…์„ ์ด์™€ ๊ฐ™์ด ์ง“์€ ์ด์œ ๋Š” '๋กœ๊ทธ์ธ ์ฒ˜๋ฆฌ๊ฐ€ ์„ฑ๊ณต์ด ๋˜๋ฉด path์— ์ง€์ •๋œ ๋ฉ”์ธ ํŽ˜์ด์ง€๋กœ ๋ผ์šฐํŒ…๋˜๋Š” ๋™์ž‘' ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

ํ•˜์ง€๋งŒ '๋กœ๊ทธ์ธ ์ฒ˜๋ฆฌ๊ฐ€ ์„ฑ๊ณต๋˜์ง€ ์•Š์œผ๋ฉด ๋ฉ”์ธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค' ๋ผ๋Š” ๋™์ž‘์„ ์ƒ๊ฐํ–ˆ์„ ๋•Œ, ํ•ด๋‹น goPath๋Š” ๋ณด์žฅ๋œ ํ–‰๋™ ๊ฒฐ๊ณผ๊ฐ€ ์•„๋‹ˆ๋‹ค.

ํ•ด๋‹น ๋ถ€๋ถ„์„ ์ข€ ๋” ๋ช…ํ™•ํžˆ ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด 'goPath' ํ•จ์ˆ˜๋ช…์„ 'checkLoginUser' ๋กœ ๋ฐ”๊พธ์–ด ์ฃผ์—ˆ์œผ๋ฉฐ, ์‹ค์ œ ๋ผ์šฐํŒ…๋˜๋Š” ๊ธฐ๋Šฅ์„ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋กœ ๋ถ„๋ฆฝํ•˜์—ฌ ์ฃผ์—ˆ๋‹ค.

checkLoginUser = event => {
    if (event.type === 'keyup' && event.keyCode !== 13) return;

    let { id, pwd } = this.state;
    let { history } = this.props;

    fetch('http://10.58.1.129:8000/users/login', {
      method: 'POST',
      body: JSON.stringify({
        email: id,
        password: pwd,
      }),
    })
      .then(res => res.json())
      .then(res => {
        if (res.message === 'SUCCESS') {
        this.goMain(); // ์ง€์ •๋œ path๋กœ ๋ผ์šฐํŒ…ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ
        }
      });
  };
goMain = () => { history.push('/main/choi'); }

๋˜ํ•œ ์ด๋ฒคํŠธ ํƒ€์ž…๊ณผ ์ด๋ฒคํŠธ keyCode๋ฅผ ์‹๋ณ„ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด

if (event.type === 'keyup' && event.keyCode !== 13) return;

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—ฐ์‚ฐ ๊ณผ์ •์ด ์žˆ๋Š”๋ฐ, ์ด ๋˜ํ•œ ๋…ผ๋ฆฌ์˜ ํ๋ฆ„๋งŒ ์žˆ์„ ๋ฟ์ด์ง€ ์–ด๋– ํ•œ ๋™์ž‘์„ ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด์„œ๋Š” ๋ช…์‹œํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ˜•์‹์œผ๋กœ ๋ฆฌํŒฉํ† ๋งํ•ด์ค˜์•ผ ํ•œ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

const eventType = 'keyup';
const isEnterKey = 13;

if (event.type && !isEnterKey) return;

์•„์ง๊นŒ์ง€๋Š” ์„ ์–ธํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ค‘์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ต์ง€๋งŒ, ์•ž์œผ๋กœ๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ํ•ญ์ƒ ์œ ์˜ํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.

๋Œ“๊ธ€
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
TAG
more
ยซ   2024/10   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
๊ธ€ ๋ณด๊ด€ํ•จ