mini Project

손정훈·2023년 4월 11일

Todo App

https://github.com/sjh4172/Todo

기능 요구 사항

  • Create: 할 일 목록을 등록할 수 있어야 합니다.
  • Read: 등록된 전체 할 일 목록을 조회할 수 있어야 합니다.
    등록되어 있는 할 일의 특정 id를 입력하여 조회할 수 있어야 합니다.
  • Update: 이미 한 일에는 완료 표시를 할 수 있어야 합니다.
    할 일의 내용을 수정할 수 있어야 합니다.
  • Delete: 등록된 전체 할 일을 삭제할 수 있어야 합니다.
    등록되어 있는 할 일의 특정 id를 입력하여 삭제할 수 있어야 합니다.

API 명세서

MethodEndPointRequestResponse
POSThttp://localhost:8080/{ “title” : “운동하기”,
“todoOrder” : 1,
“completed” : false
}
{
"id": 1,
"title": "운동하기",
"todoOrder": 1,
"completed": false,
}
GEThttp://localhost:8080/[
{
"id": 1,
"title": "운동하기",
"todoOrder": 1,
"completed": false,
},
{
"id": 2,
"title": "공부하기",
"todoOrder": 2,
"completed": false,
}
]
GEThttp://localhost:8080/{id}{
"id": 1,
"title": "운동하기",
"todoOrder": 1,
"completed": false,
}
PATCHhttp://localhost:8080/{id}{
“title” : “운동하기”,
“todoOrder” : 1,
“completed” : true
}
{
"id": 1,
"title": "운동하기",
"todoOrder": 1,
"completed": false,
}
DELETEhttp://localhost:8080/
DELETEhttp://localhost:8080/{id}

구현

controller

@RestController
@Validated
@RequestMapping("/todo")
public class TodoController {
	private final TodoService todoService;
	private final TodoMapper mapper;

	public TodoController(TodoService todoService, TodoMapper mapper) {
		this.todoService = todoService;
		this.mapper = mapper;
	}

	@PostMapping
	public ResponseEntity postTodo (@RequestBody TodoDto.Post requestBody) {
		Todo todo = mapper.todoPostDtoToTodo(requestBody);

		Todo response = todoService.createTodo(todo);

		return new ResponseEntity(mapper.todoToTodoResponseDto(response), HttpStatus.CREATED);
	}

	@PatchMapping("/{id}")
	public ResponseEntity patchTodo(@PathVariable("id") long id,
																	@Valid @RequestBody TodoDto.Patch requestBody) {
		requestBody.setTodoId(id);

		Todo todo = mapper.todoPatchDtoToTodo(requestBody);

		Todo response = todoService.updateTodo(todo);

		return new ResponseEntity(mapper.todoToTodoResponseDto(response), HttpStatus.OK);
	}

	@GetMapping("/{id}")
	public ResponseEntity getTodo(@PathVariable("id") long id){
		Todo response = todoService.findTodo(id);

		return new ResponseEntity(mapper.todoToTodoResponseDto(response), HttpStatus.OK);
	}

	@GetMapping
	public ResponseEntity getTodos() {
		return new ResponseEntity(todoService.findAll(), HttpStatus.OK);
	}
	@DeleteMapping("/{id}")
	public ResponseEntity deleteTodo(@PathVariable("id") long id) {
		todoService.deleteTodo(id);

		return new ResponseEntity(HttpStatus.NO_CONTENT);
	}

	@DeleteMapping
	public void deleteTodos() {

	}

}

service

@Service
public class TodoService {
	private final TodoRepository todoRepository;

	public TodoService(TodoRepository todoRepository) {
		this.todoRepository = todoRepository;
	}

	public Todo createTodo(Todo todo) {
		return todoRepository.save(todo);
	};

	public Todo updateTodo(Todo todo) {
		Todo findTodo = findTodo(todo.getTodoId());

		findTodo.setTitle(todo.getTitle());
		findTodo.setTodoOrder(todo.getTodoOrder());
		findTodo.setCompleted(todo.isCompleted());

		return todoRepository.save(findTodo);
	}
	public Todo findTodo(long todoId) {
		Todo todo = todoRepository.findById(todoId)
						.orElseThrow(() -> new BusinessLogicException(ExceptionCode.TODO_NOT_FOUND));
		return todo;
	}

	public List<Todo> findAll() {
		return todoRepository.findAll();
	}

	public void deleteTodo(long todoId) {
		Todo todo = todoRepository.findById(todoId)
						.orElseThrow(() -> new BusinessLogicException(ExceptionCode.TODO_NOT_FOUND));
		todoRepository.delete(todo);
	}

	public void deleteTodos() {

	}
}

entity

@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Todo {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private long todoId;
	@Column
	private String title;
	@Column
	private int todoOrder;
	@Column
	private boolean completed;
}

dto

public class TodoDto {
	@Getter
	@NoArgsConstructor
	public static class Post{
		@NotBlank
		private String title;
		@NotBlank
		private int todoOrder;
		@NotBlank
		private boolean completed;
	}

	@Getter
	@Setter
	@NoArgsConstructor
	public static class Patch{
		private long todoId;
		private String title;
		private int todoOrder;
		private	boolean completed;
	}

	@Getter
	@Setter
	@NoArgsConstructor
	public static class Get {
		private long todoId;
		private String title;
		private int todoOrder;
		private	boolean completed;
	}

	@Getter
	@Setter
	@NoArgsConstructor
	@AllArgsConstructor
	public static class TodoResponse {
		private long todoId;
		private String title;
		private int todoOrder;
		private	boolean completed;
	}
}

repository

public interface TodoRepository extends JpaRepository<Todo, Long>{
}

테스트

post

get/{id}

get

patch

sql

0개의 댓글