게시판 - CRUD
Preview
•
BackEnd
◦
Spring Boot
◦
CRUD 작업
▪
board 테이블 생성
▪
Board.java DTO 생성
▪
BoardMapper.xml
▪
BoardMapper.java
▪
BoardService.java
▪
BoardServiceImpl.java
▪
BoardController.java
•
FrontEnd
◦
React
◦
apis
▪
boards.js
◦
components
▪
board
•
List
•
Read
•
InsertForm
•
UpdateForm
◦
containers
▪
게시글 목록 - ListContainer
▪
게시글 등록 - InsertContainer
▪
게시글 조회 - ReadContainer
▪
게시글 수정 - UpdateContainer
◦
pages
▪
board
•
List
•
Read
•
Insert
•
Update
▪
Home
axios 라이브러리
axios 라이브러리 설치
npm install axios
Bash
복사
axios 사용 방법
◦
import
◦
GET
◦
POST
◦
PUT
◦
DELETE
import
import axios from 'axios';
JavaScript
복사
GET
axios.get("경로")
JavaScript
복사
POST
axios.post("경로", {데이터})
JavaScript
복사
PUT
axios.put("경로", {데이터})
JavaScript
복사
DELETE
axios.delete("경로")
JavaScript
복사
•
BackEnd
◦
Spring Boot
◦
CRUD 작업
▪
board 테이블 생성
▪
Board.java DTO 생성
▪
BoardMapper.xml
▪
BoardMapper.java
▪
BoardService.java
▪
BoardServiceImpl.java
▪
BoardController.java
•
FrontEnd
◦
React
◦
apis
▪
boards.js
◦
components
▪
board
•
List
•
Read
•
InsertForm
•
UpdateForm
◦
containers
▪
게시글 목록 - ListContainer
▪
게시글 등록 - InsertContainer
▪
게시글 조회 - ReadContainer
▪
게시글 수정 - UpdateContainer
◦
pages
▪
board
•
List
•
Read
•
Insert
•
Update
▪
Home
apis
boards.js
// 💻 npm install axios
import axios from 'axios';
// 목록
export const list = () => axios.get("/boards")
// 조회
export const select = (no) => axios.get(`/boards/${no}`)
// 등록
export const insert = (title, writer, content) => axios.post("/boards", {title, writer, content})
// 수정
export const update = (no, title, writer, content) => axios.put("/boards", {no,title,writer,content})
// 삭제
export const remove = (no) => axios.delete(`/boards/${no}`)
JavaScript
복사
components
•
board
◦
List
◦
Read
◦
InsertForm
◦
UpdateForm
List
import React from 'react'
import {Link} from 'react-router-dom'
const List = ({ boardList }) => {
console.log(boardList);
return (
<div className='container'>
<h1>게시글 목록</h1>
<Link to="/boards/insert">글쓰기</Link>
<table border={1}>
<thead>
<tr>
<th>번호</th>
<th>제목</th>
<th>작성자</th>
<th>등록일자</th>
</tr>
</thead>
<tbody>
{boardList.map((board) =>
(
<tr key={board.no}>
<td>{board.no}</td>
<td>
<Link to={`/boards/${board.no}`}>
{board.title}
</Link>
</td>
<td>{board.writer}</td>
<td>{board.regDate}</td>
</tr>
)
)}
</tbody>
</table>
</div>
)
}
export default List
JavaScript
복사
Read
import React from 'react'
import { Link } from 'react-router-dom'
const Read = ({ no, board }) => {
return (
<div className='container'>
<h1 className="title">게시글 조회</h1>
<h3>번호 : {no}</h3>
<hr />
<table>
<tbody>
<tr>
<td>번호</td>
<td>
<input type="text" value={no} readOnly />
</td>
</tr>
<tr>
<td>등록일자</td>
<td>
<input type="text" value={board.regDate} readOnly />
</td>
</tr>
<tr>
<td>제목</td>
<td>
<input type="text" value={board.title} readOnly />
</td>
</tr>
<tr>
<td>작성자</td>
<td>
<input type="text" value={board.writer} readOnly />
</td>
</tr>
<tr>
<td colSpan={2}>내용</td>
</tr>
<tr>
<td colSpan={2}>
<textarea cols="40" rows="10" value={board.content} readOnly></textarea>
</td>
</tr>
</tbody>
</table>
<hr />
<div className="btn-box">
<Link to="/boards" className='btn'>목록</Link>
<Link to={`/boards/update/${no}`} className='btn'>수정</Link>
</div>
</div>
)
}
export default Read
JavaScript
복사
InsertForm
import React, { useState } from 'react'
import { Link } from 'react-router-dom'
const InsertForm = ({ onInsert }) => {
// 🧊 state
const [title, setTitle] = useState('')
const [writer, setWriter] = useState('')
const [content, setContent] = useState('')
// 🌞 함수
const handleChangeTitle = (e) => {
setTitle(e.target.value)
}
const handleChangeWriter = (e) => {
setWriter(e.target.value)
}
const handleChangeContent = (e) => {
setContent(e.target.value)
}
const onSubmit = () => {
// 유효성 검사 ✅
// ...
onInsert(title, writer, content)
}
return (
<div className='container'>
<h1 className='title'>게시글 등록</h1>
<table>
<tbody>
<tr>
<td>제목</td>
<td>
<input type="text"
value={title}
onChange={handleChangeTitle} />
</td>
</tr>
<tr>
<td>작성자</td>
<td>
<input type="text"
value={writer}
onChange={handleChangeWriter} />
</td>
</tr>
<tr>
<td colSpan={2}>내용</td>
</tr>
<tr>
<td colSpan={2}>
<textarea cols="40" rows="10"
value={content}
onChange={handleChangeContent}></textarea>
</td>
</tr>
</tbody>
</table>
<div className="btn-box">
<Link to="/boards" className='btn'>목록</Link>
<button className='btn' onClick={ onSubmit }>등록</button>
</div>
</div>
)
}
export default InsertForm
JavaScript
복사
UpdateForm
import React, { useEffect } from 'react'
import { useState } from 'react'
import { Link } from 'react-router-dom'
const UpdateForm = ({ no, board, onUpdate, onDelete }) => {
// 🧊 state
const [title, setTitle] = useState('')
const [writer, setWriter] = useState('')
const [content, setContent] = useState('')
// 🌞 함수
const handleChangeTitle = (e) => {
setTitle(e.target.value)
}
const handleChangeWriter = (e) => {
setWriter(e.target.value)
}
const handleChangeContent = (e) => {
setContent(e.target.value)
}
const onSubmit = () => {
onUpdate(no, title, writer, content)
}
const handleDelete = () => {
const check = window.confirm("정말로 삭제하시겠습니까?")
if( check ) {
onDelete(no)
}
}
useEffect( () => {
if( board ) {
setTitle(board.title)
setWriter(board.writer)
setContent(board.content)
}
}, [board])
// [의존하는 객체] (⭐의존성 배열)
// : 지정한 객체가 변화했을때, 다시 useEffect 를 실행한다.
return (
<div className='container'>
<h1 className='title'>게시글 수정</h1>
<table>
<tbody>
<tr>
<td>번호</td>
<td>
<input type="text" value={no} readOnly />
</td>
</tr>
<tr>
<td>제목</td>
<td>
<input type="text"
value={title}
onChange={handleChangeTitle} />
</td>
</tr>
<tr>
<td>작성자</td>
<td>
<input type="text"
value={writer}
onChange={handleChangeWriter} />
</td>
</tr>
<tr>
<td colSpan={2}>내용</td>
</tr>
<tr>
<td colSpan={2}>
<textarea cols="40" rows="10"
value={content}
onChange={handleChangeContent}></textarea>
</td>
</tr>
</tbody>
</table>
<div className="btn-box">
<Link to="/boards" className='btn'>목록</Link>
<button className='btn' onClick={handleDelete}>삭제</button>
<button className='btn' onClick={onSubmit}>수정</button>
</div>
</div>
)
}
export default UpdateForm
JavaScript
복사
containers
•
게시글 목록 - ListContainer
•
게시글 등록 - InsertContainer
•
게시글 조회 - ReadContainer
•
게시글 수정 - UpdateContainer
게시글 목록 - ListContainer
import React, { useEffect, useState } from 'react'
import List from '../components/board/List'
import * as boards from '../apis/boards'
const ListContainer = () => {
// 🧊 state
const [boardList, setBoardList] = useState([])
// 🌞 함수
const getBoardList = async () => {
const response = await boards.list()
const data = await response.data // ⭐boardList
setBoardList(data)
}
// ❓ hook
useEffect( ()=> {
getBoardList()
}, [])
return (
<>
{/* 게시글 목록 */}
<List boardList={boardList} />
</>
)
}
export default ListContainer
JavaScript
복사
게시글 등록 - InsertContainer
import React from 'react'
import InsertForm from '../components/board/InsertForm'
import * as boards from '../apis/boards'
import { useNavigate } from 'react-router-dom'
const InsertContainer = () => {
const navigate = useNavigate()
// 🧊 state
// 🌞 함수
const onInsert = async (title, writer, content) => {
try {
const response = await boards.insert(title, writer, content)
const status = await response.status
console.log(`게시글 등록 요청 결과 : ${status}`);
alert("게시글 등록 완료!")
// ➡ 게시글 목록으로 이동
navigate("/boards")
} catch (error) {
console.log(error);
}
}
return (
<>
<InsertForm onInsert={onInsert} />
</>
)
}
export default InsertContainer
JavaScript
복사
게시글 조회 - ReadContainer
import React, { useEffect } from 'react'
import Read from '../components/board/Read'
import { useState } from 'react'
import * as boards from '../apis/boards'
const ReadContainer = ({ no }) => {
// 🧊 state
const [board, setBoard] = useState({})
// 🌞 함수
const getBoard = async () => {
const response = await boards.select(no)
const data = await response.data // ⭐ board
console.log(data);
setBoard(data)
}
// ❓ hook
useEffect( () => {
getBoard()
}, [])
return (
<>
<Read no={no} board={board} />
</>
)
}
export default ReadContainer
JavaScript
복사
게시글 수정 - UpdateContainer
import React, { useEffect, useState } from 'react'
import UpdateForm from '../components/board/UpdateForm'
import * as boards from '../apis/boards'
import { useNavigate } from 'react-router-dom'
const UpdateContainer = ({ no }) => {
// 🧊 state
const [board, setBoard] = useState({})
// 🌞 함수
const navigate = useNavigate()
const getBoard = async () => {
const response = await boards.select(no)
const data = await response.data // ⭐ board
console.log(data);
setBoard(data)
}
const onUpdate = async (no, title, writer, content) => {
try {
const response = await boards.update(no, title, writer, content)
const status = await response.status
console.log(`게시글 수정 요청 결과 : ${status}`);
alert("게시글 수정 완료!")
// ➡ 게시글 목록으로 이동
navigate("/boards")
} catch (error) {
console.log(error);
}
}
const onDelete = async (no) => {
const response = await boards.remove(no)
const status = await response.status
console.log(`게시글 삭제 요청 결과 : ${status}`);
alert("삭제 완료!")
// ➡ 게시글 목록으로 이동
navigate("/boards")
}
// ❓ hook
useEffect( () => {
getBoard()
}, [])
return (
<>
<UpdateForm no={no}
board={board}
onUpdate={onUpdate}
onDelete={onDelete} />
</>
)
}
export default UpdateContainer
JavaScript
복사
pages
•
board
◦
List
◦
Read
◦
Insert
◦
Update
•
Home
board
List
import React from 'react'
import ListContainer from '../../containers/ListContainer'
const List = () => {
return (
<>
{/* Header */}
<ListContainer />
{/* Footer */}
</>
)
}
export default List
JavaScript
복사
Read
import React from 'react'
import ReadContainer from '../../containers/ReadContainer'
import { useParams } from 'react-router-dom'
const Read = () => {
// 🔗❓ 파라미터 가져오기
const { no } = useParams()
console.log(`no : ${no}`);
return (
<>
{/* Header */}
<ReadContainer no={no} />
{/* Footer */}
</>
)
}
export default Read
JavaScript
복사
Insert
import React from 'react'
import InsertContainer from '../../containers/InsertContainer'
const Insert = () => {
return (
<>
{/* Header */}
<InsertContainer/>
{/* Footer */}
</>
)
}
export default Insert
JavaScript
복사
Update
import React from 'react'
import UpdateContainer from '../../containers/UpdateContainer'
import { useParams } from 'react-router-dom'
const Update = () => {
const { no } = useParams()
return (
<>
{/* Header */}
<UpdateContainer no={no} />
{/* Footer */}
</>
)
}
export default Update
JavaScript
복사
Home
import React from 'react'
import {Link} from 'react-router-dom'
const Home = () => {
return (
<div className='container'>
<h1 className='title'>메인 화면</h1>
<h3>게시판 프로젝트</h3>
<Link to="/boards">게시판</Link>
</div>
)
}
export default Home
JavaScript
복사









