[JPAλ‘ REST API λ§λ€κΈ°] Module κ³Ό Model μμ±
λͺ¨λμ΄λ?
μ°λ¦¬μ 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();
}
}