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
'Spring Boot > Spring Boot 입문 홍팍' 카테고리의 다른 글
[Spring boot] (21) 테스트 작성하기 (0) | 2023.08.18 |
---|---|
[Spring boot] (20) 서비스 계층과 트랜잭션 (0) | 2023.08.18 |
[Spring boot] (18) Rest API 와 JSON (0) | 2023.08.08 |
[Spring boot] (17) CRUD와 SQL 쿼리 (0) | 2023.08.08 |
[Spring boot] (16) 데이터 삭제하기 (DB까지) (0) | 2023.08.08 |