๐Ÿšง

[JPA๋กœ REST API ๋งŒ๋“ค๊ธฐ] Controller ์™€ Service ์ƒ์„ฑ

purpplee 2021. 11. 25. 13:55

์ด์ „ ๊ฒŒ์‹œ๋ฌผ์—์„œ REST api ๋ฅผ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ฐ„๋‹จํžˆ ๋ช…์„ธํ–ˆ์—ˆ๋‹ค. ์•„์ง DB ์™€ ์—ฐ๊ฒฐํ•˜์ง€ ์•Š์•˜์œผ๋‹ˆ ์ด๋Œ€๋กœ ์ปจํŠธ๋กค๋Ÿฌ์™€ ์„œ๋น„์Šค์˜ ํ‹€์„ ๋งŒ๋“ค์–ด๋ณด๊ฒ ๋‹ค.

Description HTTP method Route
todo list ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค GET /todos
todo ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค GET /todo/:id
todo ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค POST /todo
todo ๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค PUT or PATCH /todo/:id
todo ๋ฅผ ์‚ญ์ œํ•œ๋‹ค DELETE /todo/:id

 

/todo/TodoItemService.java

์ฝ”๋“œ๊ฐ€ ํ•˜๋‚˜ ๋ฟ์ด๋ฏ€๋กœ todo ๋ฐ”๋กœ ์•„๋ž˜์— ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•ด์ค€๋‹ค. ์•ˆ์˜ ๋‚ด์šฉ์€ DB ์—ฐ๊ฒฐ ํ›„ ์ž‘์„ฑํ•ด์ค„ ๊ฒƒ์ด๋‹ค.

package com.todolist.tutorial.todo;

import com.todolist.tutorial.todo.model.TodoItem;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class TodoItemService {
    public List<TodoItem> getTodos() {
    
    }

    public TodoItem getTodoById(final Long id) {
        
    }

    public TodoItem createTodo(final TodoItem createTodoItem) {
        
    }

    public TodoItem updateTodo(final long id, final TodoItem updateTodoItem) {
        
    }

    public void deleteTodoById(final Long id) {
       
    }
}

 

/todo/TodoItemController.java

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ฝ”๋“œ๊ฐ€ ํ•˜๋‚˜ ๋ฟ์ด๋ฏ€๋กœ todo ํŒจํ‚ค์ง€ ๋ฐ”๋กœ ์•„๋ž˜์— ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•ด์ค€๋‹ค. ์„œ๋น„์Šค ์ธ์Šคํ„ด์Šค๋ฅผ ์ปจํŠธ๋กค๋Ÿฌ์— ์ฃผ์ž…ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด @Autowired ์–ด๋…ธํ…Œ์ด์…˜์„ ๋ถ™์—ฌ์ฃผ์—ˆ๋‹ค. @RequestBody, @ResponseBody ๋Š” JSON -> ์ž๋ฐ”๊ฐ์ฒด, ์ž๋ฐ”๊ฐ์ฒด -> JSON ์œผ๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ์–ด๋…ธํ…Œ์ด์…˜์ด๋‹ค. ์ฆ‰, ์šฐ๋ฆฌ๋Š” ๋ชจ๋“  ์‘๋‹ต์„ JSON ์œผ๋กœ ํ•ด์ค„ ๊ฒƒ์ด๋‹ค.

package com.todolist.tutorial.todo;

import com.todolist.tutorial.todo.model.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/todos")
public class TodoItemController {
    @Autowired
    private TodoItemService todoItemService;
    private final static String DEFAULT_ERR_MSG = "no errors";

    //๋ชจ๋“  todo or errors ๋ฅผ ์‘๋‹ตํ•œ๋‹ค.
    @RequestMapping(method = RequestMethod.GET)
    public @ResponseBody TodoItemListResponse getTodos() {
        String errors = DEFAULT_ERR_MSG;
        List<TodoItem> todoItems = null;

        try {
            todoItems = todoItemService.getTodos();
        } catch(final Exception e){
            errors = e.getMessage();
        }

        return TodoItemAdapter.todoItemListResponse(todoItems, errors);
    }

    //id์— ํ•ด๋‹นํ•˜๋Š” todo ํ•˜๋‚˜ or errors ๋ฅผ ์‘๋‹ตํ•œ๋‹ค.
    @RequestMapping(method = RequestMethod.GET, value = "/{id}")
    public @ResponseBody TodoItemResponse getTodoById(@PathVariable(value = "id") Long id) {
        String errors = DEFAULT_ERR_MSG;
        TodoItem todoItem = null;

        try {
            todoItem = todoItemService.getTodoById(id);
        } catch (final Exception e) {
            errors = e.getMessage();
        }

        return TodoItemAdapter.todoItemResponse(todoItem, errors);
    }

    //์ƒˆ๋กœ์šด todo ํ•˜๋‚˜๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ์ƒ์„ฑํ•œ ํˆฌ๋‘ or errors ๋ฅผ ์‘๋‹ตํ•œ๋‹ค.
    @RequestMapping(method = RequestMethod.POST)
    public @ResponseBody TodoItemResponse createTodo(@RequestBody final TodoItemRequest todoItemRequest) {
        String errors = DEFAULT_ERR_MSG;
        TodoItem createTodoItem = TodoItemAdapter.todoItem(todoItemRequest);

        try {
            createTodoItem = todoItemService.createTodo(createTodoItem);
        } catch (final Exception e) {
            errors = e.getMessage();
        }

        return TodoItemAdapter.todoItemResponse(createTodoItem, errors);
    }

    //todo ํ•˜๋‚˜๋ฅผ ์ˆ˜์ •ํ•˜๊ณ , ์ˆ˜์ •ํ•œ todo or errors ๋ฅผ ์‘๋‹ตํ•œ๋‹ค.
    @RequestMapping(method = RequestMethod.PUT, value = "/{id}")
    public @ResponseBody TodoItemResponse updateTodo(@PathVariable(value = "id") final Long id, @RequestBody final TodoItemRequest todoItemRequest) {
        String errors = DEFAULT_ERR_MSG;
        TodoItem updateTodoItem = TodoItemAdapter.todoItem(todoItemRequest);

        try {
            updateTodoItem = todoItemService.updateTodo(id, updateTodoItem);
        } catch (final Exception e) {
            errors = e.getMessage();
        }

        return TodoItemAdapter.todoItemResponse(updateTodoItem, errors);
    }

    //id์— ํ•ด๋‹นํ•˜๋Š” todo ๋ฅผ ์‚ญ์ œํ•˜๊ณ  null or errors ๋ฅผ ์‘๋‹ตํ•œ๋‹ค.
    @RequestMapping(method = RequestMethod.DELETE, value = "/{id}")
    public @ResponseBody TodoItemResponse deleteTodoById(@PathVariable(value = "id") Long id) {
        String errors = DEFAULT_ERR_MSG;

        try {
            todoItemService.deleteTodoById(id);
        } catch (final Exception e) {
            errors = e.getMessage();
        }

        return TodoItemAdapter.todoItemResponse(null, errors);
    }
}

 

๋ฐ˜์‘ํ˜•