Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 스프링 시큐리티
- 코드로배우는스프링웹프로젝트
- 스프링부트핵심가이드
- 알파회계
- d
- resttemplate
- GIT
- 네트워크 설정
- 자료구조와 함께 배우는 알고리즘 입문
- 친절한SQL튜닝
- 선형대수
- 데비안
- 리눅스
- 코드로배우는스프링부트웹프로젝트
- 이터레이터
- /etc/network/interfaces
- 목록처리
- 구멍가게코딩단
- 자료구조와함께배우는알고리즘입문
- 페이징
- ㅒ
- 처음 만나는 AI수학 with Python
- baeldung
- 서버설정
- 처음 만나는 AI 수학 with Python
- 티스토리 쿠키 삭제
- 자바편
- iterator
- network configuration
- Kernighan의 C언어 프로그래밍
Archives
- Today
- Total
bright jazz music
3. React에서 axios 사용하기(POST) 테스트 본문
1. App.js 작성
import axios from "axios";
import { useState, useEffect } from "react";
function NameAndAge(props) {
if (props.data !== null) {
// 입력받은 props.data 에서 직접 값을 가져오는 경우
const name = props.data.name;
const age = props.data.age;
console.log("##name: " + name + ", ##age: " + age);
console.log(
typeof props.data.age,
": props.data.age와 그 값을 입력받은 age 모두 number 타입이다. "
);
console.log("#");
// props.data의 값들을 JSON.stringfy() 하는 경우. number 타입이 string 타입으로 바뀐다.
const jsonName = JSON.stringify(props.data.name);
const jsonAge = JSON.stringify(props.data.age);
console.log("##jsonName: " + jsonName + ", ##jsonAge: " + jsonAge);
console.log(
typeof JSON.stringify(props.data.age),
": JSON.stringfy(props.data.age)와 그 값을 입력받은 jsonAge 모두 string 타입이다. "
);
console.log("#");
// props.data의 값들을 Obect.values() 하는 경우. string, int 타입들이 모두 object 타입으로 바뀐다.
const objectName = Object.values(props.data.name);
const objectAge = Object.values(props.data.age);
console.log("##objectName: " + objectName + ", ##objectAge: " + objectAge);
console.log(
typeof Object.values(props.data.age),
": Object.values(props.data.age)와 그 값을 입력받은 objectAge 모두 object 타입이다. string 타입에 대해서는 캐릭터를 나눠 표시하지만 number나 단일 값에 대해서는 value가 없기 때문에 값이 없다."
);
console.log("#");
return (
<div>
<p>받은 데이터 name: {name}</p>
<p>받은 데이터 age: {age}</p>
<p>받은 데이터 jsonName: {jsonName}</p>
<p>받은 데이터 jsonAge: {jsonAge}</p>
<p>받은 데이터 objectName: {objectName}</p>
<p>받은 데이터 objectAge: {objectAge}</p>
</div>
);
}
}
function App() {
const [data, setData] = useState(null);
const sendData = () => {
const requestData = { name: "John", age: 25 };
axios
.post("http://localhost:8080/axios/post", requestData)
.then((response) => {
console.log("###response.data ", response.data);
setData(response.data);
})
.catch((error) => {
console.error(error);
});
};
return (
<div>
<button onClick={sendData}>데이터 보내기</button>
{/* 에러발생: Objects are not valid as a React child (found: object with keys {name, age}). If you meant to render a collection of children, use an array instead.
객체를 JSX에서 직접 렌더링 하려고 할 때 발생하는 오류.
1. JSON.stringfy를 사용하여 객체를 문자열로 변환하여 출력할 수 있다. 또는
2. Object.value() 를 사용하여 객체의 값을 배열로 변환한 후 출력할 수 있다. 이는 객체의 특성 속성을 렌더링해야 하는 경우 사용된다. */}
{/* <p>받은 데이터: {data}</p> */}
<p>받은 데이터: {JSON.stringify(data)}</p>
{/* 아래와 같이 객체의 존재 여부를 확인하지 않고 표시하는 코드를 써버리면
Cannot convert undefined or null to object
TypeError: Cannot convert undefined or null to object 에러가 발생한다.
이는 undefined 또는 null 값을 객체로 변환하려고 할 때 발생한다.
Object.keys(), Object.values(), Object.entries() 등의 메소드느 undefined 또는 null을 인자로 받지 않기 때문이다.
이 경우 위처럼 if문을 사용하여 undefine 또는 null을 체크하고 값을 넣거나,
또는 undefined 또는 null을 대체할 기본 객체를 만들어 놓는 방법을 사용하여 해결할 수 있다.
<p>받은 데이터 name: {Object.values(data.name)}</p>
<p>받은 데이터 age: {Object.values(data.age)}</p> */}
<NameAndAge data={data}></NameAndAge>
</div>
);
}
export default App;
2. ReactAxiosPostController.java 작성
package com.project.base.controller;
import lombok.Builder;
import lombok.Data;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
@CrossOrigin(origins = "http://localhost:3000" )
@RequestMapping("/axios")
@RestController
public class ReactAxiosPostController {
@PostMapping("/post")
// public ResponseEntity<TestPerson> postTest(@RequestBody TestPerson reqData) {
public TestPerson postTest(@RequestBody TestPerson reqData) {
TestPerson testPerson = TestPerson.builder()
.name(reqData.getName()+" OK!")
.age(reqData.getAge() + 10)
.build();
System.out.println("###testPerson" + testPerson);
// return ResponseEntity.status(HttpStatus.OK).body(testPerson);
return testPerson;
}
}
@Data
@Builder
class TestPerson{
private String name;
private int age;
}
4. ResponseEntity를 사용하여 응답하는 경우
위에서는 반환 시 TestPerson 객체를 직접 반환하였다.
이번에는 응답 타입과 반환부에 ResponseEntity<>를 사용하여 테스트한다.
package com.project.base.controller;
import lombok.Builder;
import lombok.Data;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
@CrossOrigin(origins = "http://localhost:3000" )
@RequestMapping("/axios")
@RestController
public class ReactAxiosPostController {
@PostMapping("/post")
public ResponseEntity<TestPerson> postTest(@RequestBody TestPerson reqData) {
// public TestPerson postTest(@RequestBody TestPerson reqData) {
TestPerson testPerson = TestPerson.builder()
.name(reqData.getName()+" OK!")
.age(reqData.getAge() + 10)
.build();
System.out.println("###testPerson" + testPerson);
return ResponseEntity.status(HttpStatus.OK).body(testPerson);
// return ResponseEntity.status(HttpStatus.NOT_FOUND).body(testPerson);
// return ResponseEntity.status(HttpStatus.FORBIDDEN).body(testPerson);
// return ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE).body(testPerson);
// return testPerson;
}
}
@Data
@Builder
class TestPerson{
private String name;
private int age;
}
'Framework > ReactJs' 카테고리의 다른 글
todo-react-app(front) : fetch 이전 (0) | 2023.05.23 |
---|---|
로그인 후 메인페이지 이동 (작업중) (0) | 2023.05.22 |
2. React에서 axios 사용하기(POST) (0) | 2023.05.21 |
1. React에서 axios 사용하기(GET) (0) | 2023.05.21 |
생활코딩: next.js (0) | 2023.05.18 |
Comments