spring boot #10

·2022년 4월 29일
0

spring

목록 보기
11/22

IT기술이 발전함에 따라 client가 항상 pc이지 않고 ios, 안드로이드, 스마트워치, cctv 등의 여러 형태의 client가 생긴다.

그렇기 때문에 server가 client에게 데이터를 다목적 마크업 언어인 XML 형태로 보내곤 했다.

최근엔 XML을 대신해 주로 JSON 형태로 데이터를 전송한다.

😉 RestAPI와 JSON

RestAPI는 server가 다양한 형태의 client에게 응답을 보내기 위해 사용한다.

JSON

{
	key:value,
    key:{
    	key:value,
        key:value
    }
    key:[value,value]
}

HTTP 동작 원리

  1. client가 server에 CRUD 요청을 보내면.
    ex) PATCH /post/1 HTTP/1.1

  2. server(RestAPI) 에서 client로 응답을 보낸다.

  3. 응답에 있는 상태 코드(status code)를 통해 응답 전송 상태를 확인할 수 있다.


사진 출처 : https://youtu.be/UjBXb3m1uY0

실습 환경

크롬 확장 프로그램인 Talend API를 설치하여 APT 요청을 보내고 JSON 응답을 받는 실습을 할 수 있다.
JSON Placeholder 사이트에 가면 여러가지 도움을 받을 수 있다.

(https가 아닌 http 서버.)

@RestController

@Controller 는 뷰 템플릿(응답의 body가 html)을 반환하지만 @RestController 는 RestAPI 전용 컨트롤러로 JSON 또는 데이터를 반환한다.

@RestController
public class ArticleApiController

@Autowired
스프링 부트에서 Repository 가져오기 (DI)

@Autowired
private ArticleRepository articleRepository;

@PathVariable
url 요청으로 id값을 가져오기

@PathVariable Long id

@RequestBody
JSON 데이터를 받는 어노테이션.
Request Body에서 이거를 찾아오라는 의미.

@RequestBody ArticleForm dto

잘못된 요청 처리 방법

잘못된 요청이란?..
1. 대상 id가 없는 경우
2. url의 id와 request body의 id가 다른 경우
3. 데이터의 일부만 JSON으로 Patch된 경우(빠진 부분은 원래 값이 사라지고 null이 되어버리는 오류 발생)

1번, 2번 처리 방법
ResponseEntity< > 타입은 데이터에 상태 코드를 함께 담을 수 있다.

return ResponseEntity.status(HttpStatus.OK).body(updated);
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);

3번 처리 방법
Entity/Article.java에 patch 메소드를 만들어준다.

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

👀 GET 조회 메소드

	@GetMapping("/api/articles")
    public List<Article> index(){
        return articleRepository.findAll();
    }
    
	@GetMapping("/api/articles/{id}")
    public Article index(@PathVariable Long id){
        return articleRepository.findById(id).orElse(null);
    }

👀 POST 생성 메소드

	@PostMapping("/api/articles")
    public Article crete(@RequestBody ArticleForm dto){
        Article article = dto.toEntity();
        return articleRepository.save(article);
    }

👀 PATCH 수정 메소드

	@PatchMapping("/api/articles/{id}")
    public ResponseEntity<Article> update(@PathVariable Long id, @RequestBody ArticleForm dto){
        Article article = dto.toEntity();
        Article target = articleRepository.findById(id).orElse(null);

        if(target == null || id != dto.toEntity().getId()){
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);
        }
        target.patch(article);
        Article updated = articleRepository.save(target);
        return ResponseEntity.status(HttpStatus.OK).body(updated);
    }

👀 DELETE 삭제 메소드

	@DeleteMapping("/api/articles/{id}")
    public ResponseEntity<Article> delete(@PathVariable Long id){
        Article article = articleRepository.findById(id).orElse(null);

        if(article ==null){
            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);
        }

        articleRepository.delete(article);

        return ResponseEntity.status(HttpStatus.OK).body(null);
    }

😉 Status Code

  • Successful 200 (Ok) 201 (Created)
  • Client Error 400(Bad Request) 404 (Not Found)
  • Server Error 500 (Internal Server Error)

0개의 댓글

관련 채용 정보