게시판 만들기(스프링 부트3, 나도코딩 스터디)/11장. HTTP와 REST 컨트롤러

11.3 REST API 구현하기(게시판 만들기 / 길벗 코딩 자율학습단)

coding232624 2023. 12. 1. 17:46

REST 컨트롤러와 일반 컨트롤러의 차이

  • REST 컨트롤러 => JSON or 텍스트와 같은 데이터 반환
  • 일반 컨트롤러 => 뷰페이지(HTML) 반환

REST API : 기본 설정

  • @RestController 어노테이션 선언
  • @Slf4j 어노테이션 선언(로깅을 위해)
  • @Autowired 어노테이션 선언(의존성 주입)

 

 

REST API: GET 구현하기(조회)

모든 게시글 조회

  • @GetMapping()어노테이션을 통해 URL주소 받기
  • Article 묶을을 반환하기 때문에 List<Article>을 반환 타입으로 하는 메서드 생성
  • 리파지터리.findAll() 메서드를 리턴
@GetMapping("/api/articles")
public List<Article> index(){
    return articleRepository.findAll();
}

 

단일 게시글 조회

  • @GetMapping()어노테이션을 통해 URL주소 받기
  • 단일 Article을 반환하기 때문에 Article을 반환 타입으로 하는 메서드 생성
  • URL의 id값을 매개변수로 받아와 리파지터리.findById(id) 메서드를 리턴
@GetMapping("/api/articles/{id}")
public Article show(@PathVariable Long id){
    return articleRepository.findById(id).orElse(null);
}

 

REST API: POST 구현하기(생성)

  • @PostMapping() 어노테이션을 통해 URL주소 받기
  • Article을 반환 타입으로 하는 메서드 생성
  • DTO를 통해 데이터를 받아와 DTO.toEntity() 메서드를 통해 엔티티로 변환 후 엔티티 변수에 저장 (REST API에서 데이터를 생성할 경우에는 DTO 매개변수 앞에 @RequestBody 어노테이션을 붙여야함)
  • 리파지터리의 .save() 메서드를 통해 DB에 저장하고 반환
@PostMapping("/api/articles")
public Article create(@RequestBody ArticleForm dto){
    Article article = dto.toEntity();
    return articleRepository.save(article);
}

 

REST API: PATCH 구현하기(수정)

데이터 전체를 수정할 경우

  • @PatchMapping() 어노테이션을 통해 URL주소 받기
  • ResponseEntity의 상태를 반환할 것이기 때문에 ResponseEntity<Article>을 반환 타입으로 하는 메서드 생성
  • 수정할 데이터를 찾는 과정에서 필요한 id값과 DTO를 매개변수로 받아옴
  • DTO를 엔티티로 변환하기
  • DB에 저장되어 있는 정보 리파지터리를 통해 가져오기
  • DB에서 가져온 값이 없거나 URL로 받은 id값과 DTO를 통해 받은 수정 데이터의 id값이 다를 경우 오류를 반환
  • 오류가 아닐 경우 엔티티 값을 DB에 저장 후 정상 응답을 반환
@PatchMapping("/api/articles/{id}")
public ResponseEntity<Article> update(@PathVariable Long id,@RequestBody ArticleForm dto){
    //DTO -> 엔티티 변환
    Article article = dto.toEntity();
    log.info("id : {}, article: {}",id,article.toString());
    //타깃 DB에서 조회하기
    Article target = articleRepository.findById(id).orElse(null);
    //잘못된 정보 처리
    if(target == null || article.getId() != id){
        log.info("잘못된 요청! id : {}, article: {}",id,article.toString());
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);
    }
    //업데이트(수정) 및 정상응답하기
    Article updated = articleRepository.save(article);
    return ResponseEntity.status(HttpStatus.OK).body(updated);
}

 

일부 데이터만 수정할 경우

  • 엔티티 코드에 patch 메서드 생성
  • 입력된 값이 있을 경우에만 값을 저장하도록 설정
  • DB에 저장하기 전에 .patch() 메서드를 통해 수정된 내용만 반영하도록 설정
//업데이트(수정) 및 정상응답하기
target.patch(article);
Article updated = articleRepository.save(target);

 

REST API: DELETE 구현하기(삭제)

  • @DeleteMapping()메서드를 통해 URL주소 받기
  • ResponseEntity의 상태를 반환할 것이기 때문에 ResponseEntity<Article>을 반환 타입으로 하는 메서드 생성
  • URL의 id값을 매개변수로 받아와 DB에서 데이터값 가져오기
  • 가져온 데이터값이 null일 경우 오류를 반환
  • 가져온 데이터 값이 비어있지 않을 경우 대상을 삭제하고 정상 응답을 반환
@DeleteMapping("/api/articles/{id}")
public ResponseEntity<Article> delete(@PathVariable Long id){
    Article target = articleRepository.findById(id).orElse(null);
    if (target == null){
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).build();
    }
    articleRepository.delete(target);
    return ResponseEntity.status(HttpStatus.OK).body(null);
}