- API란?
- 잠깐! 저의 오해!!
- REST API란?
- REST API with spring
- 저기요 REST API는 데이터베이스가 아니에요!
API 정의(in 위키백과)
- API(Application Programming Interface 애플리케이션 프로그래밍 인터페이스)
- 컴퓨터나 컴퓨터 프로그램 사이의 연결이다. 일종의 소프트웨어 인터페이스이며 다른 종류의 소프트웨어에 서비스를 제공한다.
- 어떤 서버의 특정한 부분에 접속해서 그 안에 있는 데이터와 서비스를 이용할 수 있게 해주는 소프트웨어 도구
쉽게 알아보자면?
상상해보자 우리는 지금 멋진 레스토랑에 있다. 점원이 가져다준 메뉴판을 보면서 먹음직스러운 스테이크를 고르면, 점원이 주문을 받아 요리사에 요청을 할 것이다. 그러면 요리사는 스테이크를 만들어 점원에게 주고, 여러분은 점원이 가져다준 맛있는 음식을 먹을 수 있게 된다.
- 여기서 점원의 역할에 집중해보자. 점원은 손님에게 메뉴를 알려주고, 주방에 주문받은 요리를 요청한다. 그다음 주방에서 완성된 요리를 손님께 다시 전달한다. 즉 API는 점원과 같은 역할을 한다.
- API는 손님(프로그램)이 주문할 수 있게 메뉴(명령 목록)를 정리하고, 주문(명령)을 받으면 요리사(응용프로그램)와 상호작용하여 요청된 메뉴(명령에 대한 값)를 전달한다.
- API를 키보드라고 봤을 때 어떤 키를 누르느냐에 따라 화면이 달라지는 것처럼 명령(키보드의 키를 누름)을 받으면 명령에 대한 값(키보드의 키 event에 대한 화면)을 전달한다.
✅ 결론 : ❗API는 프로그램들이 서로 상호작용하는 것을 도와주는 매개체❗
API의 역할은?
-
API는 서버와 데이터베이스에 대한 출입구 역할을 한다.
: 모든 사람들이 이 데이터베이스에 접근하면 안된다. API는 이를 방지하기 위해 서버와 데이터베이스에 대한 출입구 역할을 하며, 허용된 사람들에게만 접근성을 부여해준다. -
API는 애플리케이션과 기기가 원활하게 통신할 수 있도록 한다.
: 여기서 애플리케이션이란 우리가 흔히 알고 있는 스마트폰 어플이나 프로그램을 말한다. API는 애플리케이션과 기기가 데이터를 원활히 주고받을 수 있도록 돕는 역할을 한다. -
API는 모든 접속을 표준화한다.
: API는 모든 접속을 표준화하기 때문에 기계/ 운영체제 등과 상관없이 누구나 동일한 액세스를 얻을 수 있다.
- 오해1 : spring api를 검색해보면 항상 rest api가 떠서 spring api의 한 종류가 rest api인 줄 알았다.
-> NO rest api는 api의 한 종류이다!! 그리고 서버에 어떤 방식으로 접근하느냐에 따라 종류가 다르다(물론 이보다 더 많은 차이점이 존재 하겠지요?!)
-> 아주 간단한 Soap api와 rest api 차이점 (http://blog.wishket.com/soap-api-vs-rest-api-%eb%91%90-%eb%b0%a9%ec%8b%9d%ec%9d%98-%ea%b0%80%ec%9e%a5-%ed%81%b0-%ec%b0%a8%ec%9d%b4%ec%a0%90%ec%9d%80/) - 오해2 : spring api는 rest api만 만들 수 있을 것이다!
-> Nope!! 가장 많이 쓰이고 편리한 api가 rest api라서 그런 것!! 다른 Post api, soap api 등등 다른 api를 만들 수 있다!
- REST는 Representational State Transfer라는 용어의 약자, 네트워크를 통해서 컴퓨터들끼리 통신할 수 있게 해주는 아키텍처 스타일을 의미
- REST는 기본적으로 웹의 기존 기술과 HTTP 프로토콜을 그대로 활용하기 때문에 웹의 장점을 최대한 활용할 수 있는 아키텍처 스타일이다. HTTP URI를 통해 자원을 명시하고, HTTP Method (POST, GET, PUT, DELETE)를 통해 해당 자원에 대한 CRUD[Create(생성), Read(읽기), Update(갱신), Delete(삭제)] OPERATION을 적용하는 것을 의미한다.
- 웹의 모든 자원에 고유한 ID인 HTTP URI 를 부여한다.
REST API
- REST 아키텍쳐를 준수하는 서비스. 간단하게 말하면 데이터를 요청하는 방식이 고정되어 있고, 요청에 따라 데이터를 처리하고 전달하는 작업만 수행
클라이언트 -> 서버 요청 규칙
출처
- URI를 통해 자원을 명시할 때 @PathVariable 어노테이션을 통해 "URL/coco" 방식으로 URI에 필요한 데이터를 넣어 전송
- Restful에서는 HTTP Method의 타입으로 어떤 작업을 해야하는지 판별
서버 -> 클라이언트 응답 코드
데이터 자체는 JSON이나 XML 형태로 보내주면 되지만 처리 결과는 상태코드로 보내주면 되는데, 역시 HTTP의 상태코드를 그대로 사용
서버 -> 클라이언트 응답 데이터
- 데이터는 보통 JSON(JavaScript Object Notation)과 XML의 두 가지 형식을 사용해서 주고 받는다.
- JSON은 XML보다 훨씬 나중에 나온 경량의 데이터 교환 형식. 자바스크립트 문법을 확장해서 나온터라 XML에 비해 훨씬 경량화되고 사용하기도 쉽고 문법이 간결함하고 더 빠르기도 하다.
REST API 만들기
간단하게 String 문자 하나를 파라미터로 받아서 변형시킨 뒤 반환해 주는 API를 만들 것이다!!
- 입력 파라미터 : String
- Return : String
- Spring Boot 프로젝트를 생성한다.
- 클래스를 하나 만들고, 클래스에 @RestContoller 어노테이션을 붙여준다.
- 기능을 수행할 메소드에 @RequestMapping 어노테이션을 붙여 REST API를 받을 요청명을 Mapping해주면 끝!
@RestController
public class RestTestController {
@RequestMapping("/restTest") // url 뒤에 restTest가 붙으면 다음 메소드 실행!
public String restTest(@RequestParam String str){
return str + " : Rest Test 완료!!!";
}
}
서버를 띄우고 브라우저에 "http://localhost:포트/restTest?str=test12345 " 를 입력해 제대로 반환 하는지 테스트 해 보자.
REST API 호출하기
이렇게 만들어 놓은 REST API를 다른 Spring 서버에서 호출해서 사용해 보자. 새로 만든 Spring 프로젝트에서 REST API를 호출!
- RestTemplate에 MessageConverter를 셋팅한다. (여기서 RestTemplate란 스프링에서 REST 리소스와 상호작용 하기 위한 메서드 제공해주는 템플릿)
- map 에 parameter를 셋팅한다.
- restTemplate의 메소드로 REST API를 호출한다.
// RestTemplate 에 MessageConverter 세팅
List<HttpMessageConverter<?>> converters = new ArrayList<HttpMessageConverter<?>>();
converters.add(new FormHttpMessageConverter());
converters.add(new StringHttpMessageConverter()); // 지원하는 오브젝트 타입은 String, 파라미터에 사용할 경우 HTTP 본문을 그대로 String으로 가져올 수 있음
RestTemplate restTemplate = new RestTemplate();
restTemplate.setMessageConverters(converters);
// parameter 세팅
MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();
map.add("str", "thisistest");
// REST API 호출
String result = restTemplate.postForObject("http://localhost:8082/restTest/", map, String.class);
System.out.println("------------------ TEST 결과 ------------------");
System.out.println(result);
이 코드가 실행되면, "REST API 만들기" 에서 만든 서버의 메소드를 URL을 통해 호출해 결과를 얻어 올 수 있다.
참고
REST API를 만드는 또 다른 예시 (https://codevang.tistory.com/261?category=849481)
이 사이트로 들어가보면 위의 코드와 예시의 코드가 API를 만드는 방법이 다르다는 것을 알 수 있는데 @Controller라고 붙이는 경우 @ResponseBody를 꼭 써줘야 하고 @RestController라고 붙인 경우 @Controller + @ResponseBody가 합쳐진 거라 @ResposeBody 없고 Mapping만 해줘도 된다~~