FR_Page.12

김수현·2025년 3월 31일

Suhyeon's 개발일지

목록 보기
16/34

google Elevation Api를 사용할 때 월에 5000회만 무료라는 제약이 걸려있었다.

초기에 진행한 코드는 단말 기기의 리스트를 띄울 때마다 API를 불러와 사용했다. 이 코드는 같은 주소의 고도를 로드될 때마다 불러온다는 문제점이 있었다.

그래서 DB에 elevation column을 추가하고
사용자가 주소 정보를 지정하고 저장버튼을 클릭할 때 elevation에 저장이 되도록 설정하였다.

formik를 통해 지정해 준 후 formik.handlesubmit()을 통해 저장이 되는데, API를 불러오기 전에 formik.handleusubmit이 먼저 실행이 되어서 저장이 안되는 문제점이 발생했다.
그래서, setTimeout을 통해 formik.handlesubmit을 딜레이 후 실행되도록 해주었다.

<Button
	type={'submit'}
	color={'info'}
	//isOutline={true}
	// isDisable={!formik.isValid}
	onClick={async() => {
		if (!formik.isValid) {
			showNotification(t('사용자 추가'), t('필수값을 확인해주세요.'), 'danger');
		} else {
			await getElevation(formik.values); // elevation 값이 업데이트될 때까지 기다림
			console.log("!!!!!!!!!!!!!!!!!!!!", formik.values.elevation);
			setTimeout(() => {
				console.log("최종 elevation 값:", formikRef.current.values.elevation);
				formik.handleSubmit(); // 값이 업데이트된 후에 저장
			}, 100); // 약간의 딜레이 후 실행

			
		}
	}}
	>
	{selectedUser?.id ? t('수정') : t('등록')}
</Button>

아래는 getElevation 함수이다.

const getElevation = async (device) => {

	const lat = device?.lat;
	console.log("lat주소", lat);
	const lng = device?.lng;
	console.log("lng주소", lng);
	const proxyUrl = "https://cors-anywhere.herokuapp.com/"; 
	const targetUrl =  `https://maps.googleapis.com/maps/api/elevation/json?locations=${lat},${lng}&key=--------`;

	try {
		const response = await fetch(
		(proxyUrl + targetUrl));

		const data = await response.json();
		
		if (data.status === "OK") {
			const elevation = data.results[0].elevation;
			console.log("✅ Elevation 값 가져옴:", elevation);  

			await formik.setFieldValue('elevation', elevation); // ✅ 값을 강제 대기 후 설정
			
		}  else {
		console.error("Elevation API Error:", data.status);
		//alert("고도를 가져오지 못했습니다.");
		}
	} catch (error) {
		console.error("Error fetching elevation:", error);
	}
};

저장이 된 DB를 통해 메인 페이지에서는 아래와 같이 불러왔다.

<div style={{color: '#27547b', fontSize: '1.5rem', marginTop: 0 }}><strong>{d?.install?.elevation.toFixed(2)}m</strong></div>

DB에도 지정해주기 위해 install.model.js에 아래 코드를 추가해주었다.

 elevation: {
        type: DataTypes.DOUBLE,
      },

그 결과 아래와 같이 제대로 값이 나오는 것을 확인할 수 있다.

0개의 댓글