국비지원교육/React

React 작업 흐름 , BoardList test

HanJW96 2024. 5. 21. 21:46

# index.js

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
);

App.js의 내용을 id가 root엘리멘트에 랜더링한다.

그럼 root는 어디있느냐 

public 에 index.html

 

<Route>  ? 페이지를 이동시킬 때 사용

<Router> ? "/"나 "/boards"요청이 왔을때 ListBoardComponent를 내보내라

<HeaderComponent>와 <FooterComponent>는 라우터 밖에있으므로 페이지가 바뀌어도 출력됨

#App.js

import "./App.css";
//한 페이지에 여러 컴포넌트 배치 또는 출력시에는 반드시 라우터 사용해야 함
import { BrowserRouter as Router, Route, Routes } from "react-router-dom";
//react-router-dom에서 BrowserRouter, Route,Switch를 import하는데 BrowserRouter는 Router로 사용하겠다.
//이 페이지에 보여지게 할 컴포넌트를 임포트함
import ListBoardComponent from "./components/board/ListBoardComponent";
import HeaderComponent from "./components/common/header";
import FooterComponent from "./components/common/footer";
function App() {
  return (
    <div className="App">
      <Router>
        <HeaderComponent />
        <div className="container">
          <Routes>
            <Route path="/" element={<ListBoardComponent />}></Route>
            <Route path="/boards" element={<ListBoardComponent />}></Route>
          </Routes>
        </div>
        <FooterComponent />
      </Router>
    </div>
  );
}

export default App;

#컴포넌트 구조

 

# 컴포넌트 만들기

import React, { Component } from "react";
//컴포넌트 클래스는 반드시 리액트의 Component 클래스를 상속받아야 함
//컴포넌트는 한 페이지에 출력되는 내용을 담은 하나의 div 라고 생각하면 됨
//여기서는 게시글 목록 출력 div 를 컴포넌트로 작성함
class 클래스명(파일명) extends Component {}

# ListBoardComponent

import React, { Component } from "react";
import BoardAxios from "../../axios/BoardAxios";
//컴포넌트 클래스는 반드시 리액트의 Component 클래스를 상속받아야 함
//컴포넌트는 한 페이지에 출력되는 내용을 담은 하나의 div 라고 생각하면 됨
//여기서는 게시글 목록 출력 div 를 컴포넌트로 작성함
class ListBoardComponent extends Component {
  constructor(props) {
    super(props); // 부모에게 매개변수를 넘김

    this.state = {
      //state 필드 선언
      //Json변수
      boards: [], //사이즈가 정해지지 않은 배열 선언
    };
  } //생성자

  componentDidMount() {
    //프론트 프레임워크에서 Mount라는 용어?
    //mount : axios 로 서버로 요청하고 받은 결과를 컴포넌트와 연결시키는 것
    //.then -> success 콜백  , re -> 받은 데이터
    //axios : 자바스크립트 ajax 통신을 처리하는 모듈
    BoardAxios.getBoardList().then((res) => {
      this.setState({ boards: res.data });
    });
    BoardAxios.getBoardDetail().then((res) => {
      console.log(res.data);
    });
  }

  //출력 처리
  render() {
    return (
      <div>
        <h2 className="text-center">Boards List</h2>
        <div className="row">
          <table className="table table-striped table-bordered">
            <thead>
              <tr>
                <th>번호</th>
                <th>제목 </th>
                <th>작성자 </th>
                <th>작성일 </th>
                <th>첨부파일 </th>
                <th>조회수</th>
              </tr>
            </thead>
            <tbody>
              {this.state.boards.map((board) => (
                <tr key={board.boardNum}>
                  <td> {board.boardNum} </td>
                  <td>{board.boardTitle}</td>
                  <td> {board.boardWriter} </td>
                  <td> {board.boardDate} </td>
                  <td> {board.boardOriginalFilename} </td>
                  <td> {board.boardReadcount} </td>
                </tr>
              ))}
            </tbody>
          </table>
        </div>
      </div>
    ); //return
  } //render()
} // class

export default ListBoardComponent;

#BoardAxios

//게시글 서비스 요청과 관련된 함수들을 작성함
//axios : 자바스크립트 ajax 요청과 같은 일을 수행하는 모듈임
import axios from "axios";

//기본 url 지정
const BOARD_BASE_URL = "http://localhost:9999/boards";

class BoardAxios {
  //각 서비스별 메서드 작성
  //게시글 목록 조회 요청 처리용
  getBoardList() {
    return axios.get(`${BOARD_BASE_URL}/list?page=1&limit=10`);
  }

  //게시글 상세보기 요청 처리용
  getBoardDetail(boardNum) {
    return axios.get(BOARD_BASE_URL + "/" + boardNum);
  }

  //새 게시글 등록 처리용
  postBoardInsert() {}

  //게시글 수정 처리용
  putBoardUpdate() {}

  //게시글 삭제 처리용
  deleteBoard() {}

  //게시글 검색
  getBoardTitle() {}

  getBoardWriter() {}

  getBoardDate() {}
} // class closed

//외부에서 이 클래스를 import해서 사용하게 하려면
export default new BoardAxios(); //객체를 내보냄

getBoardList() 부분 url 쿼리 작성해야함 .

why? 컨트롤러에서 그렇게 받고있음. 페이징처리를 위해 

테스트용이니 임시로 1과 10을 날려서 보냄

결과