* REST API 개발
- REST API란?
REST(또는 RESTful)
- 네트워크 상에서 클라이언트와 서버 사이의 통신을 구현하는 방법에 대한 아이디어
- 하나의 Resource는 여러 형태의 Representation(json, xml, text, rss 등)으로 전달할 수 있다
- Representation : 클라이언트가 서버로 요청을 보냈을 때 서버가 응답으로 보내주는 Resource(파일, 프로 그램 호출 등)의 상태
REST API의 등장 배경
- 클라이언트-서버 프로그램 구조의 문제점 등장
- 동시 다중 접속에 대한 안정성, 보안, 백업, 장애 대응, 이중화 등 여러 기술적 문제를 자체적으로 해결할 수 있는 역량과 고수준의 개발자와 서버 엔지니어가 필요
- 요청, 응답, 메시지 규격 등 프로토콜을 자체적으로 정의해야 함
- 전용 프로토콜 사용으로 서비스 간 호환이 어려움
- 웹을 사용하는 것으로 상당 부분 해결이 가능
- 검증된 서버 소프트웨어를 통해 안정성, 보안, 백업 등의 모든 솔루션을 갖추고 있음
- HTTP 프로토콜 사용으로 호환성 제공이 가능
- 자바, 서블릿 등 다양한 서버 측 프로그래밍 기술을 그대로 사용할 수 있음
- 그러나 웹은 기본적으로 클라이언트 요청에 대한 응답으로 화면 중심의 HTML을 제공하는 시스템이기 때문에 단순히 데이터를 주고받고자 하는 서비스에는 적합하지 않음
- 이에 따라 확장성이 뛰어나고 경량의 데이터 구조라고 할 수 있는 JSON이 주목을 받기 시작
- JSON(JavaScript Object Notation): 그 자체로 자바스크립트 객체 구조를 가지고 있어 웹 브라우저에서 바로 이해할 수 있고 처리 가능한 구조
- 이와 함께 RESTful 개념이 재조명되어 본격적으로 적용되기 시작해 지금의 프런트 엔드 중심 개발을 이끌게 됨
- REST는 현재 HTTP와 JSON을 함께 사용하여 Open API를 구현하는 형태로 많이 사용
- 대부분의 Open API는 REST 아키텍처를 기반으로 만들어져 있음
- 일반적으로 REST 원칙을 따르는 시스템을 RESTful이라 하며 웹 기반으로 구현된 서비스이므로 RESTful 웹 서비스라고 이야기함
* JAX-RS
- JAX-RS란?
JAX-RS(Java API for RESTful Web Services)의 등장 배경
- REST 서비스를 제공하기 위해서는 여러 HTTP Method(GET, POST, PUT 등)를 지원하면서 다양한 URI 요청을 처리할 수 있는 서버 프로그램 구조가 필요함
- 단순히 서블릿만 이용해도 어느 정도 REST 형태의 서비스를 개발할 수 있지만 여러 URI 요청을 구조적으로 손쉽게 처리하려면 규격이 필요함
- 이에 따라 자바에서는 JAX-RS라고 하는 표준 규격을 만들게 됨
JAX-RS의 개념
- REST 원칙을 사용하는 개발 메커니즘을 제공하는 자바 표준 API
- 서비스 측 REST 애플리케이션 개발을 단순화하는 인터페이스 및 Java 애너테이션의 집합체
- 스프링 프레임워크의 경우
- RestController라고 하는 자체 규격을 제공 / 필요에 따라 JAX-RS를 사용
- JAX-RS를 사용하는 것보다는 스프링의 RestController가 좀 더 편리
- JAX-RS 사용 과정
API 서비스 등록하기
- 제공하려고 하는 API 서비스에 대한 정보를 컨테이너에 전달해야 함
- @Application 애너테이션을 사용 => 어떤 시작 url을 사용할지 지정 / 해당 요청에 대한 구현 클래스의 패키지를 등록
- 모든 REST API 요청이 /api로 시작하도록 지정
=> ) RestConfig 클래스에서 속성으로 저장하는 패키지에 대해서만 REST API 클래스로 사용할 수 있음
API 클래스 구현하기
- API 클래스는 서블릿과 달리 별도의 클래스 상속 없이 일반 자바 클래스로 구현됨
- 클래스 앞부분에 @Path 애너테이션 => 하위 URI 시작점을 지정 (선택 사항) / 각각의 요청에 대한 처리를 담당하는 메서드를 구현
- REST API 클래스 구현에 필요한 구성요소
- 메서드: GET, POST, PUT, DELETE 등 어떤 HTTP 메서드 요청을 처리할 것인지 지정
- 요청 경로: 어떤 URI 요청에 동작할 것인지 지정
- 응답 콘텐트 타입: 어떤 콘텐트 타입(text, html, json, xml 등)으로 응답 메시지를 구성할 것인지 지정
- 파라미터: 클라이언트 요청 파라미터 및 경로 파라미터 값을 메서드에 전달
- REST API를 구성한다 = 어떤 HTTP 메서드로 요청되는 특정 URI에 동작할 메서드를 구현 + 요청 파라미터를 메서드에서 사용해 프로그램을 구현 + 처리 결과를 어떤 형태로 전달할지 정의
- /api/addrbook/list 요청을 처리하는 API 클래스의 예시
REST API 설계 원칙
- 동사 대신 명사 사용
- 예) 전체 상품 목록을 제공하는 API의 경우 getProductList, getAll, getProducts와 같은 동사 형태보다는 products와 같은 명사 형태가 적합
- 상태 변경 시 GET 메서드와 쿼리 파라미터 사용 금지
- 수정, 삭제와 같이 데이터의 상태를 변경하는 경우 파라미터 형태가 아닌 HTTP 메서드 와 경로 파라미터로 처리하는 것이 좋음
- 복수 명사 사용
- 집합형 데이터를 다루는 API의 경우 단수형보다는 복수형을 사용하는 것이 좋음
- 관계 형태 표현에 하위 리소스 사용
- 예) 컴퓨터공학과 학생들 중 홍길동 학생을 찾는 경우
- 에러 정보 제공
- 에러 발생 시 단순히 서버 에러 500만 표시하는 것이 아니라 여러 HTTP 상태 코드를 활용해야 하며, 별도의 에러 정보를 응답 메시지 구조에 포함할 수 있어야 함
* REST 클라이언트
- REST 클라이언트란?
REST 클라이언트란?
- REST API를 사용하는 프로그램
- REST API 자체가 HTTP를 사용하기 때문에 HTTP를 지원하는 모든 프로그램은 REST API 클라이언트가 될 수 있음
- 웹 브라우저도 서버와 HTTP로 통신하기 때문에 웹 브라우저로 REST API를 호출하는 것이 가능
- REST 클라이언트 구현은 언어에 중립적이기 때문에 자바, 자바스크립트, 파이썬, C/C++ 등 거의 모든 언어를 사용할 수 있음
- 다만 HTTP 프로토콜에 따라 통신할 수 있는 일종의 통신 프로그램을 구현해야 하고, 수신되는 JSON 메시지를 프로그램에 적합한 객체로 변환하는 작업 등이 요구됨
별도의 라이브러리 없이 구현하는 경우
- 자바에 기본적으로 포함된 URLConnection 클래스를 사용할 수 있으나 코드가 많아 지고 처리 과정이 복잡해짐
아파치의 HttpClient 라이브러리를 사용해 구현하는 경우
- 비교적 간결하게 코드를 작성할 수 있음
'개발 공부 > Java' 카테고리의 다른 글
[JSP/스프링] - 스프링 프레임워크 (0) | 2024.01.15 |
---|---|
[JSP/스프링] - 리스너와 필터 (0) | 2024.01.12 |
[JSP/스프링] - 데이터베이스와 JDBC (0) | 2024.01.10 |
[JSP/스프링] - MVC 패턴의 이해 (0) | 2024.01.09 |
[JSP/스프링] - JSP 응용 (0) | 2024.01.08 |