์๋ Dan์ ํธ์์์ ์๊ฐ์ ๋ฐ์์ต๋๋ค.
TL;DR - ์ด ๋ฆฌํฌ์งํ ๋ฆฌ ์ ์ถ์ต๋๋ค . ๊ณผ์ ์ ํ ์คํธ ๋ฐ ์ฝ๋๋ ์คํ ์์ค์ด๋ฏ๋ก(๊ฐ๊ฐ CC ๋ฐ MIT๋ก ์๊ฐํ๊ณ ์์) ์ด ์ง์์ ์ ๋ฃํ ๋ค์ ๊ณ ์ ๋์ง ์์ต๋๋ค.
ํ๋ถํ ์์ ๋ฅผ ์์ฑํ๋ ค๋ฉด ๋ง์ ์๊ฐ์ด ๊ฑธ๋ฆฌ๊ณ ์ฐ๊ธฐ ๊ฐ๋ฅํ API ์๋ํฌ์ธํธ๊ฐ ํ์ํฉ๋๋ค(๋ฌด์๋ณด๋ค๋). ๊ทธ๋ฌ๋ ๊ฐ๋ฐ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ๋ ์ข์ ์ฐธ์กฐ ํ๋ ์์ ๊ฐ๋๋ก ํ๋ ๊ฒ์ด ์ ๋ง ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ฐ๋ฆฌ๋ ๋ํ Redux์ ๋ํ ์ด๋ฌํ ์ข ๋ฅ์ ์ ๋ฌธ์๋ฅผ ์์ฒญํ๋ ์๋ง์ ์ฌ์ฉ์๊ฐ ์์ผ๋ฉฐ, ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ๊ทธ ์ ์์ ์๊ธ์ ์ง์ํ๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค.
์ด์ ๋ํ ์์ด๋์ด์ ์์ ์ ๊ด์ฌ์ด ์๋ ๊ฒฝ์ฐ lmk๋ฅผ ๋ฃ๊ณ ์ถ์ต๋๋ค!
๋ค์์ ์ฒ๋ฆฌํ๋ ๊ณต์ CRUD ์์ ๋ฅผ ๊ฐ๊ณ ์ถ์ต๋๋ค.
์ด๊ฒ์ ๋ํ ๊ณผ์ ์ ๋ง๋ค๊ณ ์ถ๋ค๋ฉด ๊ทธ๊ฒ์ ๋๋ผ์ด ์ผ์ ๋๋ค. ๊ทธ๋ฌ๋ ์์ ์์ฒด๊ฐ ์ด ๋ฆฌํฌ์งํ ๋ฆฌ์ ๊ธฐ์ฌํ์ฌ ์ ์ง ๊ด๋ฆฌํ๊ณ ์ต์ ๋ณ๊ฒฝ ์ฌํญ์ ์ต์ ์ํ๋ก ์ ์งํ๋ ๊ฒ์ด ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ฐ๋ผ์ ๊ธฐ์กด ์์ ์์ ์ฌ์ฉํ๋ ๋น๋ ์์คํ ๋ฐ ๊ท์น๊ณผ ์ผ์นํด์ผ ํฉ๋๋ค.
์ด๊ฒ ๋ง์ด ๋ผ?
๋ํ ์ฌ๋๋ค์ด API์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ์์น๋ฅผ ์๊ณ ์ถ์ต๋๋ค.
@gaearon ๋ด์ฉ/์ฝ๋๋ ์คํ ์์ค์ด๋ฏ๋ก ๋ฌธ์ ์์ต๋๋ค. ํ์ด์ง ์ด๋๊ฐ์ ๋ค์ ๋งํฌ๋ฅผ ์์ฒญํ๋ฉด ๋ฉ๋๋ค.
@sebastiandeutsch ์ด์ ๋ํด ์กฐ๊ธ ๋ ์์ธํ
์ผ๋ง ์ ๋๋ react+redux, monogram ๋ฐ eccrypto๋ฅผ ์ฌ์ฉํ์ฌ ๋น๋ฐ๋ฒํธ ๊ด๋ฆฌ์๋ฅผ ์์ฑํ๋ฉด์ ๋๊ธฐ ์์ํ์ต๋๋ค. ECIES๋ฅผ ์ฌ์ฉํ์ฌ ์ํธํ๋์ง ์์ ํ์์ผ๋ก ์ ์ ์ ํตํด ์ ์กํ์ง ์๊ณ ์ํธ๋ฅผ ์ ์ฅํ๊ณ ๋ชจ๋ ๊ณต์ ํ์ญ์์ค. ์ ๋ง ๋๋ด๊ธฐ์๋ ์ด๋ฅด์ง ๋ชปํ์ง๋ง https://github.com/rackt/redux/issues/1353#issuecomment -178760036์ ๋ชจ๋ ํญ๋ชฉ์ ์์ฃผ ์ ๋ง์กฑ์ํฌ ์ ์์ต๋๋ค. ํฅ๋ฏธ๋กญ๊ฒ ๋ค๋ฆฝ๋๊น?
@vkarpov15
์ด๊ฒ์ ๋งค์ฐ ํฅ๋ฏธ๋กญ๊ฒ ๋ค๋ฆฌ์ง๋ง ๋๋ฌด ๋๋ฉ์ธ์ ๊ตญํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋ถ๋ถ์ ์ฌ๋๋ค์ ์ผ๋ฐ์ ์ธ CRUD ์์ (์ด๋ ํญ๋ชฉ์ด๋ ์ฐ๊ฒฐํ ์ ์๋ ํธ์ง ๊ฐ๋ฅํ ํญ๋ชฉ ๋ชฉ๋ก ๋ฑ)๋ฅผ ๋ณด๊ณ ์ถ์ดํ ๊ฒ์ด๋ฉฐ ์ํธํ ์ด์ ์ผ๋ก ์ธํด ์์ ์ ์ ๊ทผํ๊ธฐ ์ด๋ ค์์ง ์ ์์ต๋๋ค.
์ ๋ ๋๊ด์ ์ธ ์
๋ฐ์ดํธ๋ก ๋ก์ปฌ/์คํ๋ผ์ธ ํธ์ง์ ๋ง์ ๊ด์ฌ์ด ์์ต๋๋ค. ์๊ฐ์ด ์์ง๋ง redux ์ฑ์ ๋ํ ๊ฒฝํ์ด ๋ง์ง ์์ต๋๋ค. ๋ณต์กํ ๊ธฐ๋ณธ ์ฑ๋ง ๊ฐ์ง๊ณ ์์ง๋ง ๊ฑฐ์ ์์ ํ ๋ก์ปฌ/์คํ๋ผ์ธ์
๋๋ค.
๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ์์ฑํ๊ณ ์์
ํ๊ณ ์ ์ง์ ์ผ๋ก ๋
ผ์ํ ์ ์์๊น์?
๋ํ "๋ชจ๋์" ์ฑ์ ์ด๋ป์ต๋๊น?
๋ช ๊ฐ์ง ์์ด๋์ด๋ฅผ ๊ณต์ ํ๊ธฐ ์ํด ์ ๋ ์คํ๋ผ์ธ ์ฒซ ๋ฒ์งธ ์ฑ์ด ์ด๋ป๊ฒ ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํ๋์ง์ ๋ํ ๋ช ๊ฐ์ง ์์ด๋์ด๋ฅผ ์ผ์ต๋๋ค. ์๊ฐ์ด ์๋ค๋ฉด ํ ๋ฒ ์ฌ์ฉํด ๋ณด์ธ์! :)
๋ฌธ์ ๊ฐ ์ผ๋ง๋ ๊ด๋ฒ์ํ๊ณ ์ด ๊ณผ์ ์ ๊ฐ๋ฐ์ ๋ชฉํ ์์ค์ด ๋ฌด์์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ง๋ง react+redux์์ ๊ตฌํ๋ ๋ณต์กํ ์ฑ ๊ตฌ์ฑ ์์๋ฅผ ์ค๊ณํ๋ ๋ฐฉ๋ฒ์ ์ธํฐ๋ท ์ด๋๊ฐ์์ ๋ณด๊ณ ์ถ์ต๋๋ค(์: ์ฌ๋ฌ ๋ฆฌ๋์์ ์ํด ์ ์ด๋๋ ์ํ)์ด๋ฏ๋ก ๋ค๋ฅธ ์ฑ์์ ์ ์ฒด์ ์ผ๋ก ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค.
@sompylasar React Redux
์ด๋ณด์ ์์ค์ crud ์์ ๋ฅผ ์ฐพ๊ณ ์๋ค๋ฉด ํญ์ todo-mvc์ "babel+redux+react+webpack ์์ํ๊ธฐ" ํํ ๋ฆฌ์ผ์ด ์์ต๋๋ค. ๋๋ ๋ ๋ค๋ฅธ ๊ฒ์ ๋ง์ ๊ฐ์น๊ฐ ์๋์ง ํ์ ํ์ง ๋ชปํฉ๋๋ค. ๋งค์ฃผ ์ฃผ์ ์ ๋ํ ๋ช ๊ฐ์ ์๋ก์ด ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ์ฝ๊ฒ ๋ฉ๋๋ค(ํ์ง๋ง ์๋ง๋ ์ด๋ฌํ ํํ ๋ฆฌ์ผ์ ์๋์ผ๋ก ์์ฑํ๋ ์ฑ์ ๋น๋ํ ์ ์์๊น์? :p ). ์ ๋ ์ค๊ธ ์์ค์ ํํ ๋ฆฌ์ผ์ด ๋ ๊ฐ์น๊ฐ ์๊ณ IMO์์ ์ํธํ์ ๋ํด ๋ฐฐ์ฐ๋ ๊ฒ์ด ๋งค๋ ฅ์ ์ธ ๋ถ์์ ์ด์ ์ด ๋ ์ ์๋ค๊ณ ์ฃผ์ฅํฉ๋๋ค.
๋๋ ์ด์ฌ์ ์์ค์ ์์ ๋ฅผ ์ฐพ๊ณ ์์ง ์์ง๋ง CRUD์ ๋ณต์กํ ๋ถ๋ถ(ํ์ด์ง ๋งค๊น, ์ ๊ทํ, ๋๊ด์ ์ ๋ฐ์ดํธ, ๊ด๊ณ)์ด ์์ ์ ์ด์ ์ด์ด์ผ ํฉ๋๋ค.
์ฌ์ฉ์ ์ง์ ๋๋ ๊ธฐ์กด API๋ฅผ ์ฌ์ฉํฉ๋๊น? ์๋๋ฉด ์กฐํฉ?
์ด๋ ค์ด ์ง๋ฌธ์ ๋๋ค. ๋ชจ๋ฅด๊ฒ ์ด์. Github API๋ ์ฐ๊ธฐ ๊ฐ๋ฅํ๊ณ ๊ฐ๋ ์ด ๋ชจ๋์๊ฒ ์น์ํ๊ธฐ ๋๋ฌธ์ ์ข์ ์์ด๋์ด์ผ ์ ์์ต๋๋ค. @ryanflorence๊ฐ ๋น์ทํ ์์ ์ ํ๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค.
ํ์คํ ์ด๊ฒ์ ํตํด ์ค๊ธ ๊ฐ๋ฐ์๋ฅผ ๋์์ผ๋ก ํฉ๋๋ค. ์ด์ฌ์ tuts๋ ํฌํ ์ํ์ด๋ฉฐ ์์ ๋์ด๋ Dan์ (์ค์ ) ๋ ์ด๋ ค์ด ์ฃผ์ ๋ฅผ ๊ฑฐ์ ๋ค๋ฃจ์ง ์์ต๋๋ค.
์ฌ์ฉ์ ์ง์ ๋ฐ/๋๋ ๊ธฐ์กด API ๋ชจ๋์ ๊ฐ๋ฐฉ์ ์ ๋๋ค. aws ๊ณ์ ์์ ๋ชจ๋ ์ฌ์ฉ์ ์ง์ API๋ฅผ ํธ์คํ ํ๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค. ์ฐ๋ฆฌ๋ ๋ํ ์ฌ์ฉํ ์ ์๋ ๋ช ๊ฐ์ง ๋ค๋ฅธ ๊ณผ์ ์ ์ํด ๊ตฌ์ถ ์ค์ธ Medium.com ํด๋ก ์ ์ํ ์์ ํ API๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ฌ๋๋ค์ด ๊ถ๊ธํดํ ๊ฒฝ์ฐ ๋ฐฑ์๋ ์์ค ์ฝ๋๋ ์ฌ์ฉํ ์ ์์ ๊ฒ์ ๋๋ค. ํฅ๋ฏธ๋กญ๊ฒ ๋ค๋ฆฌ๋ฉด ์ธ๋ถ ์ ๋ณด๋ฅผ ๊ณต์ ํ๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค.
@EricSimons Medium ํด๋ก ์ ๋ํด ๋ ์๊ณ ์ถ์ต๋๋ค.
@cshenoy ํ์คํ. React/Redux๋ฅผ ํ๋ก ํธ์๋๋ก, Node๋ฅผ ๋ฐฑ์๋๋ก ํ๋ ํ์คํ JS ๊ณผ์ ์ ๊ตฌ์ถํ๊ณ ์์ต๋๋ค. ๋ฐฑ์๋ API๋ ๋ก์ปฌ์์ ์คํํ๊ณ ์ถ์ง ์์ ์ฌ๋๋ค์ ์ํด ๋ ๋ฆฝ์ ์ผ๋ก ํธ์คํ ๋๋ฏ๋ก ์์ ๋ณด๋ค ๋ณต์กํ ์ฃผ์ ๋ฅผ ๊ฐ๋ฅด์น๋ ๋ฐ ์ ํฉํ ์ ์์ต๋๋ค. Medium ํด๋ก ์ ๊ธฐ๋ฅ ์ธํธ์๋ ๋ค์์ด ํฌํจ๋ฉ๋๋ค.
์ต์ข ์ฝ๋๋ฒ ์ด์ค์ ETA๋ ์ด๋ฒ ์ฃผ ๋ง๊น์ง์ด๋ฏ๋ก ๊ทธ๋์ฏค์ ๋ ๋ง์ ์ ๋ณด๋ฅผ ์ป์ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋ชจ๋ ๊ฒ์ ์ํผ ๋ชจ๋์์ผ๋ก ์ค๊ณํ์ผ๋ฏ๋ก ์ถ๊ฐ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ๊ฒ์ ๊ฐ๋จํฉ๋๋ค.
์์ ํ(์๊ฐ ์ถ์ ๊ธฐ)๋ ์ค์ ๋ก ํ๋ญ์ค/๋ฆฌ๋์ค ๋ฐ ํฌ๋ฃจ๋์ ๋ณต์กํ ์ธก๋ฉด์ ๋ง์ด ์ฌ์ฉํฉ๋๋ค. ํ์ด์ง ๋งค๊น๊ณผ ์บ์ฑ์ ๋ฉฐ์น ๊ณผ ๋ช ์ฃผ๋ฅผ ์๋ค๊ฐ๋ค ํ ๋ ํ์ํ ๋ช ๋ฐฑํ ์๊ตฌ ์ฌํญ์ ๋๋ค. ์ด๋ฏธ ์กด์ฌํ๋ ์ฐ๊ธฐ ๊ฐ๋ฅํ API๋ ๋ง์ด ์์ต๋๋ค. ๋ํ ์๊ฐ ์ถ์ ์ธ์๋ ๋ง์ ๊ฒ์ด ์์ต๋๋ค. ์ฌ์ฉ์ ๊ด๋ฆฌ, ํ๋ก์ ํธ ์ํฐํฐ ๋ฑ
๋๋ ์ด๊ฒ์ด ์ข์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ค. ๋๋ ํนํ ๊ทธ๊ฒ์ ์ผ๋ถ๋ฅผ ๋ง๋๋ ๋ฐ ์ฝ๊ฐ ์ด๋ ค์์ ๊ฒช์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ ์ ๊ธฐ์ฌ๋ฅผ ๋ง๋๋ ArticlePage ๊ตฌ์ฑ ์์๊ฐ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
// shortened version
import { addArticle } from '../actions'
function doAddArticle(props, handleAdded, values, dispatch) {
props.addArticle(values)
.then(handleAdded)
}
class AddArticlePage extends Component {
handleAdded = () => {
this.props.pushState(null, '/articles/')
};
render() {
return (
<div>
<ArticleForm submit={(values, dispatch) => doAddArticle(this.props, this.handleAdded, values, dispatch)} />
</div>
)
}
}
function mapStateToProps(state) {
return {}
}
export default connect(mapStateToProps, {
pushState,
addArticle
})(AddArticlePage)
/articles/{id}/
ํ์ด์ง๋ก ๋ฆฌ๋๋ ์
ํ๋ ค๋ฉด ์ด๋ป๊ฒ ํฉ๋๊น?๋ฌผ๋ก ์ ๋ Redux๋ฅผ ์ฌ์ฉํ ์ง ๋ช ๋ฌ๋ฐ์ ์ ๋์๊ธฐ ๋๋ฌธ์ ์ด๋ฆฌ์์ ๋ฌธ์ ์ผ ์ ์์ง๋ง ์ด๋ณด์๋ก์ ๊ทธ๋ค์ ๋ถ๋ช ํ ์ ๋ฅผ ๋์ด๋จ๋ ธ๊ณ ์ฌ์ ํ ์ ์๋ฃจ์ ์ด "์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ"์ด๋ผ๊ณ ์๊ฐํ์ง ์์ต๋๋ค.
@jonathaningram redux-thunk๋ ์ ํ ๋ณด์ จ๋์? ์์์ ์ํํ๋ ์์ ์ ๋์์ผ๋ก ์์ ๋ด์์ ํ๊ฒฌํ ์ ์์ต๋๋ค.
@babsonmatt ๋ค ์ด๋ฏธ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๋๋ ๊ทธ๊ฒ์ ์ฌ์ฉํ๋ ์ค์ ์ฌ๋ก๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฑ์ ๋ง๋ค์์ต๋๋ค. ์ด์ฉ๋ฉด ๋๋ ๊ทธ๊ฒ์ ์ ์ฒด ๊ธฐ๋ฅ์ผ๋ก ์ฌ์ฉํ์ง ์์ ์๋ ์์ต๋๋ค.
@jonathaningram ๊ทํ์ ๋ชจ๋ฒ์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์ง์ ํ๋ฏ์ด ๋ฆฌ๋๋ ์ ๋ ผ๋ฆฌ๋ฅผ ์์ ์์ฑ์์ ์ฝํฌ๋ก ์ด๋ํ๊ณ ๊ฑฐ๊ธฐ์์ ๊ฒฝ๋ก ์ ๋ฐ์ดํธ๋ฅผ ์ ๋ฌํด์ผ ํฉ๋๋ค. redux-saga ๋๋ redux-side-effects์ ๊ฐ์ ๋ถ์์ฉ(๋ฆฌ๋๋ ์ ์ ํด๋น ์์ ์ผ๋ก ์ธํ ์ํ ์ ํ์ ๋ถ์์ฉ)์ ๊ด๋ฆฌํ๋ ๋ ๋ง์ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฌ๋ ์๋ ๋ ผ์๋ ์ด ๋ฌธ์ ์ ๋ฒ์๋ฅผ ๋ฒ์ด๋ฌ๋ค๊ณ ์๊ฐํฉ๋๋ค.
@sompylasar ๊ฐ์ฌํฉ๋๋ค. ๋ค, ์ด ๋ฌธ์ ๋ฅผ ์ฐํํ๊ณ ์ถ์ง๋ ์์ง๋ง Redux ์ด๋ณด์๋ก์ "์ค์ ์ธ๊ณ" ๊ฒฝํ์ ๊ณต์ ํ๊ณ ์ถ์์ต๋๋ค.
@EricSimons ์ ๋ ๋๊ณ ์ถ์ต๋๋ค. ์ ๋ ํ์ฌ Nuclear-js๋ฅผ ์ฌ์ฉํ์ฌ CRUD ์ฑ์ ์ ์ง ๊ด๋ฆฌํ๊ณ ์์ผ๋ฉฐ ๋ง์ ์์ด๋์ด๊ฐ redux๋ก ์ ๋ฒ์ญ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ธ๋ ์ธ์คํ ๋ฐ์ ํ๊ณ ์ถ๋ค๋ฉด ์๋ ค์ฃผ์ธ์.
์ ๋ ์ต๊ทผ์ CRUD(over REST) โโ์ํ ๊ด๋ฆฌ ํ๋ก์ ํธ๋ฅผ ์์ํ์ต๋๋ค. Marionette/Backbone
๋ถํฐ React/Redux๋ฅผ ํํค์น ๋ REST ๊ท์น์ด ์ ๋ง ๊ทธ๋ฆฌ์ ์ต๋๋ค.
https://github.com/masylum/resting-ducks
์๋ฃจ์ ์ด ์์ธ์ง ํ์คํ์ง ์์ต๋๋ค. ๋๋ ๋์๊ด์ด ๊ทธ๊ฒ์ ์ํด ๋ ์ ์๋ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ํ ๊ด๋ฆฌ๋ ๊ฑฐ์ ํญ์ ๋์ผํฉ๋๋ค. 2016๋ ์๋ CRUD ์ฝ๋๋ฅผ ์์ฑํ์ง ์๊ณ ๋น์ฆ๋์ค ๋ก์ง์ ์ง์คํด์ผ ํฉ๋๋ค.
@EricSimons ์ ๋ ํ์ฌ ๋ฐ์ดํฐ ์๊ตฌ ์ฌํญ์ ์ง์ ํ๊ณ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ๋ ๋ค์ํ ์ต์ ์ ํ๊ฐํ๊ณ ์์ต๋๋ค. ํ ๊ฐ์ง ์ต์ ์ Relayish๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ๋๋ค. ํ์ง๋ง ์ฝ๊ฐ ๊ณผํ๋ค๋ ๋๋์ด ๋ญ๋๋ค. ๋ด๊ฐ ํ๋ก์ ํธ๋ฅผ ์ํด ๋ง๋ ๊ฒ์ loader ์์ฑ์ ์ฌ์ฉํ์ฌ ๊ฒฝ๋ก์ ๋ด ๋ก๋ฉ ์๊ตฌ ์ฌํญ์ ์ง์ ํ๋ ๊ฒ์ ๋๋ค.
let routes = <Route path='/' component={Layout}>
<IndexRoute component={BooksIndex} />
<Route path='/book/new' component={BooksNew} />
<Route path='/book/:id' component={BooksShow} loader={BooksLoader} />
<Route path='/book/:id/edit' component={BooksEdit} loader={BooksLoader} />
</Route>;
BooksLoader๋ ๋ ๊ฐ์ง ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ํด๋์ค์ ๋๋ค.
๋ค์์ ๋ ๋๋ํ ๊ฒ์ผ๋ก ํ์คํ ๋์ฒดํ ์ ์๋ ๋งค์ฐ ๊ธฐ๋ณธ์ ์ธ ๊ตฌํ ์์ ๋๋ค(์: ImmutableJS / Map):
import _ from 'lodash';
import * as Actions from 'actions';
import API from 'api';
export default class BooksLoader {
needsToSyncStore(params, store) {
let books = store.getState().books;
if(books) {
const book = _.findWhere(books.collection, { isbn: params.id });
if(book) {
return false;
}
}
return true;
}
syncStore(params, store) {
let { dispatch } = store;
let api = new API();
let loadBooks = Actions.loadBooks();
return loadBooks(dispatch, store.getState);
};
}
์์ด๋์ด๋ ๋ก๋๊ฐ ๊ฒฝ๋ก์ ํ ์คํธ๋ฅผ ์ฝ๊ฒ ํ๋ redux ์ํ ํธ๋ฆฌ๊ฐ ์ ๊ณตํ๋ ์ํ์๋ง ๊ด์ฌ์ ๊ฐ๋๋ค๋ ๊ฒ์ ๋๋ค.
๋ค์ ์กฐ๊ฐ์ ReactRouter: https://gist.github์ RenderContext๋ก ์ฌ์ฉํ ์ ์๋ @ryanflorence AsyncProps(https://github.com/rackt/async-props)์์ ํฌ๊ฒ ์๊ฐ์ ๋ฐ์ ๋ฐ์ ๊ตฌ์ฑ ์์์ธ ์คํ ์ด ๋ก๋์ ๋๋ค . com/sebastiandeutsch/e6148ca0741cc355248c
๋ก๋์ ๋ํ ReactRouter์ ๊ฒฝ๋ก๋ฅผ ํ์ธํ๊ณ ์คํํ๋ ๊ฒ์ ๋๋ค. ๋ํ ์ปจํ ์คํธ๋ฅผ ํตํด ๋ก๋ฉ ์ํ๋ฅผ ๋ ธ์ถํฉ๋๋ค. ์ค์ ๋ก๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
<Provider store={store}>
<Router
history={browserHistory}
render={(props) => (
<StoreLoader {...props} store={store} />
)}>
{routes}
</Router>
</Provider>
๊ฒฝ๋ก ๊ตฌ์ฑ ์์(๋ผ์ฐํฐ์ ์ง์ ์ ์ธ ์์์ธ ํน์ ๊ตฌ์ฑ ์์)์์ ๋ค์๊ณผ ๊ฐ์ ์ปจํ ์คํธ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
export class BooksShow extends React.Component {
static contextTypes = {
storeIsSynchronized: React.PropTypes.bool
};
...
render() {
const { book } = this.props;
if(this.context.storeIsSynchronized) {
/* display components */
} else {
/* display loading spinner */
}
}
export default connect(
(state, props) => {
return {
book: _.findWhere(state.books.collection, { isbn: props.params.id } )
}
},
(dispatch) => ({
actions: bindActionCreators(Actions, dispatch)
})
)(BooksEdit);
@gaearon ์ด ์์ด๋์ด์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ์ธ์?
@sebastiandeutsch ๋๋ ๊ทธ ์ ๊ทผ ๋ฐฉ์์ ์ข์ํฉ๋๋ค. ์ ๋ Async-Props๋ก ์คํํ๊ณ ์์ต๋๋ค. ์ฌ๊ธฐ์์ ๋น์ ์ ์์ด๋์ด๋ ์ ๋ง ๋ฉ์ ธ ๋ณด์ ๋๋ค.
๋๋ ์ด ์์ ๊ฐ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ํ ์ถ์ํ๋ฅผ ์ค์ฌ์ผ๋ก ์กฐ์ ๋๊ธฐ ๋ณด๋ค๋ ๋ ์ผ๋ฐ์ ์ด์ด์ผ ํ๋ค๊ณ ์์ํ์ต๋๋ค. Rest API์ ๋ํ ์ ์ฅ์ ๋ฐ ์์ ์ ์ค์ ํ๋ ์ฌ์ด ๋ฐฉ๋ฒ์ ๊ธฐ๋ณธ ์์ ๋ก https://github.com/optimizely/nuclear-js/tree/master/examples/rest-api ๋ฅผ ์ ๋ง ์ข์ํฉ๋๋ค.
์บ์๋ฅผ ์ง์ํ๊ณ ์ ์ฅ์์ ์งํ ์ค์ธ ์์ฒญ์ ์ ์ฅํ๋๋ก ํ์ฅํ์ต๋๋ค(์์ฒญ์ด ๋ค์ ๋ฐ์ํ๋ฉด ํธ์ถ์๋ xhr์ ๋ค์ ์์ํ๋ ๋์ ๋จ์ํ ์ง์ฐ๋ฉ๋๋ค. ๋ด๊ฐ ๋งํ๋ ๊ฒ์ ๋ํ ๋ณด๋ค ๊ฐ๋ ฅํ ์๋ ์ฌ๊ธฐ์ ์์ต๋๋ค. : https://github.com/jordangarcia/nuclear-api-module-example/tree/master/rest_api ๊ทธ๋ฆฌ๊ณ @jordangarcia ์ ๊ฐ๋ ์ค ์ผ๋ถ๋ฅผ ํฐ ์ฑ๊ณต์ผ๋ก ๋ณต์ฌํ์ต๋๋ค. ์ฌ๊ธฐ์ ์ ๊ทผ ๋ฐฉ์์ด ๋ค์๊ณผ ์ ์๋ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. redux๋ (normalizr ๋ฑ๊ณผ ํจ๊ป ์ ๊ณต).
@EricSimons ๋ ์ฃผ์ ์ ์ฐ๊ธฐ ๊ฐ๋ฅํ ์ข์ API๋ฅผ ์ฐพ๋ ๋ฐ ๋ ๋ง์ ๋ฌธ์ ๊ฐ ์์ต๋๊น? ์๋๋ฉด ํน์ ์ ๊ทผ ๋ฐฉ์์ ์ฐพ๊ณ ์์ต๋๊น?
์ ๋ ์ฃผ๋ก ์ฃผ์ ์ ๊ด์ฌ์ด ์์ต๋๋ค(์ต์ ์ ๊ฒฝ์ฐ ์ฌ๋๋ค์ด ์ฌ์ฉํ ์ ์๋๋ก ์์ฒด ์ฐ๊ธฐ ๊ฐ๋ฅํ API๋ฅผ ํธ์คํ ํ ์ ์๊ธฐ ๋๋ฌธ์). btw ์์ ๋ชจ๋ ๋๊ธ ์์ฑ์์๊ฒ ํฐ ๊ฐ์ฌ๋ฅผ ๋๋ฆฝ๋๋ค. ์ด ํ ๋ก ์ ์ง๊ธ๊น์ง ํ์์ ์ด์์ต๋๋ค. ์ด ์์์ ๋ค๋ฃจ์ด์ผ ํ ๋ด์ฉ์ ๋ํ ๋ ๋ง์ ์๊ฐ/์์ด๋์ด๋ฅผ ๋ฃ๊ณ ์ถ์ต๋๋ค.
์ฐธ๊ณ ๋ก @dan-weaver ๋ฐ ์ด ์์ ์ ๊ด์ฌ์ด ์๋ ๋ค๋ฅธ ์ฌ๋๋ค - [email protected] ์ ๋ฉ๋ชจ๋ฅผ
Meteor ์ธ๊ณ์๋ Meteor์ ๋ํ ์ฑ ์์ ์์๋ ํ๋์ ํฐ ์คํ ์์ค ์์ ํ๋ก์ ํธ๊ฐ ์์ต๋๋ค. ์ด ํ๋ก์ ํธ๋ Reddit ๋๋ Hacker News์ ์ ์ฌํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ธ Telescope ์ ๋๋ค. Redux์ ๋น์ทํ ์๊ฐ ์๋ค๋ฉด ์ข์ ๊ฒ์ ๋๋ค. ๋ง์ ๊ฐ๋ฐ์๋ค์ด ์ด ์ฑ ์ ๋ฐ๋ฅด๊ณ ๊ทธ๊ฒ๊ณผ ํจ๊ป ๋ ์์ ๋ฒ์ ์ Telescope๋ฅผ ๊ตฌ์ถํจ์ผ๋ก์จ Meteor๋ฅผ ๋ฐฐ์ ์ต๋๋ค. Telescope์ ๊ฐ์ ์์ฉ ํ๋ก๊ทธ๋จ์ Dan์ด ๋๋ถ๋ถ์ ๊ฐ๋ฐ์์๊ฒ ์ด๋ฏธ ์น์ํ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ํด ์ ๊ธฐํ ๋ชจ๋ ์ฃผ์ ๋ฅผ ๋ค๋ฃน๋๋ค(Hacker News, Reddit, .. ๋๋ฌธ์).
๋๋ ๋ช ๋ฌ ์ ์ webapp *์์ ์ ์ฌํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ์ด๋ฅผ ๋ง๋ค๊ธฐ ์์ํ์ต๋๋ค. ์ด ํ๋ก์ ํธ์๋ ๋น๋ ํ๋ก์ธ์ค, CSS ๋ชจ๋, ์ธ์ฆ, API์ฉ ๋ณ๋ ์๋ฒ, MongoDB, ์๋ฒ ์ธก ๋ ๋๋ง, GraphQL ๋ฑ์ด ์ด๋ฏธ ์ค์ ๋์ด ์์ต๋๋ค(์ผ๋ถ๋ ์ฝ๊ฐ ๊ตฌ์์ผ ์ ์๊ณ , ๋ ๋ง์ ์์ ์ด ํ์ํ๊ฑฐ๋ ์๋ฃ๋ ์ ์์ต๋๋ค. ๋ ๋์). ๋ํ ๋ค๋ฅธ ์์๋ ์๋ ๊ฒ์ผ๋ก ์๊ฐ๋๋ ๊ฐ์๊ธฐ ๋ถํ ์ด ์์ต๋๋ค. ๋ถ์กฑํ ์ ์ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ, ๋๊ด์ ์ ๋ฐ์ดํธ, ์ค์๊ฐ ๋ฐ์ดํฐ์ ๋ํ ์ข์ ์๋ฃจ์ ์ด๋ผ๋ ๊ฒ์ ๋๋ค. ๋ํ ์ง๊ธ ๋ชจ๋ ๊ฒ์ด ์ผ๋ง๋ ๋นจ๋ฆฌ ์งํ๋๊ณ ์๋์ง์ ๋ํด 2 ๊ฐ์์ด ์์์ฒ๋ผ ๋๊ปด์ง๊ธฐ ๋๋ฌธ์ ์ฝ๊ฐ ๊ตฌ์์ ๋๋ค :)
์ฝ์ค์ ์์ ๋ฅผ ๋ง๋ค๊ธฐ ์ํ ์ถ๋ฐ์ ์ ์ํ๋ค๋ฉด _webapp_์ด ์๊ฐ์ด ๋ ์ ์์ต๋๋ค. Redux์์ Telescope์ ์ ์ฌํ ์์ ์ ์ํํ๋ ๊ฒ์ ๋ณด๊ณ ์ถ์ต๋๋ค.
*_ ๋ ธํ์ฐ ํด๋์๋ ์ํคํ ์ฒ/๊ฒฐ์ ์ ๋ํ ์ผ๋ถ ์ ๋ณด๊ฐ ํฌํจ๋์ด ์์ต๋๋ค._
_Sidenote:_ Redux์ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ์ ๋ํ ์ด์ผ๊ธฐ๊ฐ ์๋ค๋ ๊ฒ์ ์์๊ธฐ ๋๋ฌธ์ ํ์ฌ Redux์ ํตํฉ๋๋ Relay์ ์ ์ฌํ ์์คํ ์ ๋ง๋ค๊ณ ์์ต๋๋ค. ์ด๊ฒ์ด ์ ๊ฐ 2๊ฐ์ ๋์ _webapp_์ ์ ๋ฐ์ดํธํ์ง ์์ ์ด์ ์ ๋๋ค. ํด๋น ์์คํ ์ ๋ง๋๋ ๋ฐ ์ฑ๊ณตํ๋ฉด _webapp_ ๊ณ์ํ๊ฒ ์ต๋๋ค.
์ง๋ฉดํ ํ ๊ฐ์ง ๋ฌธ์ ๋ Redux๊ฐ ๋งค์ฐ ๋ฎ์ ์์ค์ด๋ฉฐ ๋ฐ๋ผ์ Redux๋ฅผ ์ค์ฌ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ _์ค์ ๋ก_ ๋น๋ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์๋นํ ์๊ฒฌ์ด ์๋ค๋ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ redux์ ์ต์ข ์ฌ์ฉ์ ์ธํฐํ์ด์ค ์ฌ์ด์ ์ ํจํ ์ถ์ํ๊ฐ ๋๋ฌด ๋ง๊ธฐ ๋๋ฌธ์ ํ์ตํ _one_ ์์ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๋จ์ํ ์ ์ง ๊ด๋ฆฌํ ์ ์๋์ง ํ์ ํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ๋ฐ์ดํฐ ๋ก๋์ ๋ํ ๋ง์ ๋ค๋ฅธ ๊ฐ๋ฅ์ฑ์ด ๋ช ํํ ์น์๊ฐ ์์ด ์ ์๋๋ ์ด ์ค๋ ๋์ ์ผ๋ถ ๋ ผ์์ ์ํด ์์๋ฉ๋๋ค. ์์ฉ ํ๋ก๊ทธ๋จ ๊ท๋ชจ๊ฐ ํฌ๊ฒ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ ์ ์์ต๋๋ค.
์ด๋ฌํ ์ด์ ๋ก Dan์ด ์ด์ ์ ์ธ๊ธํ ๋ชจ๋ ๊ณ ๊ธ ๊ธฐ๋ฅ์ ์๊ตฌํ๋ ์ฌ์์ "_The_ Advanced TODOMVC of Redux" ๋ฅผ ์ ์ํ๋ ๊ฒ์ด ๋ฐ๋์งํฉ๋๋ค.
์์ผ๋ก ๋์๊ฐ๋ฉด์ ์ด ๊ณ ๊ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ ์ฆ๋ช ์ผ๋ก ์ฌ์ฉํ ์ ์๋ ๋ ๋ง์ ์ถ์ํ/๋ผ์ด๋ธ๋ฌ๋ฆฌ/ํ๋ ์์ํฌ _์ฃผ๋ณ_ Redux๋ฅผ ๋ณด๊ธฐ ์์ํ ๊ฒ์ด๋ผ๊ณ ๋ฏฟ์ต๋๋ค. ์ค์ ๋ก ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์ด๊ฒ์ Redux์ ๊ด๋ จ์ด ์๋ ๊ฒ์ผ๋ก ๋ธ๋๋๊ฐ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค.
API ์ธก๋ฉด์์ ์ผ์ข ์ ํ์ค( JSON-API ๋ ๋น์ ๊ทํ ๋ฐ ๊ด๊ณ ์ค๋ช ์ ์ํ ํ์ํ ๊ธฐ๋ฐ ์ ๊ณต)์ ๋ฐ๋ฅด๊ณ ๊ถ๊ทน์ ์ผ๋ก ์ด ์์ GraphQL ์๋ฒ๊ฐ ์๋ ๊ฒ์ ๋ณด๊ณ ์ถ์ต๋๋ค.
์ด๊ฒ์ด ์ปค๋ฎค๋ํฐ๋ก ์ด๋ป๊ฒ ๊ตฌ์ฑ๋๋์ง์ ๊ดํด์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ฌ์, ์๋ฒ ๊ตฌํ ๋ฐ ๋ชจ๋ ํ์ฌ ๊ตฌํ์ ๋ชฉ๋ก/๋น๊ต ์ฐจํธ๋ฅผ ํฌํจํ๋ ํต์ฌ ๋ฆฌํฌ์งํ ๋ฆฌ๊ฐ ์์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
ํํธ์ผ๋ก๋ ๋ถ๋ถ์ ์ผ๋ก ๊ด๋ จ๋์ด ์์ง๋ง ์ฌ๊ธฐ ํน์ ์ฃผ์ ์์ ์ธ๊ธํ ๋ด์ฉ์ ์ฐธ๊ณ ํ์ฌ Redux์ ๋ฒ์๋ฅผ ๋ช ํํ ํ๋ ๋ฐ ์ด ๋ฌธ์ ์ ์ฐ์ ์์๋ฅผ ์ง์ ํ๋ ๊ฒ์ด ์ข์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ถ์ . ๊ณง React London ์์ "Real World Redux" ๊ฐ์ฐ์ด ์ด๋ฆด ์์
๋๋ ์ด ์์ ์ ํ ์ค๋น๊ฐ ๋์ด ์์ต๋๋ค. ์ ์ฌ์ฉ์์๊ฒ ํ ์ผ ๋ชฉ๋ก์ด ์๋ ์ฌ์ฉ ๊ฐ๋ฅํ๊ณ ์ฃผ์ ์ฒ๋ฆฌ๋๊ณ ์ค๋ช ๋ Redux ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๊ณตํ๋ ๊ฒ์ ์ข์ ์์ด๋์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์์ง @EricSimons์ ๋ํ ์์ ์ด ์์๋์์ต๋๊น?
redux
์ ์์ฉ๊ตฌ๋ฅผ ์ค์ด๊ณ ์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ ์ธ๊ณ๋ฅผ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๋น์ทํ ์ง๋ฌธ์ด ๋ง์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋๋ ๋ด๊ฐ ์ฌ๊ธฐ์ ๋ํด ์ด ๊ฝค ์ข์ ์๋ฃจ์
(๋ฌด์๋ณด๋ค๋)์ ์ฐพ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
https://medium.com/@timbur/react -automatic-redux-providers-and-replicators-c4e35a39f1
TL; DR : ๋น์ ์ ๋ง๋ค ์ ์์ต๋๋ค redux
์๋์ผ๋ก์ ๋ฐ๋ผ ๊ตฌ์ฑ ์์์ ์์ ์ ์ผ์น ์ ๊ณต propTypes
. ์ ๋ง ํ์ํ ๊ฒ์ components
๋๋ ํ ๋ฆฌ, providers
๋๋ ํ ๋ฆฌ, ์ ํ ์ฌํญ์ด์ง๋ง ๊ถ์ฅ๋๋ themes
๋๋ ํ ๋ฆฌ์
๋๋ค. ๋ชจ๋ ๊ฒ์ ์ฝ๊ฒ ๊ตํ, ์ดํด, ์ ์ง ๊ด๋ฆฌ, ํ์ฅ ๋ฐ ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค. ํด๋ผ์ด์ธํธ์ ์๋ฒ ๋ชจ๋ ํซ ๋ฆฌ๋ก๋ฉ, ์๋ฒ ๋ ๋๋ง ๋ฑ๊ณผ ๊ฐ์ ๋ชจ๋ ๊ฒ์๋ ํจ์ฌ ๋ ๋ง์ ๊ฒ์ด ํฌํจ๋์ด ์์ต๋๋ค. ์ ๋ ์ค๋ ์ผ์ฐ ํฌํจ๋ ์์ฉ๊ตฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฒ์๋ถํฐ ์ฑ์ ๋น๋ํ์ผ๋ฉฐ ์ฝ 10๋ถ์ด ๊ฑธ๋ ธ์ต๋๋ค. ๋ณดํต 1์๊ฐ ๊ฑธ๋ฆฝ๋๋ค. :)
์ผ๋ฆฌ ๋ฆฌ์กํธ ์ด๋ตํฐ๋ก์์ ๊ฒฝํ์ ๋ฐ๋ฅด๋ฉด ๋๋ ์์ ์์ Github API๋ฅผ ์ฌ์ฉํ์ง ์์ ๊ฒ์ ๋๋ค.
๋์ ๊ฐ๋จํ ์ฌ์ฉ์ ์ ์ API๋ฅผ ์ฌ์ฉํ์ญ์์ค. ์ฐ๋ฆฌ๋ ์ 3์์ ์์กดํ๊ณ ์ถ์ง ์์ผ๋ฉฐ ๋๊ตฌ๋ json-server
์์ ๋ด BottledAPI ์์ (wip)์ ๊ฐ์ ์์ ์ ์ธ์คํด์ค๋ฅผ ์คํํ ์ ์๋๋ก ํฉ๋๋ค.
์ด๊ฒ์ ๋ํ Javascript, Java, C#, PHP ๋ฑ์์ ๋ค๋ฅธ ๋๋จธ์ง ๋ฐฑ์๋ ๊ตฌํ์ ํ์ฉํฉ๋๋ค. ์ด๊ฒ์ ๊ฝค ํดํค ๋ฐฉ์์ผ๋ก ๊ฐ๋ฐ์ ์์ํ๋ ๋ฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค.
์์ ๋ด ์๊ฒฌ์ ์๋ ๋งํฌ ๋ด BTW์๋ ๋ธ๋ก๊ทธ ์ฑ์ ๋น๋ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ธ๋ถ ์ ๋ณด๊ฐ ์์ต๋๋ค. ๋ค์ ์ฃผ ๋ด์ ์ฌ์ฉ์ ์ธ์ฆ๊ณผ ๊ทธ ๋ชจ๋ ๊ฒ์ ์ถ๊ฐํ ๊ณํ์ ๋๋ค.
์๋ ์๋ค์! ์ ๋ ReactJS๋ฅผ ๊ณต๋ถํ๊ณ ์์ผ๋ฉฐ React + Redux๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ธ URL ๋จ์ถ๊ธฐ ๋ฒ์ ์ ๊ฐ๋ฐํ์ต๋๋ค. ๋ด ์์ ๋ ํ๋ฐํธ์๋ ๊ฐ๋ฐ์ ์ํด Gulp + Browserify + Babelify๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ตฌ์ฑ ์์ ๋ฐ ์์ ์ ๋ํด Mocha ๋ฐ Enzyme์ ์ฌ์ฉํ์ฌ ๋จ์ ํ ์คํธ๋ฅผ ์์ฑํ์ต๋๋ค. ์ด ์์๋ ๋ค์๋ ํฌํจ๋ฉ๋๋ค.
์ธํฐํ์ด์ค ๋ฐ ์ฌ์ฉ์ฑ์ ์ฝ๊ฐ์ ๋ฒ๊ทธ๊ฐ ์์ต๋๋ค. ํ์ง๋ง ์๋ํฉ๋๋ค =)
๋๊ตฐ๊ฐ๊ฐ ์ค์ ์ฌ๋ก์ ๊ธฐ๋ฐ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ฐ๋ชจ: https://gustavohenrique.github.io/gh1
์ถ์ฒ: https://github.com/gustavohenrique/gh1
์ด ์์ ๋ฅผ ๊ฐ์ ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ ์์ ์๋ฝํฉ๋๋ค. ๊ฐ์ฌ ํด์!
ํํฐ์ ์กฐ๊ธ ๋ฆ์์ง๋ง Redux๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๋ณธ๊ฒฉ์ ์ธ ๊ด๋ฆฌ ์น ์์ฉ ํ๋ก๊ทธ๋จ์ ์์ํ์ต๋๋ค.
์ฐ๋ฆฌ๋ ๋น๋๊ธฐ ์์
์ redux-thunk ๋ฅผ ์ฌ์ฉํ๊ณ ์ต์์ ๋ฆฌ๋์๋ฅผ ํํฐ๋งํ๋ ๊ฒ๋ง์ผ๋ก ๋๋ผ์ด ๊ฐ์ (_๋ชจ๋ฐ์ผ์์_)์ ์ ๊ณตํ๋ redux-ignore ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์น ์ฑ์ 100% ๋ฐ์ํ๋ฏ๋ก ๋ชจ๋ฐ์ผ์์ ์ฌ์ฉ/ํ
์คํธํ๊ธฐ ์ฝ์ต๋๋ค.
์ด์ ์์ ์ "๋กค๋ฐฑ"ํ์ฌ ๋๊ด์ ์ธ ์ ๋ฐ์ดํธ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. ์ํฅ์ ๋ฐ๋ ๊ฐ์๊ธฐ๋ ์ด์ ์ํ๋ก ๋์๊ฐ๋ ๋ฐฉ๋ฒ์ ์๊ณ ์์ผ๋ฏ๋ก ๋งค์ฐ ๊ฒฉ๋ฆฌ๋๊ณ ํจ์จ์ ์ ๋๋ค.
์ด์จ๋ , ์ฌ๊ธฐ์ ๋งํฌ๊ฐ ์์ต๋๋ค http://www.handy-erp.com/en/
๊ณ์ ์ ๋ง๋ค๊ณ ์ค์ค๋ก๋ฅผ ๋
ธํฌํ์ธ์.
@SebastienDaniel ์ถํํฉ๋๋ค! ์๋ฆ๋ค์ด ์น์ฌ์ดํธ์ ๋๋ค. redux ๋ถ๋ถ์ ๊ณต๊ฐ ์ ์ฅ์์ ๋ฃ์์ต๋๊น?
@gustavohenrique ๊ฐ์ฌํฉ๋๋ค
๋ถํํ๋ ์์ค๋ ๊ณต๊ฐ ๋ฆฌํฌ์งํ ๋ฆฌ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ ๋ ์ด ์์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ง๋ฌธ์ ๋ค๋ฃจ๊ฑฐ๋ ์ปค๋ฎค๋ํฐ๋ฅผ ๋๊ธฐ ์ํ ๋ฐ๋ชจ๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ ๋งค์ฐ ๊ฐ๋ฐฉ์ ์
๋๋ค.
๋ชจ๋ํ์ ์๋ฅผ ๋ณด๊ณ ์ถ์ต๋๋ค. ์์ฒญ๋ ์์ ๊ธฐ๋ฅ์ ๊ฐ์ง ์ฑ์ ๋น๋ํ๋ ๊ฒฝ์ฐ ๋จ์ผ ์ฑ ์ ๋ชจ๋์ ๋น๋ํ๋ ๋ฐฉ๋ฒ์ ์ฐพ๊ณ ์์ต๋๋ค. ํ์ ๋ ์ข๊ณ ์ ์ง ๊ด๋ฆฌ์ ๋ ์ข์ต๋๋ค.
๋จผ์ ๊ณต์ ์ฝ๋ ๊ฐ์ฌํฉ๋๋ค!@gustavohenrique
๋ค๋ฅธ ๊ฒ๋ค:
์ฌ์ฉ์ ๋ชฉ๋ก์ด ์๋๊น? ๋ก๊ทธ์ธ? ๋ฑ๋กํ๋ค...
redux์๋ ์ด๋ฌํ ์์ ๊ฐ ํ์ํฉ๋๋ค!
@gggin ๋ฐ @EricSimons์ ๋์ํฉ๋๋ค. ์ด๋ฌํ ๊ธฐ๋ฅ์ ์์ ํ ์์ฐ ์ค๋น ๋ฒ์ ์ ๋๋์ต๋๋ค.
์ธ์ฆ(์ด๋ฉ์ผ/ํจ์ค ๋ฐ oAuth, JWT)
๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ ๋ฐ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ ๋๊ธ์ฉ CRUD
ํ๋ก์ ์ฌ์ฉ์
๋ชจ๋ ๋ธ๋ก๊ทธ์ ๊ธ๋ก๋ฒ ํผ๋ ๋ฐ ํ๋ก์ฐํ๋ ์ฌ์ฉ์์ ๋ธ๋ก๊ทธ ํผ๋
ํ๊น ์์คํ
์ฌ์ฉ์ ํ๋กํ/ํ๋กํ ์ ๋ณด ํธ์ง
์ด ์ธ์๋ ๊ธฐ๋ณธ ์ญํ ๋๋ ๊ถํ ์์คํ ์ด ์์ผ๋ฉด ์ข์ต๋๋ค. GitHub์ ํ ๋๋ Trello์ ๊ตฌ์ฑ์๊ณผ ๋๋ฑํ ๊ฒ
ํค์ด ์ฌ๋ฌ๋ถ,
์ ๋ ์ง๋ ๋ช ์ฃผ ๋์์ ๊ฒฝํ์ ๋ฐํ์ผ๋ก ๊ฐ๋ ฅํ redux crud api
์ ๋ํ ๋์จํ ์ ์์ ํ๊ณ ์์ต๋๋ค.
https://github.com/ppiekarczyk/redux-crud-api-middleware/blob/master/README.md
์ด๋ค ํผ๋๋ฐฑ์ด๋ ๊ฐ์ฌํ ๋ฐ๊ฒ ์ต๋๋ค. ๊ฐ์ฌ ํด์!
์ ๋ ์ง๊ธ ๋ง๋ค๊ณ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํ ์์ค ์์ ํ๋ก์ ํธ๋ก ๋ณํํ ์ํฅ์ด ์์ต๋๋ค.
์๋ ํ์ธ์. ์์ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๊ฑฐ์ ๊ฒํ ํ ์ค๋น๊ฐ ๋์์์ ์๋ ค๋๋ฆฌ๊ฒ ๋์ด ๊ธฐ์ฉ๋๋ค. ๋งค์ฐ ์ฒ ์ ํ๋ฉฐ ์ด ์ค๋ ๋์์ ์ด์ผ๊ธฐํ ๋๋ถ๋ถ์ ์ค์ ์ฌ์ฉ ์ฌ๋ก(์ธ์ฆ, CRUD, ํ์ด์ง ๋งค๊น ๋ฑ)๋ฅผ ๋ค๋ฃน๋๋ค. @vkarpov15 ์์ ๋ง๋ฌด๋ฆฌํด์ผ ํ ๋ช ๊ฐ์ง ์์ ์ด ์์ง๋ง ๋ค์ ์ฃผ ์ด์ฏค์ ์ค๋น๋ ๊ฒ์ ๋๋ค.
์ฝ๋๋ฒ ์ด์ค๋ฅผ ๊ฒํ ํ๋ ๋ฐ ๋์์ด ๋์์ผ๋ฉด ํฉ๋๋ค. @gaearon ์ด ๋ช ๋ฌ ์ ๊ธฐ๊บผ์ด ์ดํด๋ณด๊ณ ์์ผ๋ฉฐ ์ฌ๊ธฐ ์ปค๋ฎค๋ํฐ์ ๋ชจ๋ ํผ๋๋ฐฑ์ ํ๋ฅญํ ๊ฒ์ ๋๋ค. ๊ฒํ ๋ฐ ๋ฐ๋ณตํ๋ ๋์ ์ด๊ธฐ ์ฝ๋๋ฒ ์ด์ค์ ์ด ๋ฆฌํฌ์งํ ๋ฆฌ ๋ฅผ ์ฌ์ฉํ๊ณ , ์ค๋น๊ฐ ๋๋ฉด ์ต์ข ์ฝ๋๋ฅผ ๊ณต์ redux ๋ฆฌํฌ์งํ ๋ฆฌ์ ๋ฐฐํฌํฉ๋๋ค. ์์ ๋กญ๊ฒ ๋ณํ๋ฅผ ํ์ํ๊ฑฐ๋ ์์ฒญํ๊ณ ์ฝ๋๋ฒ ์ด์ค๊ฐ ์จ๋ผ์ธ ์ํ์ด๊ณ ๊ฒํ ํ ์ค๋น๊ฐ ๋๋ฉด ์ด ์ค๋ ๋์ ์ ๋ฐ์ดํธ๋ฅผ ๊ฒ์ํ ๊ฒ์ ๋๋ค.
์ง๋ฌธ์ ๋ต๋ณํด ๋๋ฆฌ๊ฒ ์ต๋๋ค. ํ๋ฅญํ ํ ๋ก ์ ํด์ฃผ์ ๋ชจ๋ ๋ถ๋ค๊ป ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
์ ๋ค๋ฆฐ๋ค. ์ค๋น๊ฐ ๋๋ฉด ๊ด๋ จ Redux FAQ ์ง๋ฌธ์ ์ธ๊ธ๊ณผ ๋งํฌ๋ฅผ ์ถ๊ฐํ์ธ์.
์ฝ์ํ ๋๋ก ์ฝ๋๋ฒ ์ด์ค๋ https://github.com/GoThinkster/redux-review ์์ ๊ฒํ ํ ์ค๋น๊ฐ ๋์์ผ๋ฉฐ ๋ชจ๋ ์ฌ๋์ ํผ๋๋ฐฑ์ ๋ฃ๊ณ ์ถ์ต๋๋ค. ๋ฌธ์ ๋ฐ ํ๋ณด๋ฅผ ํ์ํฉ๋๋ค!
์ฌ๋ฌ๋ถ, ๋ฉ์ง ํ ๋ก ๊ณผ ํ๋ฅญํ ์ค์ ์ฌ๋ก๋ฅผ ์ ์ํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
์ด๋ฌํ ์์ ๋ชฉ๋ก์ ์ถ๊ฐํ๊ธฐ ์ํด ์ด ์์ https://github.com/andrewngu/sound-redux , ์์ ๋ฐ๋ชจ๊ฐ https://soundredux.io/์ ๋ฐฐํฌ๋ ๊ฒ์ @gaearon ์ด ๋งํ ๊ธฐ์ค์๋ ๋ถํฉํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฌ๋ ํ์คํ์ง ์์ผ๋ฏ๋ก ๋๊ตฐ๊ฐ ํผ๋๋ฐฑ์ ์ค ์ ์๋ค๋ฉด ๋์์ด ๋ ๊ฒ์ ๋๋ค. ์๊ฒฉ์ด ๋๋ ๊ฒฝ์ฐ ๋ชฉ๋ก์ ์ถ๊ฐํ ์ ์์ต๋๋ค. ๊ฒ๋ค๊ฐ ์ง๋ 1๋ ๋ฐ ๋์ ์ ๊ทน์ ์ผ๋ก ์ ์ง ๊ด๋ฆฌํ์ต๋๋ค.
๋ง์ง๋ง์ผ๋ก ๋ฉ์ง ์ค์ ์ฌ๋ก๋ฅผ ์ ๊ณตํ @EricSimons ์๊ฒ ํน๋ณํ ๊ฐ์ฌ๋ฅผ ๋๋ฆฝ๋๋ค.
์ค์ ๋ก http://redux.js.org/docs/faq/Miscellaneous.html#miscellaneous -real-projects ์์ ์ฌ๋ฌ ์ค์ React ๋ฐ Redux ์ฑ์ ๊ฐ๋ฆฌํค๋ FAQ ํญ๋ชฉ์ ์ถ๊ฐํ์ต๋๋ค. (์ฌ์ค ๊ทธ Sound-Redux ์ฑ์ ๋ณธ ์ ์ด ์๋ ๊ฑธ๋ก ์๋๋ฐ, ๋ด ๋ชฉ๋ก์ ์ถ๊ฐํ ๊ฒ ๊ฐ์ง๋ ์๋ค. ํด๋ด์ผ๊ฒ ๋ค.)
์ฐ๋ฆฌ๊ฐ ํ ์ ์๋ "์ค์ " ์ฑ์ ์๋ฅผ ๊ณ ๋ คํ ๋ ๋ ์ด์ ๋ ํฐ ์์ ๋ฅผ Redux ๋ฆฌํฌ์งํ ๋ฆฌ์ ์ง์ ์ถ๊ฐํ ์ฆ๊ฐ์ ์ธ ํ์์ฑ์ด ์์ด ๋ณด์ธ๋ค๋ ์ด์ ๋ก ์ด ๋ฌธ์ ๋ฅผ ์ข ๋ฃํ๊ณ ์ข ๋ฃํ๊ฒ ์ต๋๋ค. ๊ฐ๋ฆฌํค๋ค. ๋๊ตฐ๊ฐ๊ฐ ํน์ ์๋ฅผ ๋ฆฌํฌ์งํ ๋ฆฌ์ ์ ๊ทน์ ์ผ๋ก ๊ธฐ์ฌํ๊ณ ์ถ์ ๊ฒฝ์ฐ ๋ฌด์ธ๊ฐ๋ฅผ ๋งํ๋ฉด ์ด๋ฅผ ๋ค์ ์ด ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์, ํ ๋ก ๊ณผ ์์ ๊ธฐ์ฌํ ๋ชจ๋ ๋ถ๋ค๊ป ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋ค์์ ์ฒ๋ฆฌํ๋ ๊ณต์ CRUD ์์ ๋ฅผ ๊ฐ๊ณ ์ถ์ต๋๋ค.
์ด๊ฒ์ ๋ํ ๊ณผ์ ์ ๋ง๋ค๊ณ ์ถ๋ค๋ฉด ๊ทธ๊ฒ์ ๋๋ผ์ด ์ผ์ ๋๋ค. ๊ทธ๋ฌ๋ ์์ ์์ฒด๊ฐ ์ด ๋ฆฌํฌ์งํ ๋ฆฌ์ ๊ธฐ์ฌํ์ฌ ์ ์ง ๊ด๋ฆฌํ๊ณ ์ต์ ๋ณ๊ฒฝ ์ฌํญ์ ์ต์ ์ํ๋ก ์ ์งํ๋ ๊ฒ์ด ์ค์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ฐ๋ผ์ ๊ธฐ์กด ์์ ์์ ์ฌ์ฉํ๋ ๋น๋ ์์คํ ๋ฐ ๊ท์น๊ณผ ์ผ์นํด์ผ ํฉ๋๋ค.
์ด๊ฒ ๋ง์ด ๋ผ?