Controller 구현

김태은·2022년 4월 23일
0
  1. controller 패키지 생성
  2. TodoController 클래스 생성

package org.example.controller;

import lombok.AllArgsConstructor;
import org.example.model.TodoEntity;
import org.example.model.TodoRequest;
import org.example.model.TodoResponse;
import org.example.service.TodoService;
import org.springframework.http.ResponseEntity;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.stream.Collectors;

@CrossOrigin
@AllArgsConstructor
@RestController
@RequestMapping("/")
public class TodoController {

    private final TodoService service;

    @PostMapping
    public ResponseEntity<TodoResponse> create(@RequestBody TodoRequest request) {
        System.out.println("CREATE");

        if(ObjectUtils.isEmpty(request.getTitle()))
            return ResponseEntity.badRequest().build();

        if(ObjectUtils.isEmpty(request.getOrder()))
            request.setOrder(0L);

        if(ObjectUtils.isEmpty(request.getCompleted()))
            request.setCompleted(false);

        TodoEntity result = this.service.add(request);
        return ResponseEntity.ok(new TodoResponse(result));
    }

    @GetMapping("{id}")
    public ResponseEntity<TodoResponse> readOne(@PathVariable Long id){
        System.out.println("READ ONE");
        TodoEntity result = this.service.searchById(id);
        return ResponseEntity.ok(new TodoResponse(result));
    }

    @GetMapping
    public ResponseEntity<List<TodoResponse>>  readAll(){
        System.out.println("READ ALL");
        List<TodoEntity> list = this.service.searchAll();
        List<TodoResponse> response = list.stream().map(TodoResponse::new)
                                            .collect(Collectors.toList());
        return ResponseEntity.ok(response);
    }

    @PatchMapping("{id}")
    public ResponseEntity<TodoResponse> update(@PathVariable Long id, @RequestBody TodoRequest request){
        System.out.println("UPDATE");
        TodoEntity result = this.service.updateById(id, request);
        return ResponseEntity.ok(new TodoResponse(result));
    }

    @DeleteMapping("{id}")
    public ResponseEntity<?> deleteOne(@PathVariable Long id){
        System.out.println("DELETE");
        this.service.deleteById(id);
        return ResponseEntity.ok().build();
    }

    @DeleteMapping
    public ResponseEntity<?> deleteAll(){
        System.out.println("DELETE ALL");
        this.service.deleteAll();
        return ResponseEntity.ok().build();
    }
}
  • @CrossOrigin 어노테이션을 붙여주면 기본적으로 '모든 도메인, 모든 요청방식' 에 대해 허용 한다는 뜻이다.
    위 예제에서 어노테이션을 메소드에 붙여줘야하기 때문에 해당 메소드만 모든 도메인, 모든 요청방식에 대해 허용하게 된다.
    다른 메소드는 허용되지않는다.

  • 만약 여러 메소드에 동일하게 적용하고 싶다면 Class 상단에 @CrossOrigin 어노테이션을 선언해주면 된다.

  • 출처 : https://velog.io/@modsiw/Spring-CrossOrigin-Annotation-%EC%A0%95%EB%A6%AC

코드 분석

  1. create
@PostMapping
    public ResponseEntity<TodoResponse> create(@RequestBody TodoRequest request) {
        System.out.println("CREATE");

        if(ObjectUtils.isEmpty(request.getTitle()))
            return ResponseEntity.badRequest().build();

        if(ObjectUtils.isEmpty(request.getOrder()))
            request.setOrder(0L);

        if(ObjectUtils.isEmpty(request.getCompleted()))
            request.setCompleted(false);

        TodoEntity result = this.service.add(request);
        return ResponseEntity.ok(new TodoResponse(result));
    }
  • PostMapping을 사용하여 body에 있는 데이터를 ResponseEntity로 생성한다.
  • 데이터에 제목이 없으면 badRequest 리턴
  • order이나 completed 값 없으면 default값 넣어줌
  • 서비스의 add함수를 활용하여 데이터 생성
  • 생성된 데이터 리턴
  1. readOne
 @GetMapping("{id}")
    public ResponseEntity<TodoResponse> readOne(@PathVariable Long id){
        System.out.println("READ ONE");
        TodoEntity result = this.service.searchById(id);
        return ResponseEntity.ok(new TodoResponse(result));
    }
  • GetMapping을 사용하여 id값을 요청받아, 서비스의 searchById 함수를 활용하여 TodoEntity 데이터를 찾아서 result에 저장
  • 찾은 데이터 리턴
  1. readAll
 @GetMapping
    public ResponseEntity<List<TodoResponse>>  readAll(){
        System.out.println("READ ALL");
        List<TodoEntity> list = this.service.searchAll();
        List<TodoResponse> response = list.stream().map(TodoResponse::new)
                                            .collect(Collectors.toList());
        return ResponseEntity.ok(response);
    }
  • GetMapping 사용
  • 서비스의 searchAll 함수를 활용하여 찾은 TodoEntity 리스트를TodoResponse 객체 리스트로 변환
  • 리스트 리턴
  1. update
@PatchMapping("{id}")
    public ResponseEntity<TodoResponse> update(@PathVariable Long id, @RequestBody TodoRequest request){
        System.out.println("UPDATE");
        TodoEntity result = this.service.updateById(id, request);
        return ResponseEntity.ok(new TodoResponse(result));
    }
  • PatchMapping 사용
    HTTP PATCH 메소드는 데이터 일부를 수정할 때 사용합니다.
    HTTP PUT 메소드와 다른 점은, HTTP PATCH 메소드의 경우 수정하기로 명시한 데이터만 갱신되고 나머지 데이터는 그대로인데 반해 HTTP PUT의 경우 수정하기로 명시되지 않은 나머지 데이터는 모두 "빈 값"이 된다는 것입니다.
  • id와 body데이터를 이용해 업데이트
  • 업데이트한 값 리턴
  1. delete
@DeleteMapping("{id}")
    public ResponseEntity<?> deleteOne(@PathVariable Long id){
        System.out.println("DELETE");
        this.service.deleteById(id);
        return ResponseEntity.ok().build();
    }

@DeleteMapping
    public ResponseEntity<?> deleteAll(){
        System.out.println("DELETE ALL");
        this.service.deleteAll();
        return ResponseEntity.ok().build();
    }
  • DeleteMapping 사용
  • 서비스의 deleteById, deleteAll 함수 활용
  • 성공적으로 완료가 되었다는 200코드를 리턴

0개의 댓글