• 티스토리 홈
  • 프로필사진
    KIMJAVAN
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
KIMJAVAN
  • 프로필사진
    KIMJAVAN
    • 개발 (178)
      • 마크업 언어 (20)
        • HTML (8)
        • CSS (12)
      • 자바스크립트 (95)
        • JavaScript (35)
        • JS Library (7)
        • React (18)
        • threeJS (6)
        • TypeScript (3)
        • Next js (7)
        • Node JS (18)
        • webGL (1)
      • AI (4)
        • chat-gpt (4)
      • flutter (17)
        • dart (11)
        • flutter (6)
      • Sql (3)
      • PHP (4)
      • Python (2)
      • Git (6)
      • vscode (1)
      • 개발 도움 사이트 (7)
      • 작업기록 (4)
      • 오류 모음 (4)
      • 메모장 (7)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • [Next.js] api example
        2025년 08월 21일
        • KIMJAVAN
        • 작성자
        • 2025.08.21.:08
        728x90

        pages/api/items.js

         

        let items = [] // 메모리에 저장 (DB 대체)
        
        // API 라우트
        export default function handler(req, res) {
          if (req.method === "GET") {
            // READ: 모든 아이템 조회
            res.status(200).json(items)
          } else if (req.method === "POST") {
            // CREATE: 아이템 추가
            const newItem = { id: Date.now(), ...req.body }
            items.push(newItem)
            res.status(201).json(newItem)
          } else if (req.method === "PUT") {
            // UPDATE: 아이템 수정
            const { id, text } = req.body
            items = items.map((item) =>
              item.id === id ? { ...item, text } : item
            )
            res.status(200).json({ id, text })
          } else if (req.method === "DELETE") {
            // DELETE: 아이템 삭제
            const { id } = req.body
            items = items.filter((item) => item.id !== id)
            res.status(200).json({ id })
          } else {
            res.setHeader("Allow", ["GET", "POST", "PUT", "DELETE"])
            res.status(405).end(`Method ${req.method} Not Allowed`)
          }
        }

         

        frontend

        pages/index.js

        import { useState, useEffect } from "react"
        
        export default function Home() {
          const [items, setItems] = useState([])
          const [text, setText] = useState("")
        
          // 데이터 불러오기
          useEffect(() => {
            fetch("/api/items")
              .then((res) => res.json())
              .then(setItems)
          }, [])
        
          // CREATE
          const addItem = async () => {
            if (!text.trim()) return
            const res = await fetch("/api/items", {
              method: "POST",
              headers: { "Content-Type": "application/json" },
              body: JSON.stringify({ text }),
            })
            const newItem = await res.json()
            setItems([...items, newItem])
            setText("")
          }
        
          // UPDATE
          const updateItem = async (id) => {
            const newText = prompt("수정할 내용을 입력하세요:")
            if (!newText) return
            await fetch("/api/items", {
              method: "PUT",
              headers: { "Content-Type": "application/json" },
              body: JSON.stringify({ id, text: newText }),
            })
            setItems(items.map((item) => (item.id === id ? { ...item, text: newText } : item)))
          }
        
          // DELETE
          const deleteItem = async (id) => {
            await fetch("/api/items", {
              method: "DELETE",
              headers: { "Content-Type": "application/json" },
              body: JSON.stringify({ id }),
            })
            setItems(items.filter((item) => item.id !== id))
          }
        
          return (
            <div style={{ padding: "20px" }}>
              <h1>📋 간단한 CRUD 예제</h1>
        
              <input
                value={text}
                onChange={(e) => setText(e.target.value)}
                placeholder="할 일을 입력하세요"
              />
              <button onClick={addItem}>추가</button>
        
              <ul>
                {items.map((item) => (
                  <li key={item.id}>
                    {item.text}{" "}
                    <button onClick={() => updateItem(item.id)}>수정</button>
                    <button onClick={() => deleteItem(item.id)}>삭제</button>
                  </li>
                ))}
              </ul>
            </div>
          )
        }

        '자바스크립트 > Next js' 카테고리의 다른 글

        [next js] project start  (1) 2025.08.30
        [Next] 동적 라우트 / dynamic routes + TS 예시  (0) 2024.12.20
        [next js] metadata 레이아웃사용  (0) 2024.12.20
        [next] metadata 와 use client 충돌  (1) 2024.12.20
        [next js] 오류 / 클라이언트 컴포넌트  (0) 2024.12.19
        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바