๋ฒ ์ด์ง๋ฐ
API์ ์น ์๋ฒ(MVC)
12/10 20:00 ~ 21:20 (์ฝ 1์๊ฐ 20๋ถ ์งํ)
API (Application Programming Interface)
ํ๋ก๊ทธ๋จ๊ณผ ๋ํํ๋ ๋ฐฉ๋ฒ : ํด๋ผ์ด์ธํธ(์ฌ์ฉ์ ๋๋ ์ธ๋ถ ์์คํ )์ด ์๋ฒ์ ์์ฒญํ ์ ์๋ ๊ธฐ๋ฅ ๋จ์์ด๋ค.
ํ ์ผ๊ณผ ๊ด๋ จ๋ 4๊ฐ์ง API ์์
๋๋ณด๊ธฐ
/**
* ํ ์ผ ์์ฑ API
*/
@PostMapping
public String createTodoAPI() {
return "created";
}
/**
* ํ ์ผ ์กฐํ API
*/
@GetMapping
public String getTodoAPI() {
return "retrieve todo";
}
/**
* ํ ์ผ ์์ API
*/
@PatchMapping
public String updateTodoAPI() {
return "update todo";
}
/**
* ํ ์ผ ์ญ์ API
*/
@DeleteMapping
public String deleteTodoAPI() {
return "delete Todo";
}
RESTful API (Representational State Transfer API) - ๋ฉด์ ์์ ๋ฌผ์ด๋ณด๋ ๋ด์ฉ โญโญโญ
์ ํต์ ์ธ API ๋ฐฉ์
๋์ ์ค์ฌ : ์ ํต์ ์ธ API ์ค๊ณ ๋ฐฉ์์ ๋์ ์ค์ฌ ์ค๊ณ๋ก ์ธํด ํ์์ฑ์ด ๋ถ์กฑํ๋ค.
API ์ข ๋ฅ | /createTodo | /updateTodoTilte | /markTodoDone | /archiveTodo |
API ๋์ | ํ ์ผ ์์ฑ | ํ ์ผ ์์ (์ ๋ชฉ) | ํ ์ผ ์์ (์ํ) | ํ ์ผ ์์ (์ํ) |
- ์ด๋ ๊ฒ ์ฌ์ฉํ๋ฉด ์ ์ข์ ์
- ์ค๊ณํ ๋ ๊ต์ฅํ ๋ณต์กํด์ง๋ค.....
- ๋ง๋๋ ์ฌ๋, ์ฌ์ฉํ๋ ์ฌ๋ ๋ชจ๋ ๊ต์ฅํ ํผ๋์ค๋ฝ๋ค...
RESTful API ๋ฐฉ์ (rest architecture style)
์์ ์ค์ฌ : ์์ ์ค์ฌ์ API ์ค๊ณ, API์ ๋์์ HTTP METHOD๋ก ๊ตฌ๋ถํ๋ค.
1. URL - ์์์ ๋ช ์ํ๋ค.
URL | /workspaces/1/todos |
์๋ฏธ | ์ํฌ์คํ์ด์ค 1์ ์ํ ํ ์ผ |
- ๋ณดํต ๋ณต์ํ์ ๊ถ๊ณ ํ๋ค(์ ํธํ๋ค).
2. HTTP METHOD - ๋์์ ๋ช ์ํ๋ค.
HTTP METHOD ์ข ๋ฅ | GET | POST | PATCH | DELETE |
์๋ฏธ | ์กฐํ | ์์ฑ | ์์ | ์ญ์ |
3. RESTful API๋ URL + HTTP METHOD ์กฐํฉํด์ ์ค๊ณํฉ๋๋ค.
- (GET) workspaces/1/todos
- ์ํฌ์คํ์ด์ค 1์ ๋ํ todo ๋ชฉ๋ก ์กฐํ
- (GET) workspaces/1/todos/1
- ์ํฌ ์คํ์ด์ค 1์ ๋ํ todo ๋ชฉ๋ก ์ค, id๊ฐ 1์ธ todo ์กฐํ
- ๊ฐ์ฅ ๋ง์ง๋ง์ ์๋ณ์(id)๊ฐ ๋ค์ด๊ฐ๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค.
- (POST) workspaces/1/todos
- ์ํฌ์คํ์ด์ค 1์ ๋ํ todo ์์ฑ
- (PATCH) workspaces/1/todos/1
- ์ํฌ์คํ์ด์ค 1์ ๋ํ todo ๋ชฉ๋ก ์ค, id๊ฐ 1์ธ ํ ์ผ ์์
- ๊ฐ์ฅ ๋ง์ง๋ง์ ์๋ณ์(id)๊ฐ ๋ค์ด๊ฐ๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค.
- (DELETE) workspaces/1/todos/1
- ์ํฌ์คํ์ด์ค 1์ ๋ํ todo ๋ชฉ๋ก ์ค, id๊ฐ 1์ธ ํ ์ผ ์ญ์
- ๊ฐ์ฅ ๋ง์ง๋ง์ ์๋ณ์(id)๊ฐ ๋ค์ด๊ฐ๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค.
ํ์ ์์ ์ฌ์ฉ๋๋ API ๋ฌธ์ ์คํ์ผ ์์
API ๋ฌธ์ ๋ชฉ๋ก
์ฑ ์ด๋ฆ | ์์ฒญ ๋ฉ์๋ | URL | API ์ค๋ช | ์ฐ์ ์์ | ๋ด๋น์ |
todo | GET | /workspaces/1/todos | ํ ์ผ ์กฐํ API | ๊ธด๊ธ | ์๋ฌธ์ ๊ฐ๋ฐ์ |
todo | POST | /workspaces/1/todos | ํ ์ผ ์์ฑ API | ๋ณดํต | ์๋ฌธ์ ๊ฐ๋ฐ์ |
์) API ๋ฌธ์ ์์ธ : ํ ์ผ ์กฐํ API
Request
๋๋ณด๊ธฐ
- URL
GET https://xxxx.com/workspaces/1/todos
- Headers
ํค | ๊ฐ | ์ค๋ช |
Authorization | Bearer <ํ ํฐ> | ์ฌ์ฉ์ ์ธ์ฆ ํ ํฐ |
Content-Type | application/json | ์์ฒญ ๋ณธ๋ฌธ ํ์ ์ง์ (JSON |
- Query Parameters
ํ๋ผ๋ฏธํฐ ์ด๋ฆ | ํ์ ์ฌ๋ถ | ํ์ | ์ค๋ช |
author | ์ ํ | String | ํ ์ผ์ ์์ฑํ ์์ฑ์์ ์ด๋ฆ (์ : Steve) |
startDate | ์ ํ | String | ๊ฒ์ ์์ ๋ ์ง (YYYY-MM-DD, ์ : 2024-12-01) |
endDate | ์ ํ | String | ๊ฒ์ ์ข ๋ฃ ๋ ์ง (YYYY-MM-DD, ์ : 2024-12-02) |
- Query Parameters ์์
GET /workspaces/1/todos?startDate=2024-12-01&endDate=2024-12-31
- RequestBody
ํ๋ ์ด๋ฆ | ํ์ ์ฌ๋ถ | ํ์ | ์ค๋ช |
empty | empty | empty | empty |
- RequestBody ์์
empty
Response
๋๋ณด๊ธฐ
- ResponseBody
ํ๋ ์ด๋ฆ | ํ์ | ์ค๋ช |
workspace | int | ํ ์ผ์ด ์ํ ์ํฌ์คํ์ด์ค id |
todos | List<Todo> | ํ ์ผ ๋ฆฌ์คํธ |
pagination | Pagination | ํ์ด์ง ์ ๋ณด |
title | string | ํ ์ผ ์ ๋ชฉ |
author | string | ํ ์ผ ์์ฑ์ |
... |
- Response ์์
{
"workspaceId": 1,
"todos": [
{
"id": 1,
"title": "Write monthly report",
"author": "steve",
"status": "done",
"dueDate": "2024-12-15",
"createdAt": "2024-12-01T08:30:00Z"
},
{
"id": 2,
"title": "Prepare presentation",
"author": "john",
"status": "done",
"dueDate": "2024-12-20",
"createdAt": "2024-12-05T09:00:00Z"
}
],
"pagination": {
"currentPage": 1,
"pageSize": 5,
"totalPages": 2,
"totalItems": 10
}
}
- Error Response
ํ๋ ์ด๋ฆ | ์ค๋ช |
error | ์๋ฌ ์ด๋ฆ |
message | ์๋ฌ ๋ฉ์ธ์ง |
- Error Response ์์
{
"error": "Invalid date range",
"message": "The 'startDate' must be earlier than 'endDate'."
}
MVC - ๋ฉด์ ์์ ๋ฌผ์ด๋ณด๋ ๋ด์ฉ โญโญโญ
- Model์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์๋๋ผ ๊ฐ์ฒด์ด๋ค.
- ๊ฐ๊ฐ์ ์ญํ ์ ํ์คํ๊ฒ ์๊ณ ์์ด์ผ ํ๋ค. ๋ด ๋จธ๋ฆฌ ์์ ์ ์ ๋ฆฌํด๋๊ธฐ.. ๐คจ
๊ธฐ๋ณธ์ ์ธ MVC ์์
์ธ๋ถ์ ์ธ MVC ์์
MVC ์ค์ต ์๋๋ฆฌ์ค : ํ์ ๊ด๋ฆฌ ํ๋ก๊ทธ๋จ
- ํ์ ๋ชฉ๋ก ์กฐํ
- ํ์ ๋ชฉ๋ก ํ์ด์ง
- ํ์ ์์ฑ
- ํ์ ์์ฑ ํ์ด์ง
- ํ์ ์์ฑ API
์์กด์ฑ ์ถ๊ฐ
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
member.java
๋๋ณด๊ธฐ
public class Member {
// ์์ฑ
private String name; // ํ์ ์ด๋ฆ
private String email; // ํ์ ์ด๋ฉ์ผ
private int age; // ํ์ ๋์ด
// ์์ฑ์
// ๊ธฐ๋ฅ
// Getter
public String getName() {
return name;
}
public String getEmail() {
return email;
}
public int getAge() {
return age;
}
// Setter
public void setName(String name) {
this.name = name;
}
public void setEmail(String email) {
this.email = email;
}
public void setAge(int age) {
this.age = age;
}
}
(HTML) member-create.html
๋๋ณด๊ธฐ
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>New Member</title>
</head>
<body>
<h1>Create New Member</h1>
<form action="/members" method="post">
<label>Name: <input type="text" name="name" /></label><br />
<label>Email: <input type="email" name="email" /></label><br />
<label>Age: <input type="number" name="age" /></label><br />
<button type="submit">Create</button>
</form>
<a href="/members">Back to List</a>
</body>
</html>
(HTML) member-list.html
๋๋ณด๊ธฐ
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Member List</title>
</head>
<body>
<h1>Member List</h1>
<a href="/members/new">Create New Member</a>
<table>
<tr>
<th>Name</th>
<th>Email</th>
<th>Age</th>
</tr>
<tr th:each="member : ${members}">
<td th:text="${member.name}"></td>
<td th:text="${member.email}"></td>
<td th:text="${member.age}"></td>
</tr>
</table>
</body>
</html>
MvcController.java
๋๋ณด๊ธฐ
@Controller
@RequestMapping("/members")
public class MvcController {
private final List<Member> memberList = new ArrayList<>();
// ์ ์ฒด ํ์ ๋ฆฌ์คํธ ํ์ด์ง ์กฐํ API
@GetMapping
public String getMemberListView(Model model) {
List<Member> foundMemberList = this.getMemberList();
model.addAttribute("members", foundMemberList);
return "member/member-list";
}
// ํ์ ์์ฑ ํ์ด์ง ์กฐํ API
@GetMapping("/new")
public String createMemberListView() {
return "member/member-create";
}
// ํ์ ์์ฑ API
@PostMapping
public String createMemberAPI(@ModelAttribute Member member) {
this.addMember(member);
// return "member/memberlist";
return "redirect:/members";
}
}
'Today I Learned(TIL) > ์์ค๋ณ ํ์ต๋ฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์์ค๋ณ ํ์ต๋ฐ_๋ฒ ์ด์ง๋ฐ 5ํ์ฐจ ์ธ์ (1) | 2024.12.22 |
---|---|
์์ค๋ณ ํ์ต๋ฐ_๋ฒ ์ด์ง๋ฐ 4ํ์ฐจ ์ธ์ (0) | 2024.12.21 |
์์ค๋ณ ํ์ต๋ฐ_๋ฒ ์ด์ง๋ฐ 3ํ์ฐจ ์ธ์ (0) | 2024.12.16 |
์์ค๋ณ ํ์ต๋ฐ_๋ฒ ์ด์ง๋ฐ 1ํ์ฐจ ์ธ์ (0) | 2024.12.07 |
์์ค๋ณ ํ์ต๋ฐ_์คํ ๋ค๋๋ฐ 1ํ์ฐจ (1) | 2024.12.04 |