PROJECT/TASK APP (TO DO LIST)

[TaskApp] 3. Controller 만들기

MoveForward 2024. 2. 16. 05:37

Controller 의 역할 : Service 에 의존관계를 주입 받고 특정 URL 로 오는 요청을 처리 하여 응답을 처리하는 역할을 수행

Service 의 역할 : Controller 에서 받은 요청을 위임받아  핵심 비즈니스 로직을 수행하여 실행하거나 값을 리턴하는 역할을 수행

 

0. HomeController

/*HomeController.java*/

@Controller
@Slf4j //logging
public class HomeController {

    @RequestMapping("/")
    public String home() {
        log.info("home");
        return "home";
    }
}

기본 페이지 : "localhost:8080" url 로 연결되는 기본 페이지 매핑이다.

URL : "localhost:8080" -> home.html  

(기본 페이지를 별도로 매핑하지 않는다면, 기본 설정인 index.html 로 자동 연결된다. )

 

※ "@Slf4j" 는 로그작성을 위한 외부라이브러리 호출 어노테이션 이다.

 

 

1. MemberController

* 회원 가입 ( "localhost:8080/members/new" - "members/createMemberForm.html" )

GetMapping 으로 "회원 가입 페이지" 화면을 띄워준다.

회원 가입 양식인 MemberForm 을 model 에 실어 보낸다.

 

PostMapping 으로 "회원 가입 페이지"를 통해 클라이언트로 부터 입력 받은 form 을 통해,

Member 객체를 생성하여 회원 가입 프로세스를 진행한다.

(입력 받은 값이 문제가 있을 경우를 대비해 예외 처리를 해준다.)

회원 가입이 성공한 후, "localhost:8080" 으로 이동한다.

 

 

* 회원 목록 조회 ( "localhost:8080/members" - "members/memberList.html" )

GetMapping 으로 "회원 목록 페이지" 에 회원 목록을 띄워준다.

1. 전체 회원을 리스트 형태로 조회한다.

2. 조회한 회원 리스트를 DTO 형태로 변환한다.

3. model 에 싣어서 "회원 목록 페이지" 에 띄운다.

 

2. TaskController

/*TaskController.java*/

@Controller
@Slf4j //logging
@RequiredArgsConstructor
public class TaskController {

    private final MemberService memberService;
    private final TaskService taskService;

    /**
     * Task 등록
     */
    //View -> Back-end
    //View 로 부터 입력을 받아옴.
    @GetMapping("/tasks/new")
    public String createForm(Model model) {
        log.info("TaskController : createForm");

        //Back-end -> View : 존재하는 회원 목록 넘기기
        List<Member> members = memberService.findMembers();
        model.addAttribute("members", members);

        //View -> Back-end : 입력한 task 내용 받아오기
        model.addAttribute("taskForm", new TaskForm());
        return "tasks/createTaskForm";
    }

    //SAVE TASK : Task 저장을 위한 Post 요청
    //Back-end -> DB
    @PostMapping("/tasks/new")
    public String create(@Valid TaskForm form, BindingResult result) {

        if (result.hasErrors()) {
            return "tasks/createTaskForm";
        }

        Task task = new Task(form.getTitle(), form.getDesc(), memberService.findOne(form.getMemberId()));

        taskService.registerTask(task);
        return "redirect:/";
    }


    /**
     * Task 조회
     */
    //SHOW TASKS : 전체 TaskList 보여주기
    //DB -> View
    @GetMapping("/tasks")
    public String list(Model model) {

        List<Task> tasks = taskService.findTasks();

        //Task -> TaskDto 변환 후 반환
        List<TaskDto> collect = tasks.stream()
                .map(t -> new TaskDto(t.getId(), t.getTitle(), t.getDesc(), t.getMember().getName(), t.getCreatedDate()))
                .collect(Collectors.toList());

        model.addAttribute("tasks", collect);
        return "tasks/taskList";
    }


    /**
     * Task 수정
     */
    //수정 Task 기존 내용 불러오기
    @GetMapping("/tasks/{taskId}/edit")
    public String updateTaskForm(@PathVariable("taskId") Long taskId, Model model) {
        //수정할 task
        Task findTask = taskService.findOne(taskId);

        TaskForm form = new TaskForm();
        form.setId(findTask.getId());
        form.setTitle(findTask.getTitle());
        form.setDesc(findTask.getDesc());
        form.setMemberId(findTask.getMember().getId());

        model.addAttribute("form", form);

        //Back-end -> View : 존재하는 회원 목록 넘기기
        List<Member> members = memberService.findMembers();
        model.addAttribute("members", members);

        return "tasks/updateTaskForm";
    }

    //수정 Task 수정 내용 저장
    @PostMapping("/tasks/{taskId}/edit")
    public String updateTask(@PathVariable("taskId") Long taskId, @ModelAttribute("form") TaskForm form) {
        taskService.controllerUpdateTask(taskId, form.getTitle(), form.getDesc(), form.getMemberId());
        return "redirect:/tasks";
    }

    /**
     * Task 삭제
     */
    @DeleteMapping("/tasks/{taskId}/delete")
    public String deleteTask(@PathVariable("taskId") Long taskId) {
        taskService.deleteTask(taskId);
        return "redirect:/tasks";
    }
}

 

* Task 등록 / 조회 는 MemberController 와 거의 같기 때문에 생략한다.

 

* Task 수정

수정 대상의 Task 의 id를 매개 변수로 가져온다.

이를 이용해 "Task 수정 페이지" 에 수정 대상 Task의 내용을 미리 입력해 둔다.

"Task 수정 페이지" 를 통해 클라이언트가 수정한 내용을 form 형식으로 받아 수정을 진행한다.

 

 

* Task 삭제

삭제 대상 Task의 id를 매개변수로 가져온다.

이를 통해, 해당 Task를 삭제한다.

 

(삭제를 위한 Delete 요청은 비교적 신규 기능이기 때문에, 별도의 추가 설정이 필요하다.

이는 "[TaskApp] 4. View 만들기" 에서 자세히 설명하겠다.)