Search
Duplicate

๊ฒŒ์‹œํŒ - CRUD

๊ฒŒ์‹œํŒ - 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
๋ณต์‚ฌ