약자에서 볼 수 있듯 본질적으로는 인터페이스이다. 우리는 컴퓨터를 제어하기 위해 키보드나 마우스 같은 인터페이스를 사용한다. 마찬가지로 프로그램,서버가 데이터를 주고받기 위한 제어수단을 api라고 한다.
api 사용 ex) 날씨정보가 담긴 서버에 날씨api를 사용해 접근해서 오늘의 날씨정보를 얻어와 개발한 프로그램에 보이는 것.
자동차를 움직이기 위해 운전장치라는 인터페이스를 사용할 때 핸들,기어 같은 장치가 약속된 방식으로 작동되지 않는다면 사용에 매우 어려움이 있을 것이다.
마찬가지로 API는 통일된 형식,원칙이 있어야 사용자가 기능을 쉽게 알아채고 사용할 수 있다. REST는 이 api의 아키텍처 원칙의 한 종류이다.
- 1) Uniform (유니폼 인터페이스)
Uniform Interface는 URI로 지정한 리소스에 대한 조작을 통일되고 한정적인 인터페이스로 수행하는 아키텍처 스타일을 말합니다.- 2) Stateless (무상태성)
REST는 무상태성 성격을 갖습니다. 다시 말해 작업을 위한 상태정보를 따로 저장하고 관리하지 않습니다. 세션 정보나 쿠키정보를 별도로 저장하고 관리하지 않기 때문에 API 서버는 들어오는 요청만을 단순히 처리하면 됩니다. 때문에 서비스의 자유도가 높아지고 서버에서 불필요한 정보를 관리하지 않음으로써 구현이 단순해집니다.- 3) Cacheable (캐시 가능)
REST는 HTTP라는 기존 웹표준을 그대로 사용하기 때문에, 웹에서 사용하는 기존 인프라를 그대로 활용이 가능합니다. 따라서 HTTP가 가진 캐싱 기능이 적용 가능합니다. HTTP 프로토콜 표준에서 사용하는 Last-Modified태그나 E-Tag를 이용하면 캐싱 구현이 가능합니다.- 4) Self-descriptiveness (자체 표현 구조)
REST의 또 다른 큰 특징 중 하나는 REST API 메시지만 보고도 이를 쉽게 이해 할 수 있는 자체 표현 구조로 되어 있다는 것입니다.- 5) Client - Server 구조
REST 서버는 API 제공, 클라이언트는 사용자 인증이나 컨텍스트(세션, 로그인 정보)등을 직접 관리하는 구조로 각각의 역할이 확실히 구분되기 때문에 클라이언트와 서버에서 개발해야 할 내용이 명확해지고 서로간 의존성이 줄어들게 됩니다.- 6) 계층형 구조
REST 서버는 다중 계층으로 구성될 수 있으며 보안, 로드 밸런싱, 암호화 계층을 추가해 구조상의 유연성을 둘 수 있고 PROXY, 게이트웨이 같은 네트워크 기반의 중간매체를 사용할 수 있게 합니다.
위와 같은 기준을 준수하는 api를 REST api라 한다. 하지만 위와 같은 기준을 딱 맞게 모두 만족시키는 것은 어려운 일이 될 수 있다. 이렇게까지 할 필요가 없는 경우도, 혹은 필요에 따라 어겨야 할 경우도 생길 수 있다. rest규정을 조금 더 널널하게 준수하며 만든 api를 web api라 부르기도 한다.
REST에서는 행위에 대한 메서드를 HTTP의 메서드를 그대로 사용한다.
REST에서는 HTTP의 CRUD에 해당하는 POST,GET,PUT,DELETE를 사용한다.
GET을 통해 조회하고, POST를 통해 생성하고 PUT을 통해 수정하고
DELETE를 통해 삭제한다.
@RestController
public class HelloController {
@GetMapping("/api")
public String Hello(){
return "Hello api";
}
}

위의 예에서 볼 수 있듯 Get을 통해 값을 조회할 수 있고 Postmapping을 통해 값을 넘겨받아 DB에 생성할 수 있다. 그런데 GET,POST,PUT,DELETE를 이용해 rest api를 구현할 때, api를 구현하는 건 개발자이기에 REST형식에서 의도한대로 메서드를 구현하지 않을 수 있다. 예를 들어 위 코드의 Getmapping의 Hello()안에서 객체와 DB의 요소를 삭제하는 식으로 구현하는 것도 가능은하다. 하지만 이러면 RESTful하게 api가 설계되었다고 말하기 힘들게 된다.
get은 조회의 역할을,post는 생성의 역할은 한다는 것은 알겠지만, 실제로 getmapping과 postmapping의 기능이 다른가? url에서 파라미터의 노출유무만 다르다면 전부 Getmapping을 써버리면 되는게 아닌가 하는 의문이 들었다. GET과 POST의 차이점을 무엇일까.
+참고:
https://meetup.toast.com/posts/92
https://interconnection.tistory.com/72