REST는 HTTP와 JSON을 함께 사용하여 Open API를 구현하는 형태로 많이 사용된다.
REST API
REST는 REpresentational State Transfer의 약어로 2000년 로이 필딩(Roy Fielding)의 박사 학위 논문에서 처음 제안된 방법이다. 네트워크상에서 클라이언트와 서버 사이의 통신을 구현하는 방법 중 하나이며, 대부분의 Open API는 REST 아키텍처를 기반으로 만들어져 있다.
클라이언트가 서버로 요청을 보냈을 때 서버가 이에 대한 응답으로 보내주는 Resource의 상태를 Representation이라고 할 수 있으며, 하나의 Resource는 여러 형태의 Representation(예: json, xml, text, rss 등)으로 전달할 수 있는 것을 말한다.
원래 REST의 의미는 서버 응답을 다양한 형태로 전달하는 개념으로 웹, 즉 HTTP의 기본 응답이 HTML인데 이를 JSON 등 다른 규격을 사용하는 것으로 접근한 것이다. 이에 따라 웹을 단순히 브라우저에서 콘텐츠를 이용하는 브라우저 서비스가 아닌 데이터를 주고받기 위한 API 서비스의 형태로 발전시킨 계기가 된다.
이러한 접근의 장점은 안정되고 검증된 웹 기술을 그대로 사용할 수 있다는 점이다. 예를 들어 서버 프로그램으로 자바, 서블릿 등을 사용할 수 있고, 스프링 프레임워크 혹은 IBM, Oracle 등의 서버 솔루션을 그대로 사용할 수도 있어 성능, 안정성, 보안, 백업, 분산 등 여러 인프라의 재활용이 가능하다.
이러한 REST 방식 이전에는 원격으로 데이터를 주고받는 서비스를 구현하기 위해서는 별도의 프로토콜을 가지는 클라이언트-서버 통신 프로그램을 개발해야 했다. 이 과정에서 인증이나 보안, 서버 프로그램의 성능과 안정성과 같은 여러 문제를 개발자에 의존해 해결해야 했다. 이러한 서버 프로그램에 기존 웹 기술을 사용하는 발상은 획기적이었고, 프론트엔드 중심 개발의 발전과 함께 REST 혹은 RESTful API 형태로 정착되게 되었다.
RESTful이란?
일반적으로 REST 원칙을 따르는 시스템을 RESTful이라고 하며 웹 기반으로 구현된 서비스이므로 RESTful 웹 서비스라고도 한다. REST 자체는 특정 언어나 컨테이너를 요구하지 않기 때문에 자바, 서블릿, Node.js, 파이썬 등 다양한 언어와 서버 소프트웨어를 통해 구현할 수 있다.
REST 이전에는 XML 웹 서비스라고 해서 SOAP, WSDL, UDDI 등을 사용하는 규격이 있었으나 지금은 거의 사용하지 않는다.
REST API의 동작 구조
- 클라이언트는 웹, 스마트폰 앱, 자동차, 냉장고 등 모두 가능하다.
- URL/URI를 이용하여 서버에 HTTP 규격(헤더, GET/POST 등)에 따라 요청한다.
- 서버 프로그램은 자바, 서블릿, Node.js, 파이썬 등 모든 언어가 가능하다.
- 처리 결과(응답)는 보통 JSON 규격을 사용한다.
- 웹에서는 응답받은 데이터를 웹의 화면 처리에 사용한다.
- 그 외 데스크톱, 스마트폰, 자동차/냉장고 앱에서는 화면 UI에 필요한 데이터 구성에 사용한다.
이러한 구조를 통해 날씨 정보를 제공하는 REST API 서비스를 활용하면 웹 화면은 물론이고 스마트폰 앱, 냉장고 모니터 등에도 날씨 정보를 보여주는 것이 가능하다.
JAX-RS
JAX-RS란 자바에서 REST API 개발을 위한 서버 프로그램의 표준 규격이다. 현재 자바 웹 개발에서 REST API를 구현하는 방법은 JAX-RS 또는 스프링 프레임워크의 RestController를 사용하는 방법이 있다. 스프링 프레임워크 없이 개발한다면 JAX-RS를 사용해야 하고, 스프링 프레임워크를 사용한다면 두 방법 중 한가지를 선택해서 사용할 수 있다. 호환성을 위해서라면 JAX-RS를 사용하는 것이 좋고 스프링만 사용한다면 스프링의 RestController를 사용하는 것이 편리하다. 세부적인 차이가 있지만 기본 구조나 방법은 유사하다.
@Path("/addrbook")
public class RestApiService {
Logger logger = Logger.getLogger("RestApiService");
AddrBookDAO dao = new AddrBookH2DAO();
@GET
@Path("list")
@Produces(MediaType.APPLICATION_JSON)
public List<AddrBook> getList() {
List<AddrBook> datas = dao.getAll();
logger.info("API call: /list ");
return datas;
}
}
- @Path("/addrbook") : 현재 클래스에서 처리할 URL의 진입점을 의미한다. 예를 들어 전체 경로는 context root/api/addrbook이 된다.
- @GET : 지정된 URL 요청을 GET 방식으로 호출했을 때 동작하도록 한다.
- @Path("list") : 메서드가 실행될 URI를 요청한다. 전체 경로는 context root/api/addrbook/list다.
- @Produces(MediaType.APPLICATION_JSON) : 리턴되는 데이터를 JSON 형식으로 지정한다.
위의 코드와 같이 주로 @로 시작하는 자바 애너테이션을 사용해 클래스와 메서드에 필요한 정보를 제공하는 것만으로 별도의 데이터 변환 과정 없이 손쉽게 API 서버 프로그램 개발이 가능하다. 톰캣을 실행하는 것만으로 서버가 동작하고 기존의 다른 웹 서비스도 함께 운영이 가능하다.
참고로 앞의 코드를 그대로 사용하고 REST API만 스프링 프레임워크를 사용하는 경우 다음과 같이 작성할 수 있다. 기본 코드는 변화 없이 애너테이션만 스프링에서 사용하는 것으로 변경하면 된다.
물론 스프링 프레임워크를 제대로 사용한다면 객체 생성과 참조와 같은 부분을 스프링 빈 객체 선언과 참조 형태로 작성해야 한다.
// 스프링 프레임워크를 사용한 경우
@RestController
@RequestMapping("/addrbook")
public class RestApiService {
Logger logger = Logger.getLogger("RestApiService");
AddrBookDAO dao = new AddrBookH2DAO();
@GETMapping("list")
public List<AddrBook> getList() {
List<AddrBook> datas = dao.getAll();
logger.info("API call: /list ");
return datas;
}
}
'Programming > Web' 카테고리의 다른 글
[Web] 서블릿의 개요 (0) | 2022.10.20 |
---|---|
[Web] 스프링 프레임워크 (0) | 2022.10.20 |
[Web] 서블릿과 JSP (0) | 2022.10.19 |
[Web] 웹 프로그래밍의 기초(JavaScript) (0) | 2022.10.19 |
[Web] 웹 프로그래밍의 기초(CSS) (0) | 2022.10.19 |