axios 설치하기
yarn add axios
npm install axios
사용법 :
Http get axios.get(“url주소”).then().catch();
Http post axios.post(“url주소”).then().catch();
Http 요청에 대한 옵션속성 정의
ajax처럼 사용한다.
axios({
method:’get’,
url : ‘url주소’,
…..,
})
package boot.data.controller;
import boot.data.dto.ShopDto;
import boot.data.service.ShopService;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
@RestController // react 는 무조건 RestController 이다.
@CrossOrigin // react 는 3000 포트, 스프링은 9002포트, 같이 쓸려면 이걸 무조건 해줘야 한다.
@RequestMapping("/shop")
public class ShopController {
@Autowired
private ShopService shopService;
String photoName; // 리액트에서 업로드한 이미지명(혹은 변경한 이미지명..)
@PostMapping("/upload")
public String fileUpload(@RequestParam MultipartFile uploadFile,
HttpServletRequest request){
// 업로드할 폴더 위치
String path=request.getServletContext().getRealPath("/save");
// 파일명
String fileName=uploadFile.getOriginalFilename(); // 이름 겹칠꺼 때문에 sdf 해줬었다.
// 파일명 변경
SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMddHHmmss");
photoName=sdf.format(new Date())+fileName;
System.out.println("fileName: "+fileName+"==>"+photoName);
// save 폴더에 업로드
try {
uploadFile.transferTo(new File(path+"/"+photoName));
} catch (IOException e) {
throw new RuntimeException(e);
}
return photoName;
}
@PostMapping("/insert")
public void insertShop(@RequestBody ShopDto dto){ // @RequestBody : json으로 보낸걸 java 클래스로 변환해야 하므로
// 업로드한 사진으로 photo 변경해주기
dto.setPhoto(photoName);
// insert
shopService.insertShop(dto);
}
@GetMapping("/list")
public List<ShopDto> list(){
return shopService.getShopDatas();
}
@GetMapping("/detail")
public ShopDto detail(@RequestParam int num){
return shopService.getData(num);
}
}
import React, {useEffect, useState} from 'react';
import {useNavigate} from "react-router-dom";
import axios from "axios";
import ShopRowItem from "./ShopRowItem";
function Shop(props) {
const navi=useNavigate(); // 이동할 수 있는 메서드
// 백엔드에서 받아올 list에 대한 데이터 변수
const [shopList,setShopList]=useState([]);
// 데이터를 가져오는 함수를 가져와야 한다.
const list=()=>{
let url="http://localhost:9100/shop/list";
axios.get(url)
.then(res=>{
// 스프링으로부터 받아온 list를 shopList에 넣기
setShopList(res.data);
console.log("len: "+res.data.length); // 이걸 여기서 출력(확인)후 RowItem에서 출력 예정이다.
})
}
// 처음 렌더링 시 딱 한번 데이터 가져오기
useEffect(()=>{
console.log("list: ");
list();
},[]); // 여기서 ,[] 안적으면 계속 생성되네?
return (
<div style={{marginLeft:'100px'}}>
<button type={"button"} className={'btn btn-info'} style={{width:'120px'}} onClick={()=>{
navi("/shop/form");
}}>상품등록</button>
<hr/>
<table className={'table table-bordered'} style={{width:'500px'}}>
<thead>
<tr>
<th width={'60'}>번호</th>
<th width={'140'}>상품명</th>
<th width={'300'}>상세보기</th>
{/*<th width={'60'}>수량</th>*/}
{/*<th width={'60'}>단가</th>*/}
{/*<th width={'60'}>입고일</th>*/}
</tr>
</thead>
<tbody>
{
shopList.map((row,index)=>(
<ShopRowItem row={row} idx={index}/>
))
}
</tbody>
</table>
</div>
);
}
export default Shop;