본문 바로가기
Spring Boot/Spring Boot 입문 홍팍

[Spring boot] (19) Rest Controller와 HTTP

by 몰라닉네임 2023. 8. 9.

Mission 
기존 Article 데이터를 CRUD 하기 위한 Rest API를 구현하시오 

-Article 데이터를 Rest API를 만들 것이다. 


-Rest API 주소 설계
GET /api/articles 조회
GET /api/articles/{id}
POST /api/articles 생성 
PATCH /api/articles/{id} 수정
DELETE /api/articles/{id} 삭제

-Rest Controller
주소 설계가 끝나면 요청을 받아 JSON으로 반환해줄 Controller 만들어야 한다.

 

-일반 컨트롤러와의 차이
반환하는 타입이 다르다, @Controller는 view template page를 반환하는 반면, @RestController는 일반적으로 데이터를 (보통 JSON을) 반환한다 .


-Response Entity
적절한 상태코드 반환을 위한 Response Entity 클래스도 활용할 것이다. 


  • -Article 데이터를 Rest API를 만들 것이다. 

-헬로 Rest API
1. @RestController //Rest API용 컨트롤러  ,JSON을 반환 
2. localhost:8080/api/hello 이렇게 요청을 보냈을 때, 헬로월드 출력하기
@RestController //Rest API용 컨트롤러  ,JSON을 반환
public class FirstApiController {

    @GetMapping("/api/hello")
    public String hello() {
        return "hello world";
    }
}

 

3.Talend API 확인하기
https -> http 로 바꿔주고
http://localhost:8080/api/hello
send 하면 response 200 확인 가능하다.


GET (SELECT)

 

  • GET

    @RestController //일반적으로 데이터를 (보통 JSON을) 반환한다 .
    public class ArticleApiController {
        @Autowired //DI dependency injection(외부에서 가져온다.), Spring boot에서 땡겨와야한다.


        private ArticleRepository articleRepository;
        //GET
        @GetMapping("/api/articles")
        public List<Article> index() { //article의 list를 반환!
            return articleRepository.findAll();
        }

 

  •  데이터 조회 결과

  • Response 200 ,BODY에 JSON 데이터가 온 걸 확인할 수 있다.

 


 

  • GET 단일 article
        @GetMapping("/api/articles/{id}")
        public Article index(@PathVariable Long id) { //list를 반환하는게 아니라 단일 article 반환하기 때문에 반환타입을 Article로 선언 !
            //URL 요청을 통해서 Long id 값을 가져올 때는 @PathVariable 사용
            return articleRepository.findById(id).orElse(null);
        }

 

  • 단일 데이터 조회 결과 

  • Response 200 ,BODY에 JSON 데이터가 온 걸 확인할 수 있다.

 


POST (CREATE)

 

  • json 데이터를 받지 못한다. 

왜 json 데이터가 (null)없느냐?
rest APi에서 Json으로 던질 때에는 @RequestBody어노테이션을 추가해줘야한다.
@RequestBody  //JSON 데이터 받기

 

 

  • POST (CREATE)

@PostMapping("/api/articles")
    public Article create(@RequestBody ArticleForm dto) {
        //dto를 entitiy로 변환
        Article article = dto.toEntity();
        return articleRepository.save(article);
    }

 

 

  • JSON 데이터를 잘 받아온 것을 확인할 수 있다. 

  • DB 도 확인


PATCH(Update)

  • PATHCH (Update)

ResponseEntity<Article> 로 담아서 보내주면 상태코드를 같이 보내줄 수 있다. 
ResponseEntity 에 Article 데이터가 담겨서 JSON으로 반환된다 .

 

1: 수정용 엔티티 생성 (dto를 entitiy로 변환)
2: 대상 엔테티를 조회

3: 잘못된 요청 처리(대상이 없거나 (id 3 까지있는 id 100을 찾는 경우), id가 다른 경우)

4: 업데이트 및 정상 응답(200)

 

  • /api/ArticleApiController 에서

@PatchMapping("/api/articles/{id}")
    public ResponseEntity<Article> update(@PathVariable Long id,
                                          @RequestBody ArticleForm dto) {
        //1: 수정용 엔티티 생성 (dto를 entitiy로 변환)
        Article article = dto.toEntity();
        log.info("id: {}, article: {}", id, article.toString());

        //2: 대상 엔테티를 조회
        Article target= articleRepository.findById(id).orElse(null);

        //3: 잘못된 요청 처리(대상이 없거나, id가 다른 경우)
        if (target ==null || id != article.getId()) {
            //400, 잘못된 요청 응답!
            log.info("잘못된 요청! id: {}, article: {}", id, article.toString());
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);
        }

        //4: 업데이트 및 정상 응답(200)
        target.patch(article);
        Article updated = articleRepository.save(target);
        return ResponseEntity.status(HttpStatus.OK).body(updated);

    }

 

  • /entity/Article 에서

public class Article {
    ...
    public void patch(Article article) {
        if (article.title != null)
            this.title = article.title;
        if (article.content != null)
            this.content = article.content;
    }

 

 


DELETE

 

  • delete

1.대상 찾기

2. 잘못된 요청 처리 (지울 데이터가 null이면)

3. 대상 삭제

 

@DeleteMapping("/api/articles/{id}")
    public ResponseEntity<Article> delete(@PathVariable long id) {
        //1. 대상 찾기
        Article target = articleRepository.findById(id).orElse(null);

        //2. 잘못된 요청 처리
        if (target == null) {
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);
        }

        //3. 대상 삭제
        articleRepository.delete(target);
        return ResponseEntity.status(HttpStatus.OK).build();
    }

}

 


-요약
상태코드를 반환할 때 
요청이 잘못됐다. 
ResponseEntity를 통해서 보내는데
정상적으로 처리되어 데이터를 실어 보낼 때에는 body에 실어 보낸다.
return ResponseEntity.status(HttpStatus.OK).body(updated);

 

내용참고

https://www.youtube.com/channel/UCpW1MaTjw4X-2Y6MwAVptcQ

 

홍팍

클라우드스터딩 | CloudStudying | 온라인 코딩학습 | 프로그래밍 강의 채널 https://cloudstudying.kr

www.youtube.com