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 상태 코드 적용
이번 강의에서는 실무에서 사용하는 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 실무 프로젝트 만들기