Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

어리바리 신입 개발자의 얼렁뚱땅 개발 기록 ✨

[ Java / SpringBoot / Rest API ] Rest API 규칙 본문

REST API

[ Java / SpringBoot / Rest API ] Rest API 규칙

낫쏘링 2023. 9. 4. 16:23
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