백엔드-노드

노드 실전

강사: 오백엔드 · 작성자: 이종춘 · 작성일: 2026-07-08 18:07:56 · 조회수: 12

22강. REST API 실무 프로젝트 만들기
목록으로
22강. REST API 실무 프로젝트 만들기

이번 강의에서는 실무에서 사용하는 REST API 설계 방법을 배웁니다.

목표: 일관성 있는 API를 설계하고, React·모바일 앱과 쉽게 연동할 수 있는 REST API를 구현합니다.

1. REST API란?

REST API는 클라이언트(React, 모바일 앱)와 서버(Node.js)가 데이터를 주고받는 규칙입니다.

구조

React

↓

Axios

↓

REST API

↓

Express

↓

MySQL

2. REST API 설계 원칙

좋은 API는 URL이 명확해야 합니다.

좋은 예

GET /members
GET /members/1
POST /members
PUT /members/1
DELETE /members/1

좋지 않은 예

/getMember
/deleteMember
/updateMember

HTTP Method로 동작을 구분합니다.

3. API 버전 관리

실무에서는 API 버전을 URL에 포함합니다.

/api/v1/members
/api/v1/boards
/api/v1/products

프로젝트 구조

routes
│
└── api
└── v1
├── member.js
├── board.js
└── product.js

4. Express 설정
const express = require("express");

const app = express();

const memberRouter = require("./routes/api/v1/member");

app.use(express.json());

app.use("/api/v1/members", memberRouter);

app.listen(3000);

5. REST URL 설계
기능 Method URL
회원목록 GET /api/v1/members
회원조회 GET /api/v1/members/:id
회원등록 POST /api/v1/members
회원수정 PUT /api/v1/members/:id
회원삭제 DELETE /api/v1/members/:id

6. 응답 형식 통일

실무에서는 응답 형식을 통일하는 것이 좋습니다.

성공

{
"success": true,
"message": "조회 성공",
"data": [
{
"id":1,
"name":"커사맨"
}
]
}

실패

{
"success": false,
"message": "회원이 없습니다.",
"data": null
}

7. 목록 조회
router.get("/", (req, res) => {

const sql = "SELECT * FROM member";

db.query(sql, (err, result) => {

if(err){

return res.status(500).json({

success:false,

message:"DB 오류"

});

}

res.json({

success:true,

message:"조회 성공",

data:result

});

});

});

8. 상세 조회
router.get("/:id", (req, res) => {

const sql =

"SELECT * FROM member WHERE id=?";

db.query(sql,

[req.params.id],

(err,result)=>{

res.json({

success:true,

data:result

});

});

});

9. 페이지네이션(Pagination)

예를 들어

회원 1000명

모두 가져오지 않고

10명씩

가져옵니다.

SQL

SELECT *

FROM member

LIMIT 0,10;

Node.js

const page = Number(req.query.page) || 1;

const limit = 10;

const offset = (page-1) * limit;

const sql =

"SELECT * FROM member LIMIT ?,?";

10. 검색 기능
SELECT *

FROM member

WHERE name

LIKE '%홍%';

Node.js

const keyword = req.query.keyword;

const sql =

"SELECT *

FROM member

WHERE name LIKE ?";

값

["%" + keyword + "%"]

11. 정렬

최신순

ORDER BY id DESC

오래된 순

ORDER BY id ASC

Node.js

const sql =

"SELECT *

FROM board

ORDER BY id DESC";

12. 회원 등록
router.post("/", (req, res) => {

const { name, age } = req.body;

const sql =

"INSERT INTO member(name,age)

VALUES(?,?)";

db.query(sql,

[name, age],

() => {

res.json({

success:true,

message:"등록 완료"

});

});

});

13. 회원 수정
router.put("/:id",(req,res)=>{

const{

name

}=req.body;

const sql=

"UPDATE member

SET name=?

WHERE id=?";

db.query(

sql,

[name,req.params.id],

()=>{

res.json({

success:true

});

});

});

14. 회원 삭제
router.delete("/:id",(req,res)=>{

const sql=

"DELETE

FROM member

WHERE id=?";

db.query(

sql,

[req.params.id],

()=>{

res.json({

success:true

});

});

});

15. HTTP 상태 코드
코드 의미
200 성공
201 생성 완료
400 잘못된 요청
401 인증 필요
403 권한 없음
404 찾을 수 없음
500 서버 오류

예시

res.status(201).json({

success:true

});

16. API 테스트

회원 목록

GET

/api/v1/members

회원 등록

POST

/api/v1/members

회원 수정

PUT

/api/v1/members/1

회원 삭제

DELETE

/api/v1/members/1

17. React 연결
axios.get(

"/api/v1/members"

);

↓

setData(

res.data.data

);

18. 프로젝트 구조
project

│

├── routes

│ api

│

├── controllers

├── models

├── middleware

├── config

├── uploads

└── public

19. 실무 API 예시
/api/v1/login

/api/v1/join

/api/v1/member

/api/v1/board

/api/v1/comment

/api/v1/upload

20. 이번 강의 핵심 정리
기능 Method
목록 GET
상세 GET
등록 POST
수정 PUT
삭제 DELETE

추가 기능

페이지네이션
검색
정렬
상태 코드
응답 형식 통일
실무 팁

실무에서는 다음과 같은 구조를 많이 사용합니다.

GET /api/v1/boards?page=1&limit=10
GET /api/v1/boards?keyword=node
GET /api/v1/boards?sort=desc

또는 여러 옵션을 조합합니다.

GET /api/v1/boards?page=2&limit=10&keyword=node&sort=desc

이렇게 하면 하나의 API로 검색 + 정렬 + 페이지네이션을 모두 처리할 수 있습니다.

실습 미션

다음 기능을 구현해 보세요.

✅ 회원 CRUD
✅ 게시판 CRUD
✅ 페이지네이션
✅ 검색
✅ 최신순 정렬
✅ 응답 형식 통일
✅ HTTP 상태 코드 적용
#22강. REST API 실무 프로젝트 만들기

첨부 파일

0개
첨부된 파일이 없습니다.

댓글 / 답글

0개
댓글을 작성하려면 로그인하세요.
아직 댓글이 없습니다.