[Spring Framework] 10강 - RESTful API

seb Incode·2022년 4월 18일
1

Spring Framework

목록 보기
10/22
post-thumbnail

학습 내용

  • RESTful API 웹 서비스
  • JSON 데이터 포맷

학습 목표

  • RESTful 서비스에 대한 이해와 설계 방식을 학습한다.
  • 웹 서비스의 데이터 교환의 사실상 표준인 JSON에 대해 알아보고 서비스 구현 시 활용한다.

RESTful 웹 서비스 개요

Open API(Application Programming Interface)이란?

Open API는 말 그대로 개방형 API이다.
API가 응용 프로그램을 개발할 때 사용하는 인터페이스라는 의미이므로, Open API는 프로그래밍에서 사용할 수 있는 개방되어 있는 상태의 인터페이스를 말한다.

  • Daum, Naver 등의 포털 사이트나 통계청, 기상청 등과 같은 관공서에서도 가지고 있는 데이터를 외부 응용 프로그램에서 사용할 수 있도록 Open API를 제공하고 있다.
  • Open API와 함께 자주 거론되는 기술이 REST이며, 대부분 Open API는 REST 방식으로 지원되고 있다.

RESTful(REpresentational Safe Transferful)란?

HTTP URI+HTTP Method
HTTP URI를 통해 제어할 자원(Resource)을 명시하고, HTTP Method(GET, POST, PUT, DELETE)를 통해 해당 자원(Resource)을 제어하는 명령을 내리는 방식의 아키텍처

  • HTTP 프로토콜에 정의된 4개의 메서드들이 자원(Resource)에 대한 CRUD Operation을 정의

페이지에 요청을 보낼 때, HTTP URI를 통해 자원을 명시하고, HTTP Method를 통해 특정 명령을 내리는 방식을 RESTful이라고 합니다.
위의 표는 각 Method의 역할이 명시되어 있습니다.
일반적으로 4가지 Method가 각 CRUD에 매핑되어 사용하고 있습니다.
이렇게 구현하면 우리는 "RESTful하게 만들었다" 라고 말할 수 있습니다.

RESTful API란?

RESTful API는 HTTP와 URI 기반으로 자원에 접근할 수 있도록 제공하는 애플리케이션 개발 인터페이스(REST의 원리를 따르는 시스템은 RESTful이란 용어로 지칭)

  • 기존의 웹 접근 방식과 RESTful API 방식과의 차이점
  • 기존의 게시판은 GET과 POST만으로 자원에 대한 CRUD를 처리하며, URI는 액션을 나타낸다.
  • RESTful 게시판은 4가지 메서드를 모두 사용하여 CRUD를 처리하며, URI는 제어하려는 자원을 나타낸다.

메소드가 4가지나 있기 때문에, URL이 더 간단해집니다.
RESTful API를 안쓴 경우에는 URL에 행위(명령)가 써져 있습니다. regist, remove, modify 이런식으로..
이게 그닥 좋은 게 아니라는 거죠.. 그런데 RESTful API를 쓴 경우는 URL에 행위가 안써져 있고 단순히 특정 데이터 명시가 필요할 경우만 데이터를 명시하고 끝이 납니다.

JSON과 XML

RESTful 웹서비스와 JSON/XML

서버와 데이터를 주고받을 때, JSON이나 XML 형식으로 주고받습니다.
그 중에서도 JSON이 더 많이 사용됩니다.

JSON(Javascript Object Notation)

  • JSON이란?
    - http://www.json.org
    • JSON은 경량의 DATA-교환 방식
    • Javascript에서 객체를 만들 때 사용하는 표현식을 의미
    • JSON 표현식은 사람과 기계 모두 이해하기 쉬우며 용량이 작아서, 최근에는 JSON이 XML을 대체해서 데이터 전송 등에 많이 사용
    • 특정 언어에 종속되지 않으며, 대부분의 프로그래밍 언어에서 JSON 포맷의 데이터를 핸들링 할 수 있는 라이브러리를 제공

JSON는 데이터 표현식입니다.

JSON의 형식

  • key-value 형식의 쌍(pair)
  • 여러 가지 언어들에서 object, 해쉬맵, struct, dictionary로 실현


  • 예시
{
  "firstName":"Stieve",
  "lastName":"Jobs",
  "email":"jobs@newInstance.com",
  "hobby":["puzzles", "swimming"]
}```

배열도 가능합니다. Java경우 ArrayList나 해시와도 잘 호환이 됩니다.

JSON 라이브러리 - Jackson

  • http://jackson.codehaus.org
  • high-Performance JSON Processor!
  • Jackson은 JSON 형태를 Java 객체로, Java 객체를 JSON 형태로 변환해주는 Java용 JSON 라이브러리
  • 가장 많이 사용하는 JSON 라이브러리

Java에서 Jackson 라이브러리 의존성을 추가하면, 별다른 작업 없이 JSON 데이터를 Java 객체로 자동으로 변환시켜줍니다. 반대도 마찬가지로 자동이구요.
웹으로부터 JSON 데이터를 받으면, Java쪽에서 Java 객체로 데이터를 받고, 데이터베이스에 저장까지 하는 것입니다.

Spring MVC 기반 RESTful 웹서비스 구현 절차

  1. RESTful 웹서비스를 처리할 RestfulController 클래스 작성 및 Spring Bean으로 등록
  2. 요청을 처리할 메서드에 @ReqeustMapping @RequestBody와 @ResponseBody 어노테이션 선언
  3. REST Client Tool(Postman)을 사용하여 각각의 메서드 테스트
  4. Ajax 통신을 하여 RESTful 웹서비스를 호출하는 HTML 페이지 작성
  1. 작성 시, RestControll이라는 별도의 어노테이션을 사용합니다.
  2. @ResponseBody 어노테이션은 JSON 파일만 리턴할 때 사용합니다. 리턴할 때 객체나, 데이터를 리턴하면, 자동으로 JSON으로 변환되어 보내줍니다.
  3. 테스트는 Postman으로 합니다.
  4. 필요한 HTML 페이지도 만듭니다.

RESTful API 설계 사례

사용자 관리 RESTful 웹서비스 URI와 Method

주요 Annotation

RESTful Controller를 위한 핵심 어노테이션

  • Spring MVC에서는 클라이언트에서 전송한 XML이나 JSON 데이터를 Controller에서 Java객체로 변환해서 받을 수 있는 기능(수신)을 제공하고 있음
  • Java 객체를 XML이나 JSON으로 변환해서 전송할 수 있는 기능(송신)을 제공하고 있음

실습

RESTful 기반 service 객체를 개발하고 어노테이션을 활용해보겠습니다.

1. 글 검색 기능

게시판의 글 검색 기능을 구현하겠습니다.

↑ 특정 글을 보는 기능이므로 GET 방식(@GetMapping)에, 글 번호를 파라미터로 받습니다.
↑ 함수 내용은 service객체를 호출해서 글 데이터를 반환받습니다.
↑ 반환받은 글 객체를 리턴하면 @ResponseBody에 의해서 자동으로 JSON 변환해줍니다.

↑ Controller에서 호출했던 viewArticleDetail()를 정의했습니다.
↑ DAO객체를 통해 글 데이터를 받고 이를 리턴합니다.

↑ 실제로는 DB 연동을 통해 글 데이터를 받아와야하지만 연동이 안되어 있기 때문에 임의로 Artcicle 객체를 하나 생성하고 이를 리턴합니다.

↑ 코드를 완성했다면 pom.xml에 jackson 라이브러리를 추가합니다.

↑ 왼쪽 디렉토리를 보면 jackson 라이브러리가 로컬에 추가된 것을 확인할 수 있습니다.

↑ Postman를 통해 테스트합니다. GET방식으로, URl에 글 번호 추가해서 테스팅 합니다.

↑ JSON파일을 응답받았습니다.

↑ Header를 보시면 Content-Type에 JSON이라고 써져 있습니다.
서버에서 JSON를 보내줬다는 의미입니다. 실제로 저희가 viewDetail()에 의해서 Java 객체를 보낸 게 맞구요, jackson 라이브러리가 자동으로 JSON 파일로 변환을 한겁니다.

↑ 크롬에서도 결과를 확인할 수 있습니다.

2. 글쓰기 기능

↑ 쓰기 기능은 POST 방식(@PostMapping)에, JSON으로 데이터를 받으면 객체로 자동 변환 받기 위해 @ReqeustBody를 사용합니다.
↑ 원래대로라면 Service 객체 -> DAO 객체 -> DB 저장까지 이루어져야하지만 스킵하고 그냥 들어온 데이터를 그대로 다시 리턴하는 내용으로 작성했습니다.

↑ Postman을 통해 요청을 보내봅니다.

↑ Controller에서 어떠한 jsp파일이 아닌, 객체를 리턴했기 때문에 결과도 JSON 파일이 출력됩니다.

0개의 댓글