스터디/back

Part 3) REST API와 JSON | HTTP와 REST 컨트롤러

ㅈㅣ니 2023. 12. 14.
반응형

10장 REST API와 JSON

REST API (Representational State Transfer API)란?

서버의 자원을 클라이언트에 구애받지 않고 사용할 수 있게 하는 설계 방식이다.

HTTP 요청에 대한 응답으로 서버의 자원을 반환하는 것.

(특정 기기에 종속되지 않는 모든 기기에서 통용될 수 있는 데이터 반환)

이때, 응답하는 데이터는 JSON 형식으로 반환된다. (XML은 예전 방식)

 

PUT method 와 PATCH method 의 차이점

PUT PATCH
기존 데이터를 전부 새 내용으로 변경,
만약 기존 데이터가 없다면 새로 생성한다.
기존 데이터 중에서 일부만 새 내용으로 변경한다.

 

실습은 Postman 으로 진행할 것이다.( 책에서는 Talend API Tester 를 썼지만,  나는 Postman으로 진행해보려한다.)

+ https://jsonplaceholder.typicode.com 활용

 

https://www.postman.com/downloads/

 

Download Postman | Get Started for Free

Try Postman for free! Join 30 million developers who rely on Postman, the collaboration platform for API development. Create better APIs—faster.

www.postman.com

 

1. GET 요청하고 응답받기

이렇게 요청을 보낸다.

200번 상태코드가 나오면서 JSON 데이터들이 나오는 것을 확인할 수 있다.

 

위에 404가 뜨는 이유는 게시글이 100번까지 있는데, 101번을 요청해서 404 에러가 발생한 것이다. (not found)

 

HTTP 상태 코드

상태코드 설명
1XX(정보) 요청이 수신되어 처리 중이다.
2XX(성공) 요청이 정상적으로 처리
3XX(리다이렉션 메시지) 요청을 완료하려면 추가 행동 필요함
4XX(클라이언트 요청 오류) 클라이언트의 요청이 잘못돼 서버가 요청을 수행할 수 없음
5XX(서버 응답 오류) 서버 내부에 에러가 발생해 클라이언트 요청에 대해 적절히 수행하지 못함

 

HTTP 메시지

시작라인(start line)  HTTP 요청 또는 응답 내용이 있다. 시작 라인은 항상 한 줄로 끝난다.
헤더(header) HTTP 전송에 필요한 부가 정보(metadata)가 있다.
빈 라인(blank line) 헤더의 끝을 알리는 빈 줄로 , 헤더가 모두 전송되었음을 알린다.
본문(body) 실제 전송하는 데이터가 있다.

 

HTTP 응답 메시지

위의 사진은 헤더이다.

 

2. POST 요청하고 응답받기

url을 수정하고, 데이터를 입력한 후 send 버튼을 클릭한다.

응답으로 201이 뜨면서 body에 데이터가 잘 반환되는 것을 확인할 수 있다.

참고로 key 부분에 " " 큰따옴표를 지우고 send를 보냈더니 500번 내부 서버 에러가 발생한 것을 확인할 수 있다.

 

3. PATCH 요청하고 응답받기

데이터 수정 요청을 해보겠다. 여기서는 PUT과 PATCH 중에서 PATCH를 사용하기로 했다.

1번 게시글을 수정할 것이므로 URL은 다음과 같이 작성한다.

https://jsonplaceholder.typicode.com/posts/1 

 

4. DELETE 요청하고 응답받기

10번 게시글을 삭제하겠다.

상태코드 200이 떴으므로 성공했다.

body 부분의 중괄호도 비어있는 걸 확인할 수 있다.

 

1분 퀴즈)

1. 다음 ㉠~㉤에 들어갈 HTTP 응답 코드 번호대를 골라 쓰세요.

• (  ㉠  ): 클라이언트의 요청이 잘못돼 서버가 요청을 수행할 수 없다.

• (  ㉡  ): 요청이 정상적으로 처리됐다.

• (  ㉢  ): 서버 내부에 에러가 발생해 클라이언트의 요청에 대한 적절한 수행을 하는 데 실패했다.

• (  ㉣  ): 요청을 완료하려면 추가 행동이 필요하다.

• (  ㉤  ): 요청이 수신돼 처리 중이다.

 

ㄱ: 4xx

ㄴ: 2xx

ㄷ: 5xx

ㄹ: 3xx

ㅁ: 1xx

 

셀프 체크

id가 10번인 사용자의 오늘 할일을 생성, 조회, 수정, 삭제하는 HTTP 요청 메시지 작성하기.

1. 오늘 할 일 생성: 10번 사용자의 오늘 할 일을 생성하되, title은 “맛집 탐방하기”로 설정하세요.

2. 오늘 할 일 조회: 10번 사용자의 오늘 할 일 전체를 조회하세요.

GET으로 조회했는데, 위에 새로 입력한 게시글 id는 201번으로 들어갔는데, 200까지만 조회가 된다... 왜지...?????

 

3. 오늘 할 일 수정: 10번 사용자의 오늘 할 일 중 id 200번의 title을 “멋지게 숨쉬기”로 수정하세요.

 

4. 오늘 할 일 삭제: 10번 사용자의 오늘 할 일 중 id 200번 데이터를 삭제하세요.

 


 

11장 HTTP와 REST 컨트롤러

REST API의 의미

REST : HTTP URL로 서버의 자원을 명시하고, HTTP 메서드로 해당 자원에 대해 CRUD하는 것을 말한다.

API : 클라이언트가 서버의 자원을 요청할 수 있도록 서버에서 제공하는 인터페이스이다.

 

REST API를 구현하려면 URL을 설계해야 한다.

2부에서 만든 게시판의 Article 데이터를 CRUD하기 위해 REST API 주소를 다음과 같이 설계함.

 

조회 /api/articles/ 또는 /api/articles/{id}
생성 /api/articles
수정 /api/articles/{id}
-> PATCH 메서드로 특정 Article의 내용을 수정.
삭제 /api/articles/{id}

 

REST API 구현하기

com.example.firstproject.api 패키지를 생성해준다.

REST 컨트롤러를 생성해줬다.

 

결과

postman에서도 GET으로 확인해보면 잘 나오는 것을 확인할 수 있다.

 

1. REST API : GET 구현하기

1-1 ) 모든 게시글 조회하기

[ ArticleApiController.java]

클래스 내부에 ArticleRepository를 선언 후 index() 메서드를 List 타입으로 정의하고, 

return 문에서는 findAll()메서드를 이용하여 DB에 저장된 Article을 반환한다.

GET 요청을 보내면 데이터 3개가 반환되는 것을 확인할 수 있다.

 

1-2 ) 단일 게시글 조회하기

 

index()메서드 밑에 show()메서드를 작성해줬다. 

url은  /api/articles/id번호

 

2. POST 구현하기

[ ArticleApiController.java ]

// POST
@PostMapping("/api/articles")
public Article create(ArticleForm dto) { //create() 메서드 정의 수정할 데이터 dto 매개변수로 받아옴
Article article = dto.toEntity(); // dto Entity로 변환해서 article에 담음
return articleRepository.save(article);
}

 

처음에는 JSON형식으로 입력하기 귀찮아서, Query Params로 입력했더니 잘 들어갔다.

그리고, JSON형식으로 입력했는데, null이 들어가는 걸 확인하였다.........

조회했더니 url 에 parameter값을 입력한 건 잘 들어갔는데, JSON형식은 다 null로 들어감 ㅠ

이렇게 되는 원인은 컨트롤러의 메서드에서 매개변수로 dto를 받아 오기만 해서 그런것이었다.

dto 매개변수 앞에 @RequestBody라는 어노테이션을 추가해야 JSON 데이터를 받아올 수 있었던 거임....

// POST
@PostMapping("/api/articles")
public Article create(@RequestBody ArticleForm dto) { //create() 메서드 정의 수정할 데이터 dto 매개변수로 받아옴
Article article = dto.toEntity(); // dto Entity로 변환해서 article에 담음
return articleRepository.save(article);
}

->이렇게 수정...

 

잘 입력되는 걸 확인

3. PATCH 구현하기

3-1 ) 전체 데이터를 수정할 경우

id가 1번인 게시글을 수정할려면

/api/articles/1 주소로 요청...

 

[ ArticleApiController.java ]

// PATCH
@PatchMapping("/api/articles/{id}")
public ResponseEntity<Article> update(@PathVariable Long id, @RequestBody ArticleForm dto) {
// 1. DTO -> 엔티티 변환하기
Article article = dto.toEntity(); //dto를 엔터티로 변환
log.info("id: {}, article: {}", id, article.toString()); // 로그
// 2. 타깃 조회하기
Article target = articleRepository.findById(id).orElse(null);
// 3. 잘못된 요청 처리하기
if (target == null || id != article.getId()) {
// 400번 에러 발생
log.info("잘못된 요청! id: {}, article: {}", id, article, toString());

return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null); // ResponseEntity 반환
}

// 4. 업데이트 및 정상 응답하기(200)
Article updated = articleRepository.save(article); // article 엔터티 DB 저장
return ResponseEntity.status(HttpStatus.OK).body(updated);
}

 

url 을 보면 id 가 1 이어야 하는데, id : 3을 입력해서 400번 에러가 발생했다.

로그 찍힌 걸 확인하면 확인할 수 있다.

제대로 입력하면 잘 업데이트 된 것을 확인할 수 있다.

 

3-2 ) 일부 데이터만 수정할 경우

 

이번에는 데이터의 일부인 content부분만 수정해보겠다.

에러 없이 수정은 잘 되었지만, title 부분에 null이 들어갔다...

 

아래는 이것을 보완하는 코드이다.

 

[ Article.java ] 에 patch() 메서드 추가

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

 

[ ArticleApiController.java ] 수정

// 4. 업데이트 및 정상 응답하기(200)
target.patch(article);
Article updated = articleRepository.save(target);      // article 엔터티 DB 저장
return ResponseEntity.status(HttpStatus.OK).body(updated);

이제는 null 이 안들어간다..

 

4. DELETE 구현하기

delete url은 /api/articles/{id} 이렇게 지정될 예정..

삭제된 걸 확인할 수 있다.

 

1분 퀴즈 )

1. ㉠~㉤에 각각 들어갈 용어를 찾아 쓰세요.

• (  ㉠  ): REST API 구현을 위한 컨트롤러에 사용하는 어노테이션

• (  ㉡  ): HTTP 요청 중 PATCH 메서드를 처리하는 어노테이션

• (  ㉢  ): HTTP 요청 중 DELETE 메서드를 처리하는 어노테이션

• (  ㉣  ): REST API 요청을 받아 응답할 때 HTTP 상태 코드, 헤더, 본문을 실어 보내는 클래스

• (  ㉤  ): HTTP 상태 코드를 관리하는 클래스

 

정답 ) 

ㄱ: @RestController

ㄴ: @PatchMapping

ㄷ: @DeleteMapping

ㄹ: ResponseEntity

ㅁ: HttpStatus

반응형

'스터디 > back' 카테고리의 다른 글

15장 ~ 16장  (0) 2024.01.04
12장 ~ 14장  (0) 2023.12.21
Part 2) 게시판 만들기 (3) - 리다이렉트 / update / delete / SQL 쿼리  (1) 2023.12.07
Part 2) 게시판 만들기(2)  (1) 2023.11.23
Part 2) 게시판 만들기(1)  (0) 2023.11.21