๐Ÿง”โ€โ™‚๏ธ
React๋กœ ํ˜ผ์ž EtherScan API App๋งŒ๋“ค๋‹ค ์ „์— ๋ฐฐ์› ๋˜ useEffect์˜ ์šฉ๋„์™€ ์“ฐ์ž„์ด ์ƒ๊ฐ๋‚˜์ง€ ์•Š์•„ ์ •๋ฆฌํ•˜๋Š” ๊ธ€
ๅญธ่€Œๆ™‚็ฟ’ไน‹ ไธไบฆ่ชชไนŽ




โš›๏ธ useEffect

import { useEffect } from "react";

useEffect('useEffect์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ์€ ํ•จ์ˆ˜', [React DependencyList]);

์ฒซ๋ฒˆ์งธ argument์—๋Š” useEffect๋กœ ์‹คํ–‰์‹œํ‚ค๊ณ  ์‹ถ์€ ํ•จ์ˆ˜๋ฅผ,
๋‘๋ฒˆ์งธ argument์—๋Š” react.js ๊ฐ€ ์ง€์ผœ๋ด์•ผ ํ•  ๊ฒƒ์ด ๋“ค์–ด๊ฐ„๋‹ค. ์ฆ‰, []์•ˆ์— ์žˆ๋Š” Dependency๊ฐ€ ๋ณ€ํ™”ํ• ๋•Œ react.js๊ฐ€ ์ฒซ๋ฒˆ์งธ argument์ธ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰




๐Ÿ’ฅ side Effect, useState

useEffect๋ฅผ ์œ„ํ•ด์„œ๋Š” side Effect์™€ useState๋ฅผ ์•Œ์•„์•ผํ•œ๋‹ค


  • Side Effect

Side Effect : React์—์„œ ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌ๋˜์–ด์ง€๋Š” ํ•จ์ˆ˜

React์—์„œ Side Effect๋Š” ๋น„ํšจ์œจ์„ฑ์„ ๋งŒ๋“ค์–ด๋‚ด๋Š”๋ฐ ์ด๊ฒƒ์„ ๋ฐ”๋กœ์žก์•„์ฃผ๊ธฐ ์œ„ํ•œ ๋„๊ตฌ๊ฐ€ useEffect๋‹ค
์˜ˆ๋ฅผ ๋“ค์–ด, React App์—์„œ ๋‹ค๋ฅธ ์™ธ๋ถ€ ์„œ๋ฒ„๋กœ API๋ฅผ ์š”์ฒญํ•˜๋ฉด ๋‘๊ฐ€์ง€ ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค

์ฒซ ๋ฒˆ์งธ๋กœ, React App์€ ๊ธฐ๋ณธ์ ์œผ๋กœ API๋ฅผ ๊ณ„์† ๋ฐ˜๋ณต์ ์œผ๋กœ ์š”์ฒญํ•จ(๋น„ํšจ์œจ์ ์ž„)
useEffect๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํŠน์ • ๊ฐ’์ด ๋ณ€ํ•˜๊ฑฐ๋‚˜(Dependency๊ฐ€) ์ด๋ฒคํŠธ๊ฐ€ ์ผ์–ด๋‚  ๋•Œ๋งŒ API๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋„๋ก ํ•  ์ˆ˜ ์žˆ์Œ

๋‘ ๋ฒˆ์งธ๋กœ, ์™ธ๋ถ€ ์„œ๋ฒ„์— ๋ฌธ์ œ๊ฐ€ ์žˆ์–ด ์š”์ฒญํ•œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์•„ React App์—์„œ ๊ณ„์†ํ•ด์„œ ์™ธ๋ถ€ ์„œ๋ฒ„์— API์š”์ฒญ์„ ์ง€์†์ ์œผ๋กœ๋ณด๋‚ด๋Š” ๊ฒฝ์šฐ
useEffect๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋น„๋™๊ธฐ ์š”์ฒญ์„ ๋™๊ธฐ์ ์œผ๋กœ ์—๋Ÿฌ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅํ•จ ๋•Œ๋ฌธ์— ์™ธ๋ถ€ ์„œ๋ฒ„์— ๋ฌธ์ œ๊ฐ€ ์žˆ๋”๋ผ๋„ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ์˜๋ฏธ์—†๋Š” API์š”์ฒญ์„ ๊ณ„์†ํ•ด์„œ ๋ณด๋‚ด์ง€ ์•Š์Œ


๊ทธ๋Ÿผ ํŠน์ • ๊ฐ’์ธ Dependency๊ฐ€ ๋ณ€ํ•  ๋•Œ๋งŒ useEffect๋ฅผ ์‹คํ–‰ํ•ด์„œ API๋ฅผ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ
Dependency๋Š” ์–ด๋””์— ์ €์žฅ๋˜์–ด์•ผ ํ•˜๋Š”๊ฐ€?


  • useState
import {useState } from "react";

const [data, setData] = useState('์ดˆ๊ธฐ data๊ฐ’(๋นˆ์นธ ๊ฐ€๋Šฅ)');

//data์— A๊ฐ’์„ ์ €์žฅํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด
setData(A)
console.log(data) // A

React Component์—์„œ ๋ณ€ํ•˜๋Š” ๊ฐ’๋“ค์€ useState๋ฅผ ํ†ตํ•ด ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค




์‹ค์ œ useEffect์‚ฌ์šฉํ•œ ๋ถ€๋ถ„

function Account() {

    const [data, setData] = useState('');
    const [keyword, setKeyword] = useState('');
  
    const [loading, setLoading] = useState(false);
    const [error, setError] = useState(null);
  
    const onChange = (event) => setKeyword(event.target.value);
      
    async function axiosData(keyword) {
        try{
          // ์š”์ฒญ์ด ์‹œ์ž‘ ํ•  ๋•Œ์—๋Š” error๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ณ 
          setError(null);
          // loading ์ƒํƒœ๋ฅผ true ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
          setLoading(true);
    		
          //EtherScan API์š”์ฒญ์„ ํ†ตํ•ด data๋ฐ›์•„์˜ด
          await axios.get(`https://api-goerli.etherscan.io/api?module=account&action=balance&address=${keyword}&tag=latest&apikey='๋‚˜์˜ api key'`)
          .then((res) => { setData(res.data); console.log(res.data); }); //useState์˜ setData๋ฅผ ํ™œ์šฉํ•ด์„œ data์ €์žฅ
    
        } catch(err) { //try catch๋ฌธ์„ ํ†ตํ•ด error์ฒ˜๋ฆฌ
          setError(err);
        }
        setLoading(false);
    } 
  
    //๋น„๋™๊ธฐ Side Effect(axios API์š”์ฒญ)๋ฅผ keyword๊ฐ’์ด ๋ณ€ํ•  ๋•Œ๋งˆ๋‹ค useEffect์ฒ˜๋ฆฌ
    useEffect(() => {
    axiosData(keyword);
    }, [keyword]);




๐ŸŒ account.js

  • ์ „์ฒด์ฝ”๋“œ

EtherScan API๋ฅผ ์ด์šฉํ•ด React App์—์„œ account balance๋ฅผ ๋ฐ›์•„์˜ค๊ธฐ ์œ„ํ•ด ์ ์€ ์ฝ”๋“œ
input ํƒœ๊ทธ์˜ value๊ฐ’์ด(keyword) ๋ณ€ํ•  ๋•Œ๋งŒ(onChange) useEffect๋ฅผ ์‚ฌ์šฉํ•ด์„œ axios๋กœ EtherScan api๋ฅผ ์š”์ฒญํ–ˆ๋‹ค

import '../App.css';

import React from 'react';
import { useEffect, useState } from "react";
import axios from 'axios';

function Account() {

    const [data, setData] = useState('');
    const [keyword, setKeyword] = useState('');
  
    const [loading, setLoading] = useState(false);
    const [error, setError] = useState(null);
  
    const onChange = (event) => setKeyword(event.target.value);
      
    async function axiosData(keyword) {
        try{
          // ์š”์ฒญ์ด ์‹œ์ž‘ ํ•  ๋•Œ์—๋Š” error๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ณ 
          setError(null);
          // loading ์ƒํƒœ๋ฅผ true ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
          setLoading(true);
    
          await axios.get(`https://api-goerli.etherscan.io/api?module=account&action=balance&address=${keyword}&tag=latest&apikey='๋‚˜์˜ api key'`)
          .then((res) => { setData(res.data); console.log(res.data); });
    
        } catch(err) {
          setError(err);
        }
        setLoading(false);
    } 
  
    //๋น„๋™๊ธฐ Side Effect(axios API์š”์ฒญ)๋ฅผ useEffect์ฒ˜๋ฆฌ
    useEffect(() => {
    axiosData(keyword);
    }, [keyword]);
  
  
  
    if (loading) return <div>Loading..</div>; 
    if (error) return <div>์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค</div>;
    
    // ์•„์ง users๊ฐ€ ๋ฐ›์•„์™€ ์ง€์ง€ ์•Š์•˜์„ ๋•Œ๋Š” ์•„๋ฌด๊ฒƒ๋„ ํ‘œ์‹œ๋˜์ง€ ์•Š๋„๋ก ํ•ด์ค๋‹ˆ๋‹ค.
    if (!data) return null;
    
  
    return(
      <div>
            <div className="account-menu">
                <ul className="account-menu__list">
                    <li className="account-menu__item">
                        <span className="account-menu__text">
                            { data.result === "Error! Invalid address format" ? <div>Please input proper account for Balance</div> : <div>{data.result/1000000000000000000} ETH</div> }
                            <input type="text" placeholder="Copy and paste your account.." value={keyword} onChange={onChange}/>
                        </span>
                    </li>
                </ul>
            </div>
      </div>
    )
}

export default Account;
profile
Notorious

0๊ฐœ์˜ ๋Œ“๊ธ€

๊ด€๋ จ ์ฑ„์šฉ ์ •๋ณด

Powered by GraphCDN, the GraphQL CDN