Redux: @connect๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ž‘์—…์„ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์— ๋งŒ๋“  2015๋…„ 07์›” 30์ผ  ยท  32์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: reduxjs/redux

์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ (URL, ํฌ๊ธฐ)๋ฅผ ํ—ค๋” ๊ตฌ์„ฑ ์š”์†Œ๋กœ ์ „๋‹ฌํ•˜๋Š” ํ—ค๋” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@connect(state => ({
  header: state.header
}))
export default class HeaderContainer extends Component {
 /// pass props.header data to child Header which renders image.
}

๊ทธ๋Ÿฐ ๋‹ค์Œ ํ—ค๋” ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์œ„ํ•ด ํ—ค๋” ์ž‘์—…์„ ํ˜ธ์ถœํ•ด์•ผํ•˜๋Š” ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒํƒœ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ž‘์—… ๋งŒ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. Afaik ๋‹ค์Œ๊ณผ ๊ฐ™์ดํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

const { dispatch } = this.props
const actions = bindActionCreators(headerActions, dispatch)

๋ฌธ์ œ๋Š” this.props.dispatch๋Š” @connect ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ํ—ค๋” ์ƒํƒœ์— ์ „ํ˜€ ๊ด€์‹ฌ์ด ์—†์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ connect๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ž‘์—…์„ ๋ฐ”์ธ๋”ฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด @connect ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ž˜๋ชป๋œ ๊ฒƒ

question

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

dispatch ๋ฅผ ํ•ด๋‹น ๊ตฌ์„ฑ ์š”์†Œ์— ์ˆ˜๋™์œผ๋กœ ์†Œํ’ˆ์œผ๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  32 ๋Œ“๊ธ€

"์˜ฌ๋ฐ”๋ฅธ"๋ฐฉ๋ฒ•์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ์ปจํ…์ŠคํŠธ๋ฅผ ํ†ตํ•ด ์ƒ์ ์— ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Connector ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.
https://github.com/gaearon/react-redux/blob/master/src/components/createConnector.js

๋‚˜๋Š” ๋‹น์‹ ์„ ๋”ฐ๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. @connect๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์ ์— ์™„๋ฒฝํ•˜๊ฒŒ ์•ก์„ธ์Šคํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. @connect๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ์ž‘์—…์„ ๋ฐ”์ธ๋”ฉ / ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

dispatch ํ•จ์ˆ˜๋Š” ์ƒ์ ์˜ ๋ฉ”์†Œ๋“œ์ž…๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ์š”์†Œ์— ํ•„์š”ํ•˜์ง€๋งŒ @connect ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด ์ปจํ…์ŠคํŠธ๋ฅผ ํ†ตํ•ด ์ €์žฅ์†Œ์— ์•ก์„ธ์Šคํ•˜๊ณ  ๋””์ŠคํŒจ์น˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

class MyComponent extends Compoenent {
    static contextTypes = {
        store: React.PropTypes.object.isRequired,
    }

    render() {
         const { dispatch } = this.context.store
         const actions = bindActionCreators(headerActions, dispatch)
    }
}

์ƒ์œ„ ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ๋””์ŠคํŒจ์น˜๋ฅผ โ€‹โ€‹์ „๋‹ฌํ•˜๊ฑฐ๋‚˜ ์ด๋ฏธ ๋””์ŠคํŒจ์น˜์— ๋ฐ”์ธ๋”ฉ ๋œ ์ž‘์—…์„ ์ „๋‹ฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด _the_ ๋‚ด๊ฐ€ ๋ฏฟ๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ปจํ…์ŠคํŠธ๋„ ์ž‘๋™ํ•˜์ง€๋งŒ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

์„ค๋ช…ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์ด์ œ ์ดํ•ด๊ฐ€๋œ๋‹ค.

dispatch ๋ฅผ ํ•ด๋‹น ๊ตฌ์„ฑ ์š”์†Œ์— ์ˆ˜๋™์œผ๋กœ ์†Œํ’ˆ์œผ๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋„์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ์•ฝ๊ฐ„ ์˜์•„ํ•ดํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ–ˆ๋‹ค๋ฉด, ์ปดํฌ๋„ŒํŠธ์˜ props๋ฅผ ํ†ตํ•ด dispatch ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ (ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ์—์„œ ์•ก์…˜์„ ๋””์ŠคํŒจ์น˜ ํ•  ์ˆ˜ ์žˆ๋„๋ก) ์ด๋ฏธ dispatch ๋ฐ”์ธ๋”ฉ ๋œ ์•ก์…˜ ์ƒ์„ฑ์ž์—๊ฒŒ ์ œ๊ณตํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋ถ€๋ชจ ๊ตฌ์„ฑ ์š”์†Œ. ๊ทธ๋Ÿฌ๋‚˜ ๋‘ ์†”๋ฃจ์…˜ ๋ชจ๋‘ ํ•ด๋‹น props๋ฅผ ํ†ตํ•ด ๋””์ŠคํŒจ์น˜๋ฅผ โ€‹โ€‹์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก connect ed ์ธ ์ƒ์œ„ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ ์šฐ๋ฆฌ๋Š” dispatch ์˜ ์˜์กด์„ฑ์„ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ connect ed ๋ถ€๋ชจ๊ฐ€ ์—†๋‹ค๋ฉด ์–ด๋–ป๊ฒŒํ• ๊นŒ์š”?

์˜ˆ๋ฅผ ๋“ค์–ด, ์šฐ๋ฆฌ๊ฐ€ ๊ตฌ์„ฑ ์š”์†Œ์˜ ๊นŠ์€ ๊ณ„์ธต ๊ตฌ์กฐ์— ์žˆ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

  Router
    AppContainer
     ...
       ...
         ...
           TheComponentThatNeedDispatch

๋ถ€๋ชจ๊ฐ€ redux ์ƒํƒœ์— ์—ฐ๊ฒฐํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋ฉด?

connect ์‚ฌ์šฉ์˜ ๋ถ€์ž‘์šฉ์œผ๋กœ ๊ตฌ์„ฑ ์š”์†Œ์— ๋””์ŠคํŒจ์น˜๋ฅผ โ€‹โ€‹์‚ฌ์šฉํ•  ์ˆ˜์žˆ๊ฒŒ๋˜๋ฉด ๋ถ€๋ชจ๊ฐ€ connect ์ด๋˜๋„๋กํ•˜๋Š” ๊ฒƒ์ด ์ „์ œ ์กฐ๊ฑด ์ธ ์ƒํ™ฉ์— ๋†“์ด๊ฒŒ๋ฉ๋‹ˆ๋‹ค. dispatch ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. dispatch ์ž‘์—…์— ๋Œ€ํ•œ ๊ตฌ์„ฑ ์š”์†Œ์˜ ๊ธฐ๋Šฅ๊ณผ redux ์ƒํƒœ์—์„œ ์ฝ๊ธฐ ์œ„ํ•ด connect ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” ํ•„์š”์„ฑ ์‚ฌ์ด์— ์–ด๋–ค ์ƒ๊ด€ ๊ด€๊ณ„๊ฐ€ ์—†์–ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์€ ์ด์ƒํ•˜๊ฒŒ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค.

๊ตฌ์„ฑ ์š”์†Œ ์ปจํ…์ŠคํŠธ ( store.dispatch ๋ฅผ ํ†ตํ•ด)์—์„œ ์—ฌ์ „ํžˆ dispatch ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ๊ถŒ์žฅ๋˜๋Š” ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ...

๋‹น์‹ ์ด ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

๊ฐ์‚ฌ!

์•ก์…˜์„ ๋””์ŠคํŒจ์น˜ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ๋Šฅ๋ ฅ๊ณผ redux ์ƒํƒœ์—์„œ ์ฝ๊ธฐ ์œ„ํ•ด connect๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” ํ•„์š”์„ฑ ์‚ฌ์ด์— ์–ด๋–ค ์ƒ๊ด€ ๊ด€๊ณ„๊ฐ€ ์—†์–ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์€ ์ด์ƒํ•˜๊ฒŒ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค.

์™œ ์ด์ƒํ•ด? connect ์„ ๋‹จ์ˆœํžˆ "Redux ์ƒํƒœ์˜ ์ผ๋ถ€์— ์—ฐ๊ฒฐ"์ด ์•„๋‹ˆ๋ผ "Redux์— ์—ฐ๊ฒฐ"์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹ญ์‹œ์˜ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ์š”์†Œ ์ž์ฒด ๋˜๋Š” ์ƒ์œ„ ๊ตฌ์„ฑ ์š”์†Œ ์ค‘ ํ•˜๋‚˜๋ฅผ dispatch ํ•  ์ˆ˜ ์žˆ์œผ๋ ค๋ฉด Redux์— connect() ed๊ฐ€ ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ React Redux API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ƒํƒœ๋ฅผ ์„ ํƒํ•˜์ง€ ์•Š๊ณ  Redux์— ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ํŽธ๋ฆฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. connect(state => ({}))(MyComponent) (๋นˆ ๊ฐ์ฒด ๋ฐ˜ํ™˜)์™€ ๊ฐ™์€ ๊ฒƒ์„ ์ž‘์„ฑํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ dispatch ์ผ๋ฅ˜ ์‹œ๋ฏผ์ด๋˜๋Š” ๋Œ€์ฒด API ๋ฅผ dispatch "์žก๊ธฐ์œ„ํ•œ API๋ฅผ ์ถ”๊ฐ€ ํ•  ๊ณ„ํš ์ธ ์ด์œ ์ž…๋‹ˆ๋‹ค.

์ด๊ฒŒ ๋ง์ด ๋ผ?

์—ฐ๊ฒฐ์„ "Redux ์ƒํƒœ์˜ ์ผ๋ถ€์— ์—ฐ๊ฒฐ"์ด ์•„๋‹ˆ๋ผ "Redux์— ์—ฐ๊ฒฐ"์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹ญ์‹œ์˜ค.

์ด์ œ ์™„์ „ํžˆ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค :).

์ƒˆ๋กœ์šด API ์‚ฌ์šฉ์„ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. Redux๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ํ–‰๋ณตํ•ฉ๋‹ˆ๋‹ค!

https://github.com/gaearon/react-redux/releases/tag/v0.5.0 ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

๋ฉ‹์ง€๋„ค์š”!

@gaearon ์•ˆ๋…• Dan์€ ์ค‘์ฒฉ ๋œ ๊ตฌ์„ฑ ์š”์†Œ์™€ ํ•จ๊ป˜ bindActionCreators๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ํŒ์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

"AddProduct"-redux์— ์—ฐ๊ฒฐ๋จ (์•„๋ž˜ ์ฐธ์กฐ)
__ "์ œํ’ˆ ๋ชฉ๋ก"
____ "ProductView".

ProductView๊ฐ€ ๋””์ŠคํŒจ์น˜ ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•˜์ง€๋งŒ ๋งˆ์Šคํ„ฐ "์ œํ’ˆ ์ถ”๊ฐ€"์—๋งŒ ๋‹ค์Œ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

function appState(state) {
    return {...};
}

export default connect(appState)(AddProduct)

์ค‘์ฒฉ ๋œ ๊ตฌ์„ฑ ์š”์†Œ๋„ connect() ํ•˜๊ฑฐ๋‚˜ dispatch ๋ฅผ ์†Œํ’ˆ์œผ๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ๋Œ„, ๋„์™€ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. redux๋„ ์ •๋ง ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค!

๋‚ด๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋˜ ๋‹ค๋ฅธ ์งˆ๋ฌธ :
๊ฐ์†๊ธฐ ๋‚ด๋ถ€์—์„œ ์„œ๋ฒ„ API ๊ฒŒ์‹œ ์š”์ฒญ์„ ๋ฐฐ์น˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (mongodb)์— POSTํ•˜๋ฉด ํ•ญ๋ชฉ์ด redux ์ƒํƒœ์—์„œ ์›ํ•˜๋Š” "_id"๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค. ๋””์ŠคํŒจ์น˜๋ฅผ โ€‹โ€‹POST ์š”์ฒญ์— ๋Œ€ํ•œ ์ฝœ๋ฐฑ์œผ๋กœ ๋ฐฐ์น˜ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

๊ฐ์†๊ธฐ ๋‚ด๋ถ€์—์„œ ์„œ๋ฒ„ API ๊ฒŒ์‹œ ์š”์ฒญ์„ ๋ฐฐ์น˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

ํ™•์‹คํžˆ ์•„๋‹™๋‹ˆ๋‹ค. ๊ฐ์†๊ธฐ๋Š” ๋ถ€์ž‘์šฉ์ด์—†๋Š” ์ˆœ์ˆ˜ํ•œ ๊ธฐ๋Šฅ์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (mongodb)์— POSTํ•˜๋ฉด ํ•ญ๋ชฉ์ด redux ์ƒํƒœ์—์„œ ์›ํ•˜๋Š” "_id"๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค. ๋””์ŠคํŒจ์น˜๋ฅผ โ€‹โ€‹POST ์š”์ฒญ์— ๋Œ€ํ•œ ์ฝœ๋ฐฑ์œผ๋กœ ๋ฐฐ์น˜ํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?

์˜ˆ.

์ด ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค : http://rackt.github.io/redux/docs/advanced/AsyncActions.html

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค Dan, ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค (y)

์„œ๋ฒ„ ๋ Œ๋”๋ง์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ํ˜„์žฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•˜๋Š” ๊ฒฝ์šฐ
์Šคํ† ์–ด์—์„œ ๋น„๋™๊ธฐ ๊ฐ€์ ธ ์˜ค๊ธฐ๋ฅผ ๊ฑด๋„ˆ ๋›ฐ๊ณ  ์„œ๋ฒ„์—์„œ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์„œ๋ฒ„ ๋ Œ๋”๋ง์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ํ˜„์žฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ ํ•œ ์ƒํƒœ์—์„œ ์Šคํ† ์–ด์—์„œ ๋น„๋™๊ธฐ ๊ฐ€์ ธ ์˜ค๊ธฐ๋ฅผ ๊ฑด๋„ˆ ๋›ฐ๊ณ  ์„œ๋ฒ„์—์„œ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์„œ๋ฒ„์— ์ €์žฅ์†Œ๋ฅผ ๋งŒ๋“ค๊ณ  ๋น„๋™๊ธฐ ์ž‘์—…์ด ์™„๋ฃŒ ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฐ ๋‹ค์Œ ๋ Œ๋”๋ง ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
http://rackt.github.io/redux/docs/recipes/ServerRendering.html ์ฐธ์กฐ

๋‚˜๋Š” ์•„๋งˆ๋„ ์ค‘์š”ํ•œ ๊ฒƒ์„ ๋†“์น˜๊ณ  ์žˆ์ง€๋งŒ ์•ฑ ์ดˆ๊ธฐํ™” ์ค‘์— ๋ชจ๋“  ์•ก์…˜ ์ƒ์„ฑ์ž์—๊ฒŒ ๋ถ€๋ถ„์ ์œผ๋กœ ๋””์ŠคํŒจ์น˜๋ฅผ โ€‹โ€‹์ ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๊ทธ๋Ÿฌ๋ฉด ๋””์ŠคํŒจ์น˜์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์–ป๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•˜์ง€ ์•Š๊ณ  ์–ด๋””์—์„œ๋‚˜ ์ „ํ™”๋ฅผ ๊ฑธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@mpoisot : ์•ฑ ์‹œ์ž‘์‹œ ์ž ์žฌ์  ์ธ ์•ก์…˜ ์ƒ์„ฑ์ž๋ฅผ ์•Œ๊ณ , ๊ฐ€์ ธ์˜ค๊ณ , ๋ฐ”์ธ๋”ฉํ•˜๊ณ , ๋ฐฐํฌํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ฌด์—‡๋ณด๋‹ค๋„ ์ฝ”๋“œ ๋ถ„ํ• ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์—์„œ๋Š” ๋„์›€์ด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@markerikson createStore ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ๋„๋ก app init์˜ ๋ชจ๋“  ๊ฐ์†๊ธฐ๋ฅผ ์ด๋ฏธ ์•Œ๊ณ  ์žˆ์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์ค„์—์„œ bindAllActionCreators(store.dispatch) ์ „ํ™”ํ•˜๋Š” ๊ฒƒ์„ ์ƒ์ƒํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์‹ค, ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์•ฝ๊ฐ„ ๋” ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์ด ์šฐ๋ ค๋œ๋‹ค๋ฉด ์ด๋Ÿฐ ์‹์œผ๋กœํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๋˜๋Š” ๊ฐ์†๊ธฐ ์„ธํŠธ (๊ฐ์†๊ธฐ + ์•ก์…˜ ์ œ์ž‘์ž + ์„ ํƒ๊ธฐ)๋ฅผ ๋” ์ž‘๊ณ  ์ง‘์ค‘๋œ ๋ฒˆ๋“ค๋กœ ๋‚˜๋ˆ•๋‹ˆ๋‹ค. ๋˜๋Š” ์ผ๋ถ€ ์•ก์…˜ ์ œ์ž‘์ž ๋งŒ ๋ฌถ์Šต๋‹ˆ๋‹ค.

์ด ์ž‘์—…์— ๋Œ€ํ•œ ๋”์ฐํ•œ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ์–ด๋–ป๊ฒŒ ๋“  ์ฝ”๋”ฉ ์ง€์˜ฅ์œผ๋กœ๊ฐ€๋Š” ๋”์ฐํ•œ ๊ธธ๋กœ ์ด์–ด์งˆ๊นŒ์š”?

@mpoisot : ๋‚ด๊ฐ€ ์ƒ๊ฐํ•  ์ˆ˜์žˆ๋Š” ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ์„ฑ๊ณผ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ์„ฑ์„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.

connect ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ„๋‹จํ•œ ์ข…์†์„ฑ ์ฃผ์ž… ๋ฐฉ์‹์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค. "์ผ๋ฐ˜"๊ตฌ์„ฑ ์š”์†Œ๋Š” ์ผ๋ถ€ ๊ธฐ๋Šฅ์ด ์†Œํ’ˆ์œผ๋กœ ์ œ๊ณต๋˜๊ณ  ์žˆ์Œ์„ ์•Œ๊ณ  ํ•„์š”์— ๋”ฐ๋ผ ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ ์ƒ์œ„ ๊ตฌ์„ฑ ์š”์†Œ ๋˜๋Š” ์‚ฌ์ „ ๋ฐ”์ธ๋”ฉ ๋œ ์ž‘์—… ์ƒ์„ฑ์ž์— ์˜ํ•ด ์ง์ ‘ ์ „๋‹ฌ ๋œ ์ฝœ๋ฐฑ์ธ์ง€ ์—ฌ๋ถ€๋Š” ์‹ค์ œ๋กœ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์žฌ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ํ›จ์”ฌ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— ์ƒ์ ์„ ์ง์ ‘ ๊ฐ€์ ธ ์˜ค๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ํ•ด๋‹น ํŠน์ • ์ƒ์  ์ธ์Šคํ„ด์Šค ๋ฐ ๊ตฌํ˜„์— ์—ฐ๊ฒฐ๋˜๋ฏ€๋กœ ๊ถŒ์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค (Redux FAQ : http://redux.js.org/docs/faq/). StoreSetup.html # store-setup-multiple-stores). ๋‚ด๊ฐ€ ๋‹น์‹ ์ด ์ •ํ™•ํžˆ ๋ฌด์—‡์„ ์š”๊ตฌํ•˜๋Š”์ง€ ์ดํ•ดํ•œ๋‹ค๋ฉด, ๊ทธ๊ฒƒ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒ์ ์„ ์ง์ ‘ ๊ฐ€์ ธ์˜ค๊ณ  ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค.

์•„ ์ข‹์€ ์ , ์•ก์…˜ ํฌ๋ฆฌ์—์ดํ„ฐ์˜ ๋””์ŠคํŒจ์น˜๋ฅผ โ€‹โ€‹๋ถ€๋ถ„์ ์œผ๋กœ ์ ์šฉํ•˜๋Š” ๊ฒƒ์€ ์Šคํ† ์–ด๋ฅผ ์‹ฑ๊ธ€ ํ†ค์œผ๋กœ ๊ฐ€์ ธ ์˜ค๋Š” ๊ฒƒ๊ณผ ๊ฐ™์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ ์ด์œ ๋ฅผ ์•Œ์•„ ๋ณด๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ๊ณ  Dan Abramov๊ฐ€ ์„œ๋ฒ„ ์ธก ๋ Œ๋”๋ง (๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ๋žŒ๋“ค์ด ์ ˆ๋Œ€ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ)์œผ๋กœ ์ธํ•ด ์‹ฑ๊ธ€ ํ†ค ์Šคํ† ์–ด๊ฐ€ ๋ˆˆ์‚ด์„ ์ฐŒํ‘ธ๋ฆฌ๊ณ  ์žˆ๋‹ค๊ณ  ๋งํ–ˆ์ง€๋งŒ ์ด์ƒํ•˜๊ฒŒ๋„ ๊ทธ๋Š” ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•ด ์–ธ๊ธ‰ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค (๋ชจ๋‘๊ฐ€ํ•ด์•ผ ํ•  ์ผ ๋˜๋Š” ์ ์–ด๋„ ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๊ธฐ๋ถ„์ด ๋‚˜์˜๋‹ค).

์–ด๋–ค ์ ์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ์ €์žฅ์†Œ๋ฅผ ๋‹ค๋ฅธ ์ €์žฅ์†Œ๋กœ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜์žˆ๋Š” ์ €์žฅ์†Œ ๋‹จ์ผ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ? ์Šคํ† ์–ด ์ž์ฒด๋ฅผ ์ง์ ‘ ๋‚ด๋ณด๋‚ด๋Š” ๋Œ€์‹  StoreSingleton.getStore() ๋ฅผ ํ†ตํ•ด ๋ฐ˜ํ™˜ํ•˜๊ณ  StoreSingleton.setStore() ๋ฅผ ํ†ตํ•ด ํ˜„์žฌ ์Šคํ† ์–ด๋ฅผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ…Œ์ŠคํŠธ ์ธก๋ฉด์—์„œ ๋‹จ์ผ ์ €์žฅ์†Œ ์ธ์Šคํ„ด์Šค์— ๋ฌถ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ์Šค๋ ˆ๋“œ ์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@mpoisot ๋ฐฉ๊ธˆ Provider / connect๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ์ž‘์—…์„ ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค. ;)

์–ธ์  ๊ฐ€ ๋””์ŠคํŒจ์น˜ (๋˜๋Š” ์‚ฌ์ „ ๋ฐ”์ธ๋”ฉ ๋œ ์ž‘์—…)๊ฐ€ ํ•„์š”ํ•œ "๋ฉ์ฒญํ•œ"๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์ข…์ข… ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๊ทธ๋ฅผ ์—ฐ๊ฒฐ๋กœ ๊ฐ์‹ธ๊ฑฐ๋‚˜ ์—ฐ๊ฒฐ๋œ ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ๋ฌผ๊ฑด์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „ ์„ธ๊ณ„์ ์œผ๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ํŒŒ๊ฒฌ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๋งŽ์€ ๋ฐฐ์„  ๋ฐ ์ „๋‹ฌ ์†Œํ’ˆ์ฒ˜๋Ÿผ ๋Š๊ปด์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. mapStateToProps ()์˜ ๊ฒฝ์šฐ Provider / connect ()๋กœ ๋†€๋ผ์šด ์„ฑ๋Šฅ ํ–ฅ์ƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฉ์ฒญํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋” ๋†’์€ ์ˆœ์„œ์˜ ๊ตฌ์„ฑ ์š”์†Œ์— ๋””์ŠคํŒจ์น˜ ๋…ผ๋ฆฌ๋ฅผ ์ถ”์ถœํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š”์ด ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ถฉ๋ถ„ํžˆ ์—ฌ๋Ÿฌ ๋ฒˆ ์ณ์„œ ์ด์œ ๊ฐ€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋Œ€๋‹ต์€ "์–ธ์  ๊ฐ€ ์„œ๋ฒ„ ์ธก ๋ Œ๋”๋ง์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก"์ž…๋‹ˆ๋‹ค. (๋‚ด๊ฐ€ ํ‹€๋ ธ๋‹ค๋ฉด ์ •์ •ํ•˜์‹ญ์‹œ์˜ค).

ํ˜„์žฌ connect() ๋Š” Provider ์˜ ์ƒ์ ์—์„œ dispatch ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ ํ–ฅํ›„์—๋Š” ๋ณ€๊ฒฝ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์–ด๋–ค React ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์‹คํ–‰์ค‘์ธ ์ž‘์—…์˜ ์†Œ์Šค์ธ์ง€ ์•Œ๋ ค์ฃผ๋Š” ๊ฐœ๋ฐœ ๋„๊ตฌ์™€์˜ ํ†ตํ•ฉ๊ณผ ๊ฐ™์€ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ปจํ…์ŠคํŠธ์—์„œ ์Šคํ† ์–ด๋ฅผ ๊ฐ€์ ธ ์™€์„œ ์–ด๋–ป๊ฒŒ ๋“  ํ–ฅ์ƒ์‹œํ‚จ ๋‹ค์Œ ํ–ฅ์ƒ๋œ ์Šคํ† ์–ด๋ฅผ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์— ์ „๋‹ฌํ•˜์—ฌ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์Šคํ† ์–ด๋ฅผ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•ก์…˜ ์ œ์ž‘์ž๋ฅผ ์‹ฑ๊ธ€ ํ†ค ์Šคํ† ์–ด์— ๋ฐ”์ธ๋”ฉํ–ˆ๋‹ค๋ฉด ์ž ์žฌ์ ์œผ๋กœ ์ž˜๋ชป๋œ dispatch ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋„ค, ์ œ๊ฐ€ ๋ณธ "๊ตฌ์„ฑ ์š”์†Œ / ์บก์Šํ™” ๋œ ์ƒํƒœ"์‹คํ—˜ ์ค‘ ์ผ๋ถ€๋Š” ์ •ํ™•ํžˆ ๊ทธ ์ ‘๊ทผ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด ์•„์ด๋””์–ด์˜ ๋ฉ‹์ง„ ์ ์€ ๋ž˜ํผ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ์—ฌ์ „ํžˆ this.context.store ์žก๊ณ  ํ•„์š”์— ๋”ฐ๋ผ dispatch ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๋ณ€๊ฒฝ๋œ ์‚ฌํ•ญ์„ ์•Œ ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์˜ ์–‘์ชฝ์— ์žˆ์—ˆ๋‹ค-

๋‚ด ๊ธฐ๋ณธ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ €์žฅ์†Œ๋ฅผ ์‹ฑ๊ธ€ ํ†ค์œผ๋กœ ์ทจ๊ธ‰ํ•˜๊ณ  ์ „์—ญ ์ ์œผ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ getStore() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์„œ๋ฒ„ ์ธก ๋ Œ๋”๋ง์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. connect ๋Œ€ํ•ด mapStateToProps Provider ๋ฐ connect ๋ฅผ ๊ณ„์† ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ฐ˜๋ฉด์— ์ €๋Š” ๊ตฌ์„ฑ ์š”์†Œ ๊ณ„์ธต ๊ตฌ์กฐ ๋‚ด์˜ ์—ฌ๋Ÿฌ ์œ„์น˜์— ์Šคํ† ์–ด ( @jimbolla ๋ฐ @markerikson ์–ธ๊ธ‰)๋ฅผ ๋ž˜ํ•‘ํ•˜๋Š” ์‹คํ—˜์šฉ ์•ฑ์„ ๊ตฌ์ถ•ํ–ˆ์œผ๋ฉฐ dispatch ๋ฐ getState ์ฆ‰, context ๋˜๋Š” props ๋ฅผ ํ†ตํ•ด ์•ฑ ์ „์ฒด์— ์—ฐ๊ฒฐ๋˜์–ด์•ผํ•˜๋ฉฐ ์‹ฑ๊ธ€ ํ†ค์ด ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‹ฌ์„ฑํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ์— ๋”ฐ๋ผ ์‹ฑ๊ธ€ ํ†ค ์Šคํ† ์–ด๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๊ฐœ์ธ์ ์œผ๋กœ๋Š” ์ฒœ์ฒœํžˆ ๋ฉ€์–ด์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋„ค. ๋‹น์‹ ์€ ํ™•์‹คํžˆ ์ƒ์ ์„ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์‹ฑ๊ธ€ ํ†ค์œผ๋กœ ์ทจ๊ธ‰ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ทธ๊ฒƒ์€ ๋‹น์‹ ์„ ์ œํ•œํ•˜๊ณ , ๊ด€์šฉ์  ์ธ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋˜์ง€ ์•Š์œผ๋ฉฐ, ๊ทธ๋ ‡๊ฒŒํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์‹ค์งˆ์ ์ธ ์ด์ ์„ ๋ณด์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ข‹์€ ํ”ผ๋“œ๋ฐฑ์ž…๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์ƒ์  ํฌ์žฅ์„ ๋ณด์—ฌ์ฃผ๋Š” ๋งํฌ๋ฅผ ๊ฒŒ์‹œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฟก๋ฟก

๋‹ค์Œ์€ dispatch ๋ž˜ํ•‘์ด ์œ ์šฉ ํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ฃผ๋Š” Dan์˜ ์˜๊ฒฌ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

https://github.com/reactjs/redux/issues/822#issuecomment -145271384

๋™๊ธฐ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๋” ์ž˜ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ์ „์ฒด ์Šค๋ ˆ๋“œ๋ฅผ ์ฝ์–ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŠนํžˆ dispatch ์ด ์–ด๋–ป๊ฒŒ ๋ž˜ํ•‘๋˜๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค (๊ฐ•์กฐ ํ‘œ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค).

wrappeddispatch

์œ ์‚ฌํ•œ ํ˜ผ๋ž€์— ์ง๋ฉด ํ•˜์—ฌ์ด ์ด์ „ ๊ฒŒ์‹œ๋ฌผ์„ ๋‚ฉ์น˜ํ•˜์—ฌ ์—ฐ๊ฒฐํ•˜์ง€ ์•Š๊ณ  ์กฐ์น˜๋ฅผ ์ทจํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

export default class App extends Component {
...
  componentDidMount() {
    //registering event listener
    BackgroundGeolocation.on('location', this.onLocation, this.onError);
  }

  onLocation(location) {
   //wishing to dispatch an action to update variable in store
  }

  render() {
    return (
      <Provider store={store}>
        <AlertProvider>
          <MainNavigator screenProps={{ isConnected: this.state.isConnected }} />
        </AlertProvider>
      </Provider>
    );
  }
}

๋‚ด๊ฐ€ ์ดํ•ด ํ•œ ๋ฐ”์— ๋”ฐ๋ฅด๋ฉด ์ €์žฅ์†Œ๋ฅผ Provider ๋กœ ๊ตฌ์„ฑํ•˜๊ณ  ์ „๋‹ฌํ•˜๋Š” ์ค‘์ด๋ฏ€๋กœ์ด ๊ตฌ์„ฑ ์š”์†Œ์˜ ์ €์žฅ์†Œ์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. onLocation ์ด๋ฒคํŠธ์—์„œ ์•ก์…˜์„ ์–ด๋–ป๊ฒŒ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@isaaclem : ๊ธ€์Ž„, ๊ทธ ํŠน์ •ํ•œ ๊ฒฝ์šฐ์—, ๋‹น์‹ ์€ ์ƒ์ ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ _do_ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์ง์ ‘ store.dispatch(someAction) ํ˜ธ์ถœ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์˜ต์…˜์€ ์ผ๋ถ€ ๊ตฌ์„ฑ ์š”์†Œ _inside_ <Provider> ๊ฐ€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์œ„์น˜ ์ •๋ณด ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์—ฐ๊ฒฐ๋  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑ ์š”์†Œ ๊ตฌ์กฐ๋ฅผ ์žฌ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰