ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Back End] Web API
    Web 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 상태코드 - 클라이언트로 인한 오류

    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();
    	}
    
    }
    

     

     

    /RolesServlet 실행결과

     

    roles 테이블의 모든 튜플이 json으로 전송되었음을 확인할 수 있다.

    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

    댓글

Designed by Tistory.