백엔드-노드

노드 실전

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

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개
댓글을 작성하려면 로그인하세요.
아직 댓글이 없습니다.