# 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를 나눈 이유는?