๋ชจ๋์ด๋?
์ฐ๋ฆฌ์ Todo list ๋ ๊ธฐ๋ฅ์ด ๋จ์ํ todo ๋ฅผ CRUD ํ๋ ๊ฒ ๋ฟ์ด์ง๋ง, ๋ง์ฝ ์ฌ๋ฌ ํ์์ ๊ด๋ฆฌํ๋ ๊ธฐ๋ฅ๊น์ง ์ถ๊ฐํ๋ค๋ฉด ํ ํจํค์ง ์์ ๊ฐ๋ฐํ๋ ๊ฑด ๋นํจ์จ์ ์ด๋ค. ๋ฐ๋ผ์ ๊ธฐ๋ฅ๋ณ๋ก ๋ชจ๋์ ๋๋๋ค. ๋ชจ๋์ ์ด๋ ๊ฒ ๊ธฐ๋ฅ๋ณ, ์ญํ ๋ณ๋ก ๋ถ๋ฆฌํ ๊ฒ์ ๋งํ๋ค. ๊ฐ๊ฐ์ ๋ชจ๋ธ์ ๊ฐ๊ฐ์ ์ปจํธ๋กค๋ฌ, ์๋น์ค, ๋ชจ๋ธ์ ๊ฐ์ง ์ ์๋ค.
todo ๋ชจ๋
ํจํค์ง ์์ todo ํจํค์ง๋ฅผ ์์ฑํด์ค๋ค.
Todo list ์์ ๋น์ฆ๋์ค ๋ชจ๋ธ์ ๋ฐ๋ก todo item ์ด๋ค. ํ ์ผ์ ์ ๋ ํ ์คํธ title ๊ณผ ์๋ฃํ๋์ง ์๋์ง ์ฒดํฌํ๋ done. ๊ทธ๋ฆฌ๊ณ ๊ฐ item ์ ๊ตฌ๋ถํ๋ id ๋ก ๊ตฌ์ฑ๋์ด ์๋ค. ์ด ๋น์ฆ๋์ค ๋ชจ๋ธ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ํด๋์ค๋ค์ ์์ฑํด์ค ๊ฒ์ด๋ค. ํจํค์ง ์๋์ model ํจํค์ง๋ฅผ ์์ฑํด์ค๋ค.
/model/TodoItem.java
todo list ์์ ์ฒ๋ฆฌํ ๋น์ฆ๋์ค ๋ชจ๋ธ์ด๋ค.
package com.todolist.tutorial.todo.model;
import lombok.*;
@Getter @Setter //getter, setter ๋ฉ์๋
@NoArgsConstructor //์ธ์ ์๋ ๊ธฐ๋ณธ ์์ฑ์
@AllArgsConstructor //๋ชจ๋ ์ธ์ ๊ฐ์ง๋ ์์ฑ์
@Builder //๋น๋ ํจํด์ผ๋ก ์์ฑํ๊ฒ ํด์ค.
public class TodoItem {
private Long id;
private String title;
private boolean done;
}
loombook ์ด๋ ธํ ์ด์ ๋๋ถ์ ์๋์ฒ๋ผ class ๋ด๋ถ์ ๊ตฌํํ์ง ์์ ๋ฉ์๋๋ค์ ์ธ ์ ์๊ฒ ํด์ค๋ค.
Request ์ Response ๋ ๊ฐ๊ฐ http ์์ฒญ/์๋ต์ ๋ฐ๋ผ ์ฃผ๊ณ ๋ฐ๋ ๋ฐ์ดํฐ๋ค. TodoItem ์์ฒด๋ฅผ ์๋ตํ๋ฉด ๋น์ฆ๋์ค ๋ก์ง์ ๊ณต๊ฐํ๋ ๊ฒ์ด๋ฏ๋ก ์ง์ํด์ผ ํ๋ค. ๋ Request ๋ฐ์ดํฐ๊ฐ TodoItem ๊ณผ ํํ๊ฐ ์ผ์นํ์ง ์๋ ๊ฒฝ์ฐ๋ ์์ผ๋ฏ๋ก ํ๋ฒ ๋ ๊ฐ์ธ์ฃผ๋ ๊ฒ ์ข๋ค. ์ด๋ ๊ฒ ๋ฐ์ดํฐ ๊ฐ ๊ตํ์ ์ํด ๋น์ฆ๋์ค ๋ก์ง์ ํฌํจ์ํค์ง ์๋ ๊ฐ์ฒด๋ฅผ DTO(Data Transfer Object) ๋ผ๊ณ ํ๋ค.
/model/TodoItemRequest.java
์ด ํ๋ก์ ํธ์์๋ Request ์์ ๋ฑํ ์ฒ๋ฆฌํ ๋ด์ฉ์ด ์์ผ๋ฏ๋ก TodoItem ๋ฅผ ์์ํด์ฃผ๋ฉด ๋๋ค.
package com.todolist.tutorial.todo.model;
public class TodoItemRequest extends TodoItem {
}
/model/ApiResponse.java
TodoItem Response ๋ง ๋ง๋ค์ด๋ ๋์ง๋ง, ๋์ค์ user ๋ฑ์ด ์ถ๊ฐ๋๋ค๋ฉด ๊ฐ๊ฐ์ ๋ํ Response ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ค์ผ ํ๋ค. ๊ทธ๋๋ง๋ค ๋งค๋ฒ ํ๋์ error ๋ฅผ ๋ฃ์ด์ฃผ๋ ๊ฑด ๋นํจ์จ์ ์ด๋ฏ๋ก ๊ณตํต ์์ฑ์ ์์๋ฐ์ ์ ์๋ ๋ถ๋ชจํด๋์ค ํ์ ์์ฑํด์ค๋ค.
package com.todolist.tutorial.todo.model;
import lombok.*;
@Getter @Setter
@NoArgsConstructor
public class ApiResponse<T> {
private T data;
private String errors;
}
/model/TodoItemResponse.java
๋จ์ผ todo item ์ ์๋ตํ ๋ ํ๋ฒ ๋ ๊ฐ์ ์ ์๋ TodoItemResponse ๊ฐ์ฒด๋ค. ๋ณด์์ ๋ ์ ๊ฒฝ์ด๋ค๋ฉด ํ๋ผ๋ฏธํฐ์ TodoItem ์ ๊ทธ๋๋ก ๋ฃ๊ธฐ๋ณด๋ค ๋ฉค๋ฒ ๋ณ์๋ค์ ์ง์ ํ๋ํ๋ ๋ฃ๊ธฐ๋ ํ์ง๋ง ํํ ๋ฆฌ์ผ์ด๋ ํต์งธ๋ก ๋ฃ์๋ค.
package com.todolist.tutorial.todo.model;
import lombok.Builder;
public class TodoItemResponse extends ApiResponse<TodoItem> {
@Builder
public TodoItemResponse(final TodoItem todoItem, final String errors) {
this.setData(todoItem);
this.setErrors(errors);
}
}
/model/TodoItemListResponse.java
์ฌ๋ฌ ๊ฐ์ todo item ์ ์๋ตํ ๋ ๊ฐ์ธ๋ response ๊ฐ์ฒด๋ค.
package com.todolist.tutorial.todo.model;
import lombok.Builder;
import java.util.List;
public class TodoItemListResponse extends ApiResponse<List<TodoItem>> {
@Builder
public TodoItemListResponse(final List<TodoItem> todoItems, final String errors) {
this.setData(todoItems);
this.setErrors(errors);
}
}
/model/TodoItemAdapter.java
TodoItem <-> TodoItemResponse, TodoItemList -> TodoItemListResponse ๋ก ๋ฐ๊ฟ์ฃผ๋ ์ด๋ํฐ๋ฅผ ์์ฑํ๋ค.
package com.todolist.tutorial.todo.model;
import java.util.List;
public class TodoItemAdapter {
//todoITemRequest -> todoItem
public static TodoItem todoItem(final TodoItemRequest todoItemRequest) {
if(todoItemRequest == null) return null;
return TodoItem.builder().title(todoItemRequest.getTitle()).done(todoItemRequest.isDone()).build();
}
//todoItem+error message -> todoItemResponse
public static TodoItemResponse todoItemResponse(final TodoItem todoItem, final String errors) {
return TodoItemResponse.builder().todoItem(todoItem).errors(errors).build();
}
//todoItemList+error message -> todoItemListResponse
public static TodoItemListResponse todoItemListResponse(final List<TodoItem> todoItems, final String errors) {
return TodoItemListResponse.builder().todoItems(todoItems).errors(errors).build();
}
}