스프링 부트, 입문!

준비중..

스프링 부트, 입문!

기본 게시판 만들기!

13 JSON API, 데이터 가져오기

# JSON API, 데이터 가져오기 ## 미션 --- Article 객체를 JSON API로 얻게 하시오. ![클라우드스터딩-스프링부트-JSON-API-데이터-상세](https://i.imgur.com/QNDeBdf.png) ## 개념 --- #### ⭐️ 진행흐름 ![클라우드스터딩-스프링부트-JSON-API-요청-흐름](https://i.imgur.com/reKRrjV.png) #### ⭐️ JSON API 왜씀? API형식으로 데이터를 받을 때, JSON을 사용한다. 왜 그럴까? 장점이 있기 때문이다. 어떤 장점? 바로 범용성이다. 클라이언트는 사실 수도 없다. 웹기반의 브라우저, 앱 기반의 스마트폰, IoT 등... 수도 없다. 수 많은 클라이언트 별, 맞춤 뷰 페이지를 만드는 것은 어렵다. 이를 해결하는 방법이 역할 분담이다. 서버는 데이터만 전달하고, 클라이언트는 이를 받아 화면에 보여주기로 하는 것이다. 이때 데이터는 JSON으로 나타낸다. ~~잠정적 표준이다.~~ ![클라이언트-스프링부트-JSON-사용-이유](https://i.imgur.com/ggsZqTE.png) #### ⭐️ DTO와 Entity는 굳이 나눠야 할까? 비지니스의 데이터를 담고있는 Entity. 이는 쉽게 변하지 않는다. 그러나 화면에서 보여주는 데이터는 수시로 변한다. 따라서, 이를 구분하여 만드는 것이 더 효율적이다. Entity가 식재료라면, DTO는 어느정도 개별 조리가 된 음식이랄까? 이를 최종적으로 플레이팅 하는 건, 클라이언트의 영역이다. ## 튜토리얼 --- #### ⭐️ API 컨트롤러 1) 메소드 추가: "api/ArticleApiController" ``` @Slf4j @RestController public class ArticleApiController { ... @GetMapping("/api/articles/{id}") public ArticleForm getArticle(@PathVariable Long id) { Article entity = articleRepository.findById(id) // id로 article을 가져옴! .orElseThrow( // 만약에 없다면, () -> new IllegalArgumentException("해당 Article이 없습니다.") // 에러를 던짐! ); // article을 form으로 변경! 궁극적으로는 JSON으로 변경 됨! 왜? RestController 때문! return new ArticleForm(entity); } } ``` #### ⭐️ DTO 2) 생성자 추가: "dto/ArticleForm" ``` @Data public class ArticleForm { private Long id; // id 필드 추가! ... // 생성자: entity 객체를 form으로 변환! public ArticleForm(Article entity) { this.id = entity.getId(); this.title = entity.getTitle(); this.content = entity.getContent(); } } ``` #### ⭐️ 확인하기 3) 브라우저 접속: "localhost:8080/api/articles/1 ![클라우드스터딩-스프링부트-JSON-API-데이터-상세](https://i.imgur.com/QNDeBdf.png) > 꿀팁! Chrome 확장 프로그램 "Awsome JSON" ## 훈련하기 --- - "localhost:8080/api/articles"에 접속하여, 아래와 같이 모든 article의 정보를 JSON으로 가져오게하시오. ![클라우드스터딩-스프링부트-JSON-API-데이터-목록](https://i.imgur.com/L4GaJi4.png) ## 면접 준비 --- - "localhost:8080/articles"에서 목록을 볼 수 있는데, 왜 굳이 JSON API를 만들까? - 엔티티와 DTO를 나눈 이유는?