Rest API

  • API(Application Programming Interface)
    • 응용 프로그램 프로그래밍 인터페이스
    • 응용 프로그램에서 사용할 수 있도록, 운영 체제나 프로그래밍 언어가 제공하는 기능을 제어할 수 있게 만든 인터페이스
    • 쉽게 말해, 어떠한 메소드(기능)를 사용할 때 그 내부 구현을 모르고도 인터페이스만 알면 사용할 수 있다.
      • 이렇게 제공하는 것을 API라 한다.
  • Mashup
    • API들을 조합한 어플레케이션.
  • REST
    • REpresentational State Transfer
  • REST API
    • REST형식의 API
    • 핵심 컨텐츠 및 기능을 외부 사이트에서 활용할 수 있도록 제공되는 인터페이스.
    • 아래의 스타일을 지켜야 REST API 이다.
      • Client - Server
      • Stateless
      • Cache
      • Uniform interface
      • Layered System
      • Code-on-demand (optional)
    • HTTP 프로토콜을 준수한다면 uniform interface를 제외하고 전부 쉽게 구현 가능하다.

    • Uniform interface
      • 리소스가 URI로 식별되야 함.
      • 리소스를 생성, 수정, 추가하고자 할 때 HTTP 메시지에 표현해서 전송해야 함.
      • 메시지는 스스로 설명할 수 있어야 함.(Self-descriptive Message)
      • 어플리케이션의 상태는 Hyperlink를 이용해 전이되어야 함. (HATEOAS)
    • 메시지가 스스로 설명할 수 있어야 하는 부분, HATEOAS를 지원하는 것은 어렵다.
      • 응답 결과에 보통 JSON 메시지를 사용하는데 이 JSON메시지가 어디에 전달되고 구성이 어떤 의미인지 표현해야 스스로 설명할 수 있다고 말할 수 있는데 그게 어렵다.
    • REST API는 쉽지 않기에 많은 서비스가 REST에서 바라는 것을 모두 지원하지는 않고 API를 만들게 된다.
      • 모든 것을 준수하지 않지만 REST API라 말하는 경우도 존재.
      • 모든 것을 준수하지 않으면 Web API, HTTP API 라고 부르는 경우도 존재.

Web API

  • URI는 정보의 자원을 표현해야 한다.
  • 자원에 대한 행위는 HTTP Method(GET, POST, PUT, DELETE)로 표현한다.
Method DESC
POST POST를 통해 해당 URI를 요청하면 리소스를 생성.
GET GET을 통해 해당 리소스를 조회.
리소스를 조회하고 해당 도큐먼트에 대한 자세한 정보를 가져온다.
PUT PUT을 통해 리소스를 수정한다.
DELETE DELETE를 통해 리소스를 삭제한다.
  • GET /members
    • 멤버의 모든 정보를 요청.
  • GET /members/delete/1
    • 위와 같이 동사로 삭제를 표현하면 안된다.
    • GET은 정보를 요청할 때 사용해야한다.
  • DELETE /members/1
    • HTTP Method 중 하나인 DELETE를 이용하여 삭제를 표현.
    • members중 1에 해당하는 것을 삭제.
  • 슬래시 구분자(/)는 계층을 나타낼 때 사용.
    • http://domain/houses/apartments
      • house들 중에서 apartment.
    • http://domain/departments/1/employees
      • 모든 부서 중에서 1번 부서의 사원들.
  • URI 마지막 문자로 슬래시 구분자(/)를 포함하지 않는다.
  • 하이픈(-)은 URI가독성을 높일 때 사용
  • 언더바(_)는 사용하지 않는다.
  • URI경로는 소문자만 사용한다.
    • URI의 문법형식인 RFC 3986은 URI스키마와 호스트를 제외하고는 대소문자를 구별한다.
  • 파일 확장자는 URI에 포함시키지 않는다.
    • Accept Header를 사용.
  • 상태코드
상태코드 DESC
200 클라이언트의 요청을 정상적으로 수행함
201 POST를 통한 리소스 생성 작업 시 클라이언트가 요청한 해당 리소스가 성공적으로 생성됨
301 클라이언트가 요청한 리소스에 대한 URI가 변경 되었을 때
응답 시 Location header에 변경된 URI를 명시
400 클라이언트의 요청이 부적절 할 경우
401 클라이언트가 인증되지 않은 상태에서 보호된 리소스를 요청 시
403 유저 인증상태와 관계 없이 응답하고 싶지 않은 리소스를 클라이언트가 요청했을 때
  403보다는 400이나 404를 사용할 것을 권고, 403 자체가 리소스가 존재한다는 뜻이기 때문
405 클라이언트가 요청한 리소스에서는 사용 불가능한 Method를 이용했을 경우
500 서버에 문제가 있을 경우

JDBC와 Servlet을 이용한 Web API 작성

  • db table의 리소스에 접근하는 servlet을 구현.
    • 리소스를 JSON 형태로 출력.
  • GET /roles
    • Select.
  • POST /roles
    • Insert.
  • PUT /roles
    • Update.
  • DELETE /roles
    • Delete.
  • jackson lib가 제공하는 ObjectMapper 객체
    • JSON 문자열로 바꾸거나, JSON문자열을 객체로 바꾸는 역할을 수행.
    • writeValueAsString Method(Object param)
      • parameter에 list를 넣으면 해당 list를 JSON으로 변경하여 return 한다.
  • uri로 role_id 정보를 받아 결과를 출력하는 servlet 예시.
@WebServlet("/roles/*")
public class RolebyIdServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public RolebyIdServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.setCharacterEncoding("utf-8");
		response.setContentType("application/json");
		
		String pathInfo = request.getPathInfo(); // /roles/{roleId}
		String[] pathParts = pathInfo.split("/");
		String idStr = pathParts[1];
		
		int id = Integer.parseInt(idStr);
		
		RoleDao dao = new RoleDao();
		Role role = dao.getRole(id);
		
		ObjectMapper objectMapper = new ObjectMapper();
		String json = objectMapper.writeValueAsString(role);
		
		PrintWriter out = response.getWriter();
		out.println(json);
		out.close();
	}
}
  • uri 호출 시. result

  • mysql select 결과. result2