All Projects → ihoneymon → rest-api-study

ihoneymon / rest-api-study

Licence: other
REST API 스터디를 위한 저장소

Programming Languages

java
68154 projects - #9 most used programming language
CSS
56736 projects
javascript
184084 projects - #8 most used programming language
groovy
2714 projects

REST API



왜 REST에 대한 관심을 가지게 되었을까?

  • 프론트엔드Front-End와 백엔드Back-End가 분리되기 시작
    • 새로운 서비스 개발을 위해 개발작업 진행
      • JSON 형태로 데이터를 제공하는 API를 제공하자고 동의
      • RequestMethod(HTTP: GET, POST, PUT, DELETE)와 URL을 이용한 정의
      • View 영역이 포함되지 않은 서버사이드Server-side 개발을 진행
  • 멀티플랫폼에 대한 지원을 위해 서비스 자원에 대한 아키텍처를 세우고 이용하는 방법을 모색
    • 웹 + 모바일 웹
    • 아이폰, 안드로이드
    • 그 외(뭐가 있을까?)
  • OPEN API를 제공하고 싶다.
    • 웹 2.0 시대 이후 다양한 매시업Mashup 서비스들이 출현할 수 있었던 밑바탕에는 깔끔하게 정리된 REST API 덕분이 아닐까?
    • 내가 만든 서비스에서도 OPEN API를 제공하고자 한다.

REST API 란 무엇인가?

  • API(Application Programming Interface)란 무엇인가?
    • API 어렵지 않아요.
      • 우리는 이미 API를 사용하고 있다.
      • Java 다른 클래스의 메소드를 사용하는 것도 API를 이용하는 것이다.
       public class Calculator {
       	public int add(int a, int b) {
       		return a + b;
       	}
       }
      
       public class TestCalculator {
      
       	private Calculator calculator;
      
       	@Befor
       	public void setUp() {
       		calculator = new Calculator();
       	}
      
       	@Test
       	public voic testAdd() {
       		int a = 5;
       		int b = 10;
       		assertThat(calculator.add(a, b), is(5));
       	}
       }
      

    데이터와 기능의 집합을 제공하여 컴퓨터 프로그램간 상호작용을 촉진하며, 서로 정보를 교환가능 하도록 한다.

  • REST

2000년 로이 필딩(Roy Fielding)이 박사학위 청구 논문에서 REST(Representational State Transfer)를 소프트웨어 아키텍처 스타일로 제안한 후 OPEN API를 개발하는 기본으로 급속도로 확산되고 있다.

REST는 SOAP이 서비스 지향 구조인 것과 달리 자원지향구조(ROA: Resource Oriented Architecture)로 웹 사이트의 컨텐츠(Text, 이미지, 동영상), DB의 내용 등을 전부 하나의 자원으로 파악하여 각 자원의 고유한 URI(Uniform Resource Identifier)를 부여하고, 해당 자원에 대한 CRUD(Create, Read, Update, Delete) 작업을 HTTP의 기본 명령어인 POST, GET, PUT, DELETE를 통해서 처리한다.

  • 메소드, CRUD, SQL 비교
Method CRUD SQL
POST Create INSERT
GET Read SELECT
PUT Update UPDATE
DELETE Delete DELETE
  • REST API

    • REST 구조 스타일에 적합한 Web API를 REST API라고 한다.
    • 'REST API'를 제공하는 웹 서비스를 'RESTful'하다고 할 수 있다.
      • RESTful 하다는 것은 뭘까?
  • REST API 구현 사례

  • REST API 정보제공 방식

    • XML
    • JSON
    • RSS

REST API 설계 전

  • 제공하려고 하는 **자원(리소스, Resource)**은 무엇인가?
  • 지원할 Content-type은 어떤 것들이 있는가?
    • XML
    • JSON
    • RSS
  • 구현한 REST API 이용방법을 어떻게 설명할 것인가?
    • Javadoc?
    • 별도로 REST API를 사용하는 방법을 기술한 메뉴얼?
    • 둘다!

REST API 설계

  • REST API를 통해 제공하려고 하는 **자원(리소스, Resource)**는 무엇인가?
  • URI 경로path는 언제 복수로 써야하는가?
  • 리소스의 상태를 업데이트하려면, 어떤 메소드를 사용해야 하는가?
  • CRUD 가 아닌 연산을 어떻게 URL에 매핑하는가?
  • 특정한 시나리오에 가장 적합한 HTTP응답은 무엇인가?
  • 리소스 상태 표현의 버전은 어떻게 관리할 수 있는가?
  • JSON에 포함된 하이퍼링크는 어떻게 구조화 하는가?

URI(Uniform Resource Identifier) 식별자 설계

식별자라고 할 수 있는 유일한 일은 대상을 나타내는 것이다. 역참조를 할 때가 아니라면 다른 정보를 얻기 위해서 URI의 내용을 들여다보지 말아야 한다.

  • URI를 만들때부터 REST API 리소스 모델을 클라이언트 모델에 전달할 수 있어야 한다.

  • URI 형태

    • 규칙 : 슬러시 구분자(/)는 계층관계를 나타내는 데 사용한다.
    • 규칙 : URI 마지막 문자로 슬래시(/)를 포함하지 않는다.
    • 규칙 : 하이픈(-)은 URI 가독성을 높이는 데 사용한다.
    • 규칙 : 밑줄(_)은 URI에 사용하지 않는다.
    • 규칙 : URI 경로는 소문자가 적합하다.
    • 규칙 : 파일 확장자(ex: .json, .xml)는 URI에 포함시키지 않는다.
  • 리소스 모델링

웹서비스의 기반이 되는 URI는 REST API의 자원(리소스, Resource)가 된다.

  • 리소스 원형
    • 도큐먼트 : 객체 인스턴스나 데이터베이스 레코드와 유사한 개념
    • 컬렉션 : 서버에서 관리하는 디렉터리라는 리소스
    • 스토어 : 클라이언트에서 관리하는 리소스 저장소
  • URI 경로 디자인
    • 규칙 : 도큐먼트 이름으로는 단수 명사를 사용해야 한다.
    • 규칙 : 컬렉션 이름으로는 복수 명사를 사용해야 한다.
    • 규칙 : 스토어 이름으로는 복수 명사를 사용해야 한다.
    • 규칙 : 경로 부분 중 변하는 부분은 유일한 값으로 대체한다.
    • 규칙 : CRUD 기능을 나타내는 것은 URI에 사용하지 않는다.

요청메소드(GET/POST/PUT/DELETE)

  • 참고 : Using HTTP Methods for RESTful Services
  • 메소드별 용도
    • GET : 리소스 상태의 표현을 얻을 때 사용
    • POST : 컬렉션에 새로운 리소스를 만들거나 컨트롤러를 실행할 때 사용
    • PUT : 새로운 리소스를 스토어에 추가하거나 기존 리소스를 갱신할 때 사용
    • DELETE : 리소스 제거
    • HEAD
    • OPTIONS
  • REST의 문제점
    • 사용할 수 있는 메소드가 4가지 밖에 없다!
      • Send mail 이라던가, Log Writer와 같은 기능(Function or method)은 어떻게 표현해야할까?
    • 이 문제를 해결할 것인가?
      • '메일을 보낸다send mail'라는 행위의 의미를 바꾼다.
        • 'POST /employees/1/send-mail' : 직원 1에게 메일을 보낸다!
      • 문맥상으로 의미 변환이 불가능한 경우
        • 'PUT'과 URI를 사용하여 제어control의 의미를 부여
        • 'PUT /employees/1/grade' : 직원 1의 등급을 변경한다.

REST 기반의 아키텍처를 설계하려면 가장 어려운 것이 이 URI를 어떻게 정의하는 것이다. REST의 장점 중 하나는 이 URI와 HTTP Method만으로도 쉽게 의미를 파악할 수 있다는 것이기 때문에, URI 정의에 많은 노력을 기울이는 것이 좋다.

응답상태코드

  • 응답상태코드
    • 1xx : 전송 프로토콜 수준의 정보 교환
    • 2xx : 클라어인트 요청이 성공적으로 수행됨
    • 3xx : 클라이언트는 요청을 완료하기 위해 추가적인 행동을 취해야 함
    • 4xx : 클라이언트의 잘못된 요청
    • 5xx : 서버쪽 오류로 인한 상태코드

REST 장점/단점

  • 장점
    • 기존 웹 인프라를 그대로 이용할 있다.
    • 쉽다.
  • 단점
    • 표준이 없어 관리가 어렵다.

OAuth2(할 수 있을까...?)

아쉽지만 다음 기회에!!

  • OAuth란 무엇인가?
  • OAuth2 프로세스
  • OAuth2 예제

    • jQuery를 통해서 ajax통신을 할때, PUT이나 DELETE 메소드로 요청을 날려도 POST로 처리되는 경우
      1. web.xml hiddenMethodFilter 추가
      2. <form></form> 내에 <input type="hidden" name="_method" value="PUT/DELETE"/> 추가
        • Spring taglib를 사용하여 폼 생성시에는 <form:form method="PUT"/>을 사용시 자동으로 추가해줌
      3. json 형태로 요청시에는 form 객체 내에 '_method': 'put/delete' 추가 하면 됨

참고사항

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].