FRONT-END/REACT
[REACT] form 데이터를 비동기로 서버에 전달
썬키
2023. 3. 10. 21:29
위와 같이 아이디, 제목, 내용을 입력하고 등록버튼을 누르면
작성한 데이터들을 서버로 전달하는 하나의 폼이 있다고 가정하자.
원초적인 방법으로는 각 입력 태그마다 name이라는 Attribute를 부여해서 값을 전달했는데
React에서는 FormData 라는 객체를 이용해서 서버로 데이터를 전달할 수 있다.
그래서, 이번 포스트에서 다뤄볼 내용은 다수의 데이터들을 서버에 전달할 때
어떻게하면 쉽고 간단하게 비동기 방식으로 처리할 수 있을까에 대한 내용이다.
FormData
FormData 객체는 폼 요소들의 값을 쉽게 저장하고 서버에 전송할 수 있는 방법을 제공한다.
파일 업로드와 같은 복잡한 데이터를 처리할 수 있다는 장점이 있다.
사용법
// FormData 객체 생성
let formData = new FormData();
// append 함수를 이용해서 키 값과 form 태그의 value값 담기
formData.append("key", value);
예제 코드
서버 단에 다음과 같은 코드가 있다고 가정하자.
@RequestMapping
@PostMapping("/bbswrite")
public String write(BbsDto dto) {
int count = service.write(dto);
return count > 0 ? "성공적으로 등록되었습니다." : "error";
}
이 메서드는 parameter로 BbsDto 객체를 전달받고, service의 write()를 실행하여
결과를 int 값으로 받아온 후, 결과 값이 0보다 크면 글 작성이 완료되었다는 메세지를 출력하는 메서드이다.
프론트 단에는 다음과 같이 코드를 작성한다.
import React, {useState} from "react";
import Axios from "axios";
export default function App() {
// 서버에 넘겨줄 데이터 state
const [id, setId] = useState('');
const [title, setTitle] = useState('');
const [content, setContent] = useState('');
// 각 인풋 태그 마다의 핸들러 등록
const changeId = (e) => {
setId(e.target.value);
};
const changeTitle = (e) => {
setTitle(e.target.value);
};
const changeContent = (e) => {
setContent(e.target.value);
};
return (
<div>
<h3>글 작성하기</h3>
<form onSubmit={submit}>
<table>
<thead>
</thead>
<tbody>
<tr>
<td><input onChange={changeId} placeholder="아이디를 입력해주세요"/></td>
</tr>
<tr>
<td><input onChange={changeTitle} placeholder="제목을 입력해주세요"/></td>
</tr>
<tr>
<td><input onChange={changeContent} placeholder="내용을 입력해주세요"/></td>
</tr>
</tbody>
</table>
<input type="submit" value="작성완료" />
</form>
</div>
)
}
기본적으로 필요한 것들은 다 준비가 되었다.
이제 작성완료 버튼을 클릭하면 서버에 데이터를 비동기 방식으로 전달하는 함수를 만들어보자.
const submit = (e) => {
e.preventDefault();
// FormData 객체 생성
let formData = new FormData();
// formData 변수에 form에 있는 값들을 하나씩 담기
// append 함수를 이용!
formData.append("id", id);
formData.append("title", title);
formData.append("content", content);
// axios를 이용해 비동기 방식으로 서버에 데이터 전달
axios.post("http://localhost:3000/bbswrite", formData)
.then(function(res) {
alert(res);
window.location.href="http://localhost:9100/bbslist";
})
.catch(function(error) {
console.log(error);
})
}
실행
글 작성이 성공적으로 되었다는 메세지를 받을 수 있다.