-
[Back End] Web APIWeb Development/부스트코스 - Back-End(Java) 2020. 3. 14. 23:14
Web API
- REST API의 모든 스타일을 구현하지 못할 경우에는 REST API라고 부르기 보다는 Web API 또는 HTTP API라고 부른다.
Web API 디자인 가이드
- URI는 정보의 자원을 표현해야 한다.
- GET /members
: 위의 표현은 맴버의 모든 정보를 달라는 요청입니다. - GET /members/delete/1
: GET은 정보를 요청할 때 사용합니다. 위와 같이 동사로 삭제를 표현하면 안 됩니다. - DELETE /members/1
: HTTP Method 중의 하나인 DELETE를 이용하여 삭제를 표현해야 합니다.
- 자원에 대한 행위는 HTTP Method(GET, POST, PUT, DELETE)로 표현한다.
- GET /members/1 (o)
- GET /members/get/1 (x)
- GET /members/add (x)
- POST /members (o)
- GET /members/update/1 (x)
- PUT /members/1 (o)
- GET /members/del/1 (x)
- DELETE /members/1 (o)
- 슬래시 구분자(/)는 계층을 나타낼 때 사용한다.
- URI 마지막 문자로 슬래시 구분자(/)를 포함하지 않습니다.
- 하이픈(-)은 URI가독성을 높일 때 사용합니다.
- 언더바(_)는 사용하지 않습니다.
- URI경로는 소문자만 사용합니다.
- RFC 3986(URI 문법 형식)은 URI스키마와 호스트를 제외하고는 대소문자를 구별합니다.
- 파일 확장자는 URI에 포함하지 않습니다.
- Accept Header를 사용합니다.
HTTP 상태코드 - 성공
HTTP 상태코드 - 클라이언트로 인한 오류
HTTP 상태코드 - 서버로 인한 오류
Web API - 실습
- JDBC 실습을 Web API로 구현해보자. (RoleDao.java, Role.java 활용)
RoleServlet.java
package kr.or.connect.webapiexam.api; import java.io.IOException; import java.io.PrintWriter; import java.util.List; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.fasterxml.jackson.databind.ObjectMapper; import kr.or.connect.jdbcexam.dao.RoleDao; import kr.or.connect.jdbcexam.dto.Role; @WebServlet(description = "/roles", urlPatterns = { "/RolesServlet" }) public class RolesServlet extends HttpServlet { private static final long serialVersionUID = 1L; public RolesServlet() { super(); // TODO Auto-generated constructor stub } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("utf-8"); //응답객체의 인코딩 설정 response.setContentType("application/json"); //json 타입으로 설정 RoleDao dao = new RoleDao(); List<Role> list = dao.getRoles(); //dao 객체를 이용해 role 테이블의 모든 튜플을 리스트로 뽑아옴. ObjectMapper objectMapper = new ObjectMapper(); //objectMapper 사용해서 객체를 json으로 바꾸거나, json을 객체로 만들 수 있음 String json = objectMapper.writeValueAsString(list); //튜플 리스트가 json으로 변환됨. PrintWriter out = response.getWriter(); out.println(json); //json으로 변환된 데이터 전송. out.close(); } }
RoleByIdServlet.java
package kr.or.connect.webapiexam.api; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.fasterxml.jackson.databind.ObjectMapper; import kr.or.connect.jdbcexam.dao.RoleDao; import kr.or.connect.jdbcexam.dto.Role; @WebServlet("/roles/*") public class RoleByIdServlet extends HttpServlet { private static final long serialVersionUID = 1L; public RoleByIdServlet() { super(); // TODO Auto-generated constructor stub } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("utf-8"); response.setContentType("application/json"); //request의 getPathInfo를 사용해서 url path 정보를 파싱한다. 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(); } }
JSON(JavaScript Object Notation)
- JSON 메세지는 자바스크립트 오브젝트 노테이션의 약어로, 아주 가벼운 형태의 메세지 교환 형식이다. 자바스크립트에서 객체를 만들때 사용하는 표현식이기도 하다. 대괄호는 배열, 리스트를 의미 중괄호는 객체를 의미, ""는 속성명을 의미한다.
Spring?
- 서블릿을 이용해서 api를 만드는것은 많이 불편하다. 이러한 불편함을 해결하기 위해 여러 기술이 생겨났다. 그 중 대표적인 것이 spring이다. 실제로 JDBC와 서블릿을 직접 이용해서 api를 만드는 겨우는 드물다. 하지만 원리를 이해하고 spring에 대한 이해를 높이기 위해 학습이 필요하다.
'Web Development > 부스트코스 - Back-End(Java)' 카테고리의 다른 글
[Back End] Spring Core (0) 2020.03.25 [Front End] Web UI development (0) 2020.03.15 [Back End] Rest API (0) 2020.03.14 [Back End] JDBC - 실습 (0) 2020.03.14 [Back End] JDBC (0) 2020.03.14 - GET /members