24/12/27(금)
- 완료했는지 안했는지를 먼저 체크 (완료한 걸 확인할 수 있는 변수 필요)
- 할 일을 완료해서 체크했을 때 true로 바뀌는 함수 필요
- URL을 읽어올 때 RequestParam을 받아, url로 판단하기
-> 완료여부는 할 일 목록을 체크하는 거니까 Todo엔티티에 넣어야함
-> 처음 할 일을 입력하면 체크는 비어있으니까 false로 넣어둔다.
@Entity
public class Todo {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String content;
//추가된 부분 - 완료 여부 = false
private Boolean isCompleted = false;
@ManyToOne
private TodoTitle todoTitle;
public Todo() {
}
public Todo(String content, TodoTitle todoTitle) {
this.content = content;
this.todoTitle = todoTitle;
}
public Boolean getCompleted() {
return isCompleted;
}
public Long getId() {
return id;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
할 일 하나에 대해서만 체크를 하니까 controller에서 하나에 대한 함수 먼저 작성
//controller
@PatchMapping("/todos/{todoId}")
public void flip(@PathVariable Long todoId){
todoService.flip(todoId);
}
직접적인 함수구현은 Service에서 / controller는 딱 반환만 하는 역할
@Transactional
public void flip(Long todoId) {
Todo todo = todoRepository.findById(todoId).orElseThrow();
todo.flip();
}
flip이라는 함수는 Repository에 따로 없으니까 만들어줘야한다. 그래서 Todo타입의 todo에 filp함수를 만들어 완료를 했을 때 변화되는 함수를 만들어준다.
//Todo 엔티티
public void flip() {
this.isCompleted = !isCompleted;
}
Todo엔티티에 flip함수를 구현해놓는다.
isCompleted는 기본적으로 false인데 완료처리를 눌렀을 때 flip함수가 호출되어서 true로 바뀔 수 있는 함수이다.
@GetMapping("/todos")
public List<TodoResponse> getComplete(@RequestParam(required = false) Boolean isCompleted) {
return todoService.read(isCompleted);
}
read함수는 기존에 작성되어 있으니 이걸 활용해서 수정해야한다.
Boolean isCompleted)public List<TodoResponse> read(Boolean isCompleted) {
if(isCompleted == null){
return readAll();
}
return readComplete(isCompleted);
}
public List<TodoResponse> readAll() {
List<Todo> todoList = todoRepository.findAll();
return todoList.stream().map(content -> new TodoResponse(content.getContent(), content.getId())).toList();
}
public List<TodoResponse> readComplete(boolean isCompleted) {
//그 중에 완료가 된거를 찾아
List<Todo> byIsCompleted = todoRepository.findByIsCompleted(isCompleted);
return byIsCompleted.stream().map(complete->new TodoResponse(complete.getContent(), complete.getId())).toList();
}
RequestParam은 url에 들어왔는지, 안들어왔는지를 보고 판별을 해준다. 그래서 우리는 들어왔을 때 안들어왔을 때를 구분해줘야한다. read함수가 실행됐다는 건 `/todos`라는 url이 실행이 된거고 거기서 만약에 isCompleted가 null, 즉 아무 값도 들어오지 않았다면 그냥 readAll인 전체 객체를 뽑는 함수로 바꾸고, 안에 무언가가 들어있으면 readComplete함수로 이동한다.
❓쿼리 메서드: DB에서 정보를 찾는 메서드
기본 Repository에서는 사용할 수 있는 메서드가 한계가 있기 때문에 직접 쿼리 메서드를 작성해줘야한다.
해당 코드에서 내가 필요한 것은 iscompleted를 찾고 싶다는 것이다. 따라서 "완료된 항목만 찾고싶어" 라는걸 포함하고 있는 함수(findByIsCompleted)를 넣어준다. (이건 AI써도 된다했음)
public interface TodoRepository extends JpaRepository<Todo, Long>
{
// 특정 완료 상태의 Todo 항목들을 찾는 메서드
List<Todo> findByIsCompleted(Boolean isCompleted);
}
리포지토리에 이렇게 함수를 넣어준다.
이렇게하면 완료된 항목만 따로 빼서 볼 수 있다.

😐 느낀점
쿼리메서드,, 새로운걸 배웠지만 아리까리,,,
repository에는 쿼리메서드만 작성한다. 하지만 사용하지 않는 쿼리메서드는 삭제해주는게 낫다.
if문을 작성해서 requestParam을 구별해주는건 별로 좋은 방법은 아니라하셨다.
연습할땐 작은규모니까 상관없지만, 여튼 많이 사용은 안하는 것같다.