어리바리 신입 개발자의 얼렁뚱땅 개발 기록 ✨
[ Java / SpringBoot / Rest API ] Rest API 규칙 본문
728x90
Rest(Representational State Tranfer)
- 클라이언트와 서버가 데이터를 주고 받을 때 제약조건들을 정의하는 소프트웨어 아키텍처 스타일
- Rest API : HTTP의 장점을 살리기 위한 통신 규약
- RESTful : 6개의 REST 기본원칙을 준수한 인터페이스
- HTTP URL 을 통해서 자원(Resource)을 명시해야 한다.
- HTTP Method(GET, POST, PUT, DELETE)를 통해 해당 자원(HTTP URL / Resource)에 대한 CRUD를 적용한다.
[ REST 기본원칙 ]
1. 클라이언트 - 서버 구조
클라이언트와 서버는 서로 독립적이어야 한며, 의존성이 적어야 한다.
클라이언트는 오직 URIs 리소스만 알 수 있어야한다.
2. 일관된 인터페이스
일관된 인터페이스로 분리하기 위하여 4가지 인터페이스 규칙을 지킨다.
- 요청 시 개별 자원을 식별할 수 있어야 한다.
- 자신을 어떻게 처리해야 하는지에 대한 정보를 포함해야 한다.
- 결과 뿐 아니라 결과에 대한 정보까지 포함해야 한다.
- 작업하고자 하는 자원에 대한 적절한 표현과 메타 데이터를 갖추고 있을 경우 서버는 해당 자원을 변경하고 삭제할 수 있는 정보를 가지고 있다는 뜻이다.
3. 무상태성
클라이언트의 모든 요청에는 해당 요청을 이해할 수 있는 정보가 포함되어야 한다.
서버는 HTTP 요청에 대한 정보를 저장해서는 안된다.
컨텍스트를 유지해야하는 세션, 인증과 인가에 대한 정보 또한 클라이언트에만 보관해야 한다.
요청 할 때 클라이언트에서는 해당 정보를 모두 포함하여 서버에 요청해야 한다.
4. 캐시 처리
서버는 해당 요청이 캐싱이 가능한 지에 대해 제공해야 한다.
클라이언트는 응답을 캐싱할 수 있어야 한다.
이를 통해 서버와 클라이언트 사이에 상호작용을 줄이고, 성능과 서버 가용성을 늘릴 수 있다.
5. 계층화
다중 계층 구조를 갖도록 허용한다. (API 서버 - DB 서버 - 인증 서버)
각 계층은 자기와 통신하는 컴포넌트에 해당하는 계층의 정보 외에 알 수 없다.
클라이언트는 REST 서버와 상호작용할 뿐 REST 서버가 상호작용하는 계층과 중간 계층에는 직접적으로 상호작용할 수 없다.
때문에 클라이언트는 해당 서버에 직접 연결되어있는지, 프록시를 통해 연결되었는지 알 수 없다.
6. Code on demand
서버가 클라이언트에서 실행시킬 수 있는 로직을 전송하여 클라이언트의 기능을 확장시킬 수 있다.
때문에 클라이언트가 사전에 구현해야하는 기능을 간소화할 수 있다.
[ REST 구성 요소 ]
1. HTTP URL : 자원(Resource)
2. HTTP Method : 자원에 대한 행위(GET - 조회, POST - 등록, PUT - 수정, DELETE - 삭제)
3. Representation : 자원에 대한 표현
[ RESTful API을 위한 네이밍 규칙 ]
1. 자원(Resource)
1. 계층관계를 표현할 때는 /를 사용하고, 마지막에는 /를 붙이지 않는다.
ex) /board >> /board/write >> /board/write/{id}
ex) /board/write/{id}/ >> /board/write/{id}
2. 언더바(_)는 사용하지 않고, 하이픈(-)만 사용한다. 소문자만 사용한다.
ex) /Notice_board/write/{id}/ >> notice-board/write/{id}
3. 파일 확장자는 사용하지 않는다. (클라이언트가 관리하는 자원 저장소 제외)
ex) /board/write.txt >> /board/write
4. 동사 대신 명사를 사용한다. (컨트롤 자원을 의미하는 경우에만 동사를 사용한다.)
ex) /board/writing >> /board/write
2. 행위(HTTP Method)
1. 행위를 표현하기 위해 자원대신 HTTP Method를 사용한다.
ex) /board/write/post >> /board/write
@PostMapping("/board/write") 또는
@RequestMapping(value="board/write", method=RequestMethod.POST)
728x90