ํฐ์คํ ๋ฆฌ ๋ทฐ
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;
์์ง๊น์ง๋ ์ ์ธํ ํ๋ก๊ทธ๋๋ฐ์ ์ค์ ์ผ๋ก ์ฝ๋๋ฅผ ๊ตฌ์ฑํ๋ ๊ฒ์ด ์ด๋ ต์ง๋ง, ์์ผ๋ก๋ ์ฝ๋๋ฅผ ์์ฑํ ๋ ํญ์ ์ ์ํ๊ณ ์์ด์ผ ํ๋ค๋ ์๊ฐ์ด ๋ค์๋ค.
'React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Type ๊ฐ์ ๋ฐ๋ผ ์กฐ๊ฑด๋ถ ๋๋๋ง_getDerivedStateFromProps (0) | 2021.11.07 |
---|---|
Carousel Slide ๊ธฐ๋ฅ Component๋ก ๋ถ๋ฆฝ (0) | 2021.11.07 |
๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ_JSX ์์์ Inline-style์ ๋ํด (0) | 2021.10.28 |
๋ฆฌ์กํธ ๋ฉ์๋ ๋ด this ๋ฐ์ธ๋ฉ ๋ฌธ์ (0) | 2021.10.24 |
๋ฆฌ์กํธ ํ๋ก์ ํธ์ ์น ํฐํธ ์ ์ฉํ ๋ GlobalStyles์ ๋ฌธ์ ์ (0) | 2021.10.24 |