๊ฒ์ํ - 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
๋ณต์ฌ