본문 바로가기

React

[React] Http 연결, fetch

1. fetch 사용법

get 메서드 보내는 법

export default function Test(){
	
    const [datas, setDatas] = useState([]);
    
    // 상태값을 업데이트 하고 있기 때문에 무한 렌더링을 피하기 위해 useEffect 사용
    useEffect(()=>{
    
    	
    	fetch('http://localhost:8080/test').then((response)=>{
			return response.json(); // 받은 response객체를 json형태로 변환
		}).then((resData)=>{
			setDatas(resData.testObj); // json으로 변환한 response결과에 접근
		}) 
    },[]);
    
    
    
    return <div>
    	{datas.map((elem)=><div key={elem.id}>{elem.title}</div>)}
    </div>


}

- fetch는 Promise(값을 감싸는 객체를 반환, 여기서는 Response객체를 감싼다. )

- then을 사용하면 response 값을 받은 후 코드를 실행 할 수 있고  인자로 response를 받을 수 있다. 이 함수는 response를 받고나서 브라우저를 통해 딱 한번만 실행된다. 즉각적이지 않음.

- response.json() : Json형식의 데이터 추출 가능

 

 

asycn await 사용법, loading중임을 표시

export default function Test(){
	const [isLoading, setIsLoading] = useState(false);	
    const [datas, setDatas] = useState([]);
    
    // 상태값을 업데이트 하고 있기 때문에 무한 렌더링을 피하기 위해 useEffect 사용
    useEffect(()=>{
    
    	async function fetchTestData(){
        	setIsLoading(true); // 로딩중임을 표시
        	const response = await fetch('http://localhost:8080/test');
            const resData = await response.json();
            
            setDatas(resData.testObj); 
        	setIsLoading(false); // 로딩 끝
        }
        
        fetchTestData();
    
    },[]);
    
    
    
    return <>
    {isLoading&& <div>데이터를 가져오는 중입니다.</div>}
    {!isLoading && datas.length > 0  && <div>
    	{datas.map((elem)=><div key={elem.id}>{elem.title}</div>)}
    </div>}
    
    </>
    
    


}

- async 함수는 컴포넌트나  useEffect에 직접적인 사용 불가능.

- 따라서 useEffect 내에서 asycn 함수 정의 후 사용 해야함

 

 

export default function Test(){
	const [isLoading, setIsLoading] = useState(false);	
    const [datas, setDatas] = useState([]);
    const [error, setError] = useState();
    
    useEffect(()=>{
    
    	async function fetchTestData(){
        	setIsLoading(true); // 로딩중임을 표시
            
            try{
            	const response = await fetch('http://localhost:8080/test');
           		const resData = await response.json();
            
           		if(!response.ok){
            		throw new Error("데이터를 불러오는데에 실패했습니다")
            	}
                setDatas(resData.testObj); // error가 안날 시에 실행 되기 때문에 try 안에
            }catch(error){
            
            	setError({message:error.message ||'에러가 발생했습니다.'})
            }
        	
            
            
        	setIsLoading(false); // 에러가 나든 안나든 로딩은 끝나기 때문에 try catch 블록 밖에
        }
        
        fetchTestData();
    
    },[]);
    
    if(error){
    	return <p>{error.message}</p>
    }
    
    return <>
    {isLoading&& <div>데이터를 가져오는 중입니다.</div>}
    {!isLoading && datas.length > 0  && <div>
    	{datas.map((elem)=><div key={elem.id}>{elem.title}</div>)}
    </div>}
    
    </>
    
    


}

 

 

코드 분해 - 재사용성 위해서 

 

testHttp.js

  export async function fetchingTest(){

    const response = await fetch('http://localhost:8080/test');
    const resData = await response.json();

    if(!response.ok){
        throw new Error("데이터를 불러오는데에 실패했습니다")
    }
    
    return resData.testObj;

}

Test.jsx

export default function Test(){
	const [isLoading, setIsLoading] = useState(false);	
    const [datas, setDatas] = useState([]);
    const [error, setError] = useState();
    
    useEffect(()=>{
    
    	async function fetchTestData(){
        	setIsLoading(true); // 로딩중임을 표시
            
            try{
           		const result =  await fetchingTest();
                setDatas(resData.testObj); // error가 안날 시에 실행 되기 때문에 try 안에
            }catch(error){
            
            	setError({message:error.message ||'에러가 발생했습니다.'})
            }
        	
            
            
        	setIsLoading(false); // 에러가 나든 안나든 로딩은 끝나기 때문에 try catch 블록 밖에
        }
        
        fetchTestData();
    
    },[]);
    
    if(error){
    	return <p>{error.message}</p>
    }
    
    return <>
    {isLoading&& <div>데이터를 가져오는 중입니다.</div>}
    {!isLoading && datas.length > 0  && <div>
    	{datas.map((elem)=><div key={elem.id}>{elem.title}</div>)}
    </div>}
    
    </>
    
    


}

 

 

Post 보내는법

testHttp.js

export async function updateTestDatas(testList){
	const respone = await fetch('http://localhost:8080/testList',{
    	method: 'PUT',
        body: : json.stringify({testList})
        headers:{
        	'Content-Type':'application/json'
        }
    })
    
    const resData = await respone.json();
    
    if(!response.ok){
    	throw new Error('업데이트 도중 에러가 발생했습니다.');
        
    }
    
    return resData.message
}

-method 는 수정 하는 PUT

- body에는 백엔드가 받을 수 있는 데이터 형식으로 바꿈 

- headers 에는 데이터 타입

 

export default function Test(){
	const [isLoading, setIsLoading] = useState(false);	
    const [datas, setDatas] = useState([]);
    const [error, setError] = useState();
    const [errorUpdating, setErrorUpdating] = useState();
    
    useEffect(()=>{
    
    	async function fetchTestData(){
        	setIsLoading(true); // 로딩중임을 표시
            
            try{
           		const result =  await fetchingTest();
                setDatas(resData.testObj); // error가 안날 시에 실행 되기 때문에 try 안에
            }catch(error){
            
            	setError({message:error.message ||'에러가 발생했습니다.'})
            }
        	
            
            
        	setIsLoading(false); // 에러가 나든 안나든 로딩은 끝나기 때문에 try catch 블록 밖에
        }
        
        fetchTestData();
    
    },[]);
    
    async function updateDataHandler(){
    	try{
    		await updateTestDatas([...datas,'test']);
            
        }catch(error){
        	setDatas(datas); // 만약 error나면 다시 전 상태로 돌아감
            
        }
    
    }
    
    if(error){
    	return <p>{error.message}</p>
    }
    
    
    return <>
    {isLoading&& <div>데이터를 가져오는 중입니다.</div>}
    {!isLoading && datas.length > 0  && <div>
    	{datas.map((elem)=><div key={elem.id}>{elem.title}</div>)}
    </div>}
    <button onClick={updateDataHandler}>updateData</button>
    </>
    
    


}

- 이 코드에는 작성되지 않았지만 이경우에도 똑같이 error state값을  설정할 수 있음

'React' 카테고리의 다른 글

[React] Form Validation check  (0) 2024.04.18
[React] Custom Hook  (0) 2024.04.17
[React] memo, useMemo  (0) 2024.04.11
[React] useContext  (0) 2024.04.08
[React] useEffect, useCallback  (0) 2024.04.05