본문 바로가기

Project

[LogicList] TodoList 백엔드 기능구현

반응형

기능 설명

  • 등록 후 24시간이 경과된 컨텐츠는 삭제 후 Database에 저장
    • 추후 Todo 테이블과 분리하여 운용필요
  • 최대 5개의 TodoList 전달

TodoResult

에러 핸들링을 위한 TodoResult(Enum Class)생성

package swlee.logiclist.utils;

public enum TodoResult {
    SUCCESS(1, "Todo Upload Success"),
    FAIL(0, "Todo Upload Fail (Exception)"),
    FAIL_NULL(-1, "Todo Upload Fail (Todo is null)"),
    FAIL_EXIST(-2, "Todo Already Exist");

    private int code;
    private String message;

    TodoResult(int code, String message) {
        this.code = code;
        this.message = message;
    }

    public int getCode() {
        return code;
    }

    public String getMessage() {
        return message;
    }
}

ViewController 

  • 작은 기능으로 TodoController를 따로 분리하지않음(할걸..)
    • Service 클래스는 분리 (TodoService)

Controller 맵핑 로직 및 결과 값 Json 객체로 리턴

@ResponseBody
@PostMapping("/todo")
public String todo_post(HttpServletResponse res, @RequestBody @NotNull Todo todo)  {
    log.info("Todo_POst Test{}",todo);
    JsonObject obj =new JsonObject();
    try {
        log.info("todo_date::{}",todo.getDate());
        TodoResult result = todoService.memorySave(todo);
        obj.addProperty("result", result.getCode());
        obj.addProperty("errorMsg",result.getMessage());
        return obj.toString();
    }
    catch (Exception e){
        log.error("Todo Post Error",e);
        obj.addProperty("result", 0);
        obj.addProperty("errorMsg",e.getMessage());
        return obj.toString();
    }

}

 

TodoList 삭제, 완료 버튼에 해당하는 이벤트 수행

@ResponseBody
@PostMapping("/todo_data")
public String todo_complete_todo(@RequestBody @NotNull Todo todo,@RequestParam("param") String param){
    log.info("param:::{}",param);
    try {
        if(param.equals("complete")){
            log.info("complete Todo");
            todoService.upload(todo);
            todoService.remove(todo);
        }
        else if(param.equals("remove")){
            log.info("Delete Todo");
            todoService.remove(todo);
        }
    }
    catch (Exception e){
        log.error("Todo_complete Post Error",e);
        return "failed";
    }
    return "success";
}

 


TodoService

  - memorySave - TodoList Value 중복 값 체크 및 Exception Handlling

/**
 * @param todo
 * @return - 1 : Todo Upload Success
 * - 0 : Todo Upload Fail (Exception)
 * - -1 : Todo Upload Fail (Todo is null)
 * - -2 : Todo Already Exist
 */
public TodoResult memorySave(Todo todo) {
    if (todo == null) {
        return FAIL_NULL;
    }
    if(getTodoByContent(todo.getContent())!=null){
        return FAIL_EXIST;
    }
    try {
        memoryTodoList.add(todo);
    } catch (Exception e) {
        log.error("TodoService.memorySave() error", e);
        return FAIL;
    }
    return SUCCESS;
}

TodoList Value 중복 값 체크

public Todo getTodoByContent(String content) {
    for (Todo todo : memoryTodoList) {
        if (todo.getContent().equals(content)) {
            return todo;
        }
    }
    return null;
}

 

DataBase 저장을 위한 upload 메소드 생성 

  • upload(Todo todo) - 단건저장
  • upload(ArrayList<Todo> todoArrayList) - 다건저장
public void upload(Todo todo) {
    todoRepository.save(todo);
}
//ArrayList Todo upload
public void upload(ArrayList<Todo> todoArrayList) {
    todoRepository.saveAll(todoArrayList);
}

 

getMemoryTodoList() - Memory에 저장되어 있는 TodoList 리턴(최대 5개)

 

memoryFilter() - 24시간 경과 TodoList 제거 및 Database 내 저장

 -> 추후 Todo 테이블과 분리하여 운용 필요

public ArrayList<Todo> getMemoryTodoList() {
    //memoryTodoList 같은 일자 체크
    //memoryTodolist 5개 전달
    ArrayList<Todo> todos = memoryFilter();
    return todos;
}

private ArrayList<Todo> memoryFilter() {
    //new ArrayList
    ArrayList<Todo> removeTodoList = new ArrayList<>();
    for (Todo todo : memoryTodoList) {
        //todo.getData()가 24시간이 지났을경우
        if (todo.getDate().getTime() + 86400000 < System.currentTimeMillis()) { //86400000=24시간
            removeTodoList.add(todo);
        }
    }
    //지우기 전 revmoveTodoList를 DB저장
    upload(removeTodoList);
    //removeTodoList를 memoryTodoList에서 제거
    memoryTodoList.removeAll(removeTodoList);
    return memoryTodoList;
}

 

 


TodoRepository

save(Todo todo) - 단건 저장 관련 쿼리문

saveAll(ArrayList<Todo> todoArrayList) - 다건 저장 관련 쿼리문(batchUpdate사용)

public void save(Todo todo){
    try{
        final String sql = "INSERT INTO todo (content,date) VALUES (?,?)";
        jdbcTemplate.update(sql, todo.getContent(),todo.getDate());
        log.info("Todo Save Success");
    }catch (Exception e){
        log.error("TodoRepository.save() error",e);
    }
    //JDBC Template Save Query
}
//SaveAll batchupdate
public void saveAll(ArrayList<Todo> todoArrayList){
    try{
        final String sql = "INSERT INTO todo (content,date) VALUES (?,?)";
        jdbcTemplate.batchUpdate(sql, todoArrayList, todoArrayList.size(), (ps, todo) -> {
            ps.setString(1, todo.getContent());

            // sql Date로 변환
            ps.setDate(2, new Date(todo.getDate().getTime()));
        });
        log.info("Todo Save Success");
    }catch (Exception e){
        log.error("TodoRepository.save() error",e);
    }
    //JDBC Template Save Query
}

 

개선 필요

  1. 정형화 되지 않은 소스
    1. 실제 TodoResult Enum class는 MemorySave 메소드에서만 사용함(전체적 사용필요)
  2. Controller 분리 필요
    1. TodoController 분리 필요(필요한 사항인가 검토 후 분리진행)
  3. 미완료 TodoList 관련 데이터 분리 필요
    1. 현재는 완료 TodoList 목록과 24시간 경과하여 삭제된 미완료 TodoLIst 목록을 분리하지 않음 

 

게시글에 대한 훈수 환영합니다. (성장에 밑거름이 필요해요.)

-> 과한 훈수 시 스승님이 되실 수 있으니 주의

반응형