네트워크 아키텍처 원리
의 모음입니다.별도의 전송 계층 없이 전송하기 위한 아주 간단한 인터페이스
를 말합니다.애플리케이션
이라는 단어는 고유한 기능을 가진 모든 소프트웨어
를 나타냅니다.두 애플리케이션 간의 서비스 계약
이라고 할 수 있습니다.통신하는 방법
을 정의합니다.요청과 응답을 구성하는 방법에 대한 정보
가 들어 있습니다.균일한 인터페이스 (uniform interface)
REST인지 판별하는 모델
이미지출처-https://martinfowler.com/articles/richardsonMaturityModel.html
Level1
리소스 개념이 생기고, 리소스 단위로 여러개의 엔드포인트가 존재합니다.
리소스 중심 설계(리소스 단위 URL 설계)
Representation Data를 사용합니다.
Level2
GET, PUT, POST, DELETE 등 HTTP 메소드(HTTP Verbs)를 도입합니다.
리소스에 접근하는 용도에 맞게 적절한 HTTP메소드를 사용하는 것을 의미합니다.
Level3
HATEOAS를 말합니다.
Hypermedia as the Engine of Application State (hey-dee-us)
리소스에 안에 전달한 리소스를 가지고 할 수 있는 행위를 모두 기술합니다.
헤더에 의해 표현되는 데이터가 다릅니다.
ex.
하나의 리소스에 대해서 다양한 형태로 표현이 가능합니다.
❌ GET /members/delete/1
✅ DELETE /members/1
❌ GET /members/show/1
✅ GET /members/1
✅ POST /task/1/run
슬래시 구분자(/)는 계층 관계를 나타내는 데 사용합니다.
ex. /hotels/hotelname/rooms/roomnumber
URI 마지막 문자로 슬래시(/)를 포함하지 않습니다.
특정한 동사를 사용하여 단순한 리소스의 CRUD가 아닌 액션을 표현하고 싶다면 마지막에 두는 것이 좋습니다.
ex. /task/1/run
하이픈(-)은 URI 가독성을 높이는데 사용합니다.
이미지출처-https://bepoz-study-diary.tistory.com/374
Argument Resolver애서 핸들러에 파라미터에 전달할 Argument값들을 변환합니다.
@RequestBody나 @ResponseBody를 반환하게 되면 HTTP메세지 컨버터가 동작합니다.
HTTP메세지 컨버터는 반환된 값을 Http 메세지(JSON)로 변환시켜줍니다.
@GetMapping("/api/v1/customers")
@ResponseBody
public List<Customer> findCustomers() {
return customerService.getAllCustomers();
}
@GetMapping("/customers")
public String viewCustomersPage(Model model) {
var allCustomers = customerService.getAllCustomers();
model.addAttribute("serverTime", LocalDateTime.now());
model.addAttribute("customers", allCustomers);
return "views/customers";
}
url에 버전과 api임을 명시해줍니다.
HTTP메세지로 변환하기 위해 @ResponseBody 어노테이션을 붙여줍니다.