# TIL-20210329

# react 비동기 처리

비동기 처리를 처음 다루는 방식으로 접근해본다.
dipatch같은 스토어 형태의 비동기 서버통신이 아닌 컴포넌트 단위의 비동기 처리를 구현한다.

# 적용 과정

  1. 비동기 데이터가 필요한 컴포넌트를 찾는다. 프로덕트 구조에 맞춰서 비동기 데이터가 필요한 컴포넌트를 정하고 해당 컴포넌트의 state로 설정한다.
  2. 비동기 처리의 트리거가 될 이벤트를 정의한다. 예를 들어 인터넷 쇼핑을 이용한다고 생각해보면,
  1. 검색어 입력
  2. 검색 시작
  3. 검색어에 해당되는 쇼핑 리스트 받아오기
  4. 화면에 보여주기 이 과정에서는 비동기처리는 검색 시작을 요청하는 경우이다.
    보통은 검색 버튼이 클릭 되었을 때라고 생각 해볼 수 있다.
  1. 비동기 통신 구현
// App.js (class Component)
 //...
 this.state = {
   list:[]
 }
 //...
 handleSearch (queryString) {
   // 특정 비동기 처리를 완료하면
   this.state({list: '검색 결과 리스트'})
 }

위와 같은 과정을 통해 리스트 state를 변경하게 된다.
비동기처리는 web client의 내장 mothodfetch를 이용했다.

// 비동기 처리
const api = `https://데이터를 받아오려고 하는 api endpoint + 검색에 필요한 ${queryString}` 
fetch(api) // 비동기 서버 통신
 .then(res => res.json()) // json parsing
 .then(data => { // data는 우리가 받아오려는 아이템 품목 리스트
   this.state({list: data})
 })
  1. 핸들러를 트리거 이벤트에 콜백 설정
// App.js 
 // ...
 <Search handlerSearch={this.handlerSearch} />
 // ... 
// Search.js (class Component)
 // ...
 constructor(props) {
   super(props)
   this.state = {
     queryString:''
   }
   // ... method 바인딩
 }
 handlerInput(e) {
   this.setState({queryString:e.target.value})
 }
 render() {
   return (
 // ...
 <input type="text" onChange={this.handlerInput} value={this.state.queryString}/>
 <button onClick={() => { this.props.handlerSearch(this.state.queryString)}}>검색</button>
 // ...
 )}
 // ... 

Search Component에서 핸들러를 실행 할 수 있도록 App Component에서 props로 내려준다.
buuton 엘리먼트의 onClick이벤트 콜백을 통해 받은 handlerSearch를 실행한다.

결과적으로 Search에서의 액션이 App의 상태를 변경할 수 있게 된다.
비동기 처리의 결과를 통해 this.setState를 실행하기 때문에, 통신이 성공적이라면 항상 새로운 list를 받게 된다.