들어가기 전에
이번 시간엔 서블릿을 이용해 Web API를 작성해 보도록 하겠습니다.
참고로 JDBC 수업 시간에 배웠던 RoleDao도 이번 시간에 재활용됩니다.
학습 목표
- Servlet을 이용해 Web API를 작성할 수 있습니다.
- 객체를 JSON문자열로 변환시킬 수 있습니다.
핵심 개념
- JSON
- ObjectMapper
- URL pattern에서 wildcard(*)
학습하기
들어가기 전에
이번 시간엔 서블릿을 이용해 Web API를 작성해 보도록 하겠습니다.
참고로 JDBC 수업 시간에 배웠던 RoleDao도 이번 시간에 재활용됩니다.
학습 목표
핵심 개념
학습하기
실습코드
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");
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();
}
}
생각해보기
자바 서블릿은 보통 하나의 URL에 대한 처리만 합니다.
그런데 이번 실습을 보면 Role과 관련된 다양한 URL이 필요했고, 이를 처리하기 위한 클래스가 여러 개 필요했습니다.
객체지향은 관련된 여러 개의 기능을 하나로 모으는 것이 중요합니다.
그런데, 관련된 여러 개의 URL 처리를 여러 개의 서블릿으로 나눠서 하고 있습니다.
이러한 문제를 해결하려면 어떻게 해야 할까요?
참고 자료
https://docs.oracle.com
comment
24.04.05.
220313
{
"roleId": 100,
"description": "100"
}
왜 description에 role_id가 뜨는걸까요..ㅠ
코드도 다 확인해봤는데 어디가 틀린건지 도저히 모르겠네요..
실습 1에서 list로 role의 모든 요소 받아서 출력하는 건 그냥 [ ] 이렇게 뜨고 아무것도 안나오는데,
실습 2에서 아이디로 하나만 출력하는 건 또 잘 되네요 왜그럴까요? ㅠㅠ
mysql 실행되고 있는지, 연결되었는지, 버전은 pom과 동일하게 맞췄는지 다 확인 했습니다..
에러 404가 뜨는 건 왜 그런 걸까요...? 계속 그거때문에 다음으로 못 넘어가고 있는데ㅜㅜ 딱 한 번 제대로 실행되더니 그 이후로는 계속 404가 뜹니다.. server.xml 파일도 건드려보고 톰캣 work 폴더도 지워보고 했는데 해결이 안 되네요ㅜㅜ 같은 현상 겪으신 분 계신가요ㅜㅜ (localhost:8080 실행했을 때 톰캣 페이지는 제대로 뜹니다)
.m2 폴더를 지우고 maven update 를 해봐도, pom.xml 에 json version을 LATEST 로 해보고
maven update 를 해봐도 com/fasterxml/jackson/databind/ObjectMapper 500번 오류가 나네요...
어떻게해야할까요...
관련 된 기능들을 하나의 Servlet에 정의하고 각 기능별로 URL을 가질 수 있다면 가능할 것 같습니다..
마지막 실습에서 objectMapper를 받은 json 을 어떻게 jsp페이지에 뿌리는지 아시는 분 계시면 알려주세요.
! 500번 에러
내용 : com/fasterxml/jackson/databind/ObjectMapper
위와 같은 에러가 나오면 프로젝트 오른쪽 클릭 -> Maven -> Update Project 해보세요...
그 다음에도 안되면 다른 분들의 댓글 에러 솔루션들 적용해보시길!!
생각보다 쉽게 해결될 수 있습니다...
계속해서 서버로 돌릴때 포트 충돌이 납니다 ㅜㅜㅜ
포트번호 계속 바꾸고, 노트북을 껐다 켜봐도 똑같네요 뭐가 문제일까요 ㅜㅜㅜ
이전까지는 잘됏는데 이번실습대부터 갑자기 그러네요
생각해보기
요즘은 프레임 워크들이 URL만 따로 모아두는 파일을 제공하고 있죠. 노드 JS부터 시작해서 파이썬, 스프링등 거의 모든 프레임 워크들이 각각의 기능을 모아두게끔 처음부터 설계되어 있습니다.
중간중간 maven project update 해주시는 거 잊지마세요~
오류가 날 이유가 없는데 계속 오류가 난다싶을 때 maven project update 해주면 해결되는 경우가 있어서
당황스러웠네요....ㅠㅠ
java.sql.SQLNonTransientConnectionException 이 오류가 뜬다면
url에
allowPublicKeyRetrieval=true&useSSL=false 이걸 추가해주세요
-----------------------------
private static String dburl = "jdbc:mysql://localhost:3306/connectdb?serverTimezone=Asia/Seoul&useSSL=false&allowPublicKeyRetrieval=true&useSSL=false";
동영상 화면처럼 json 출력 하고 싶으면 크롬앱스토어 확장프로그램에서 JSON Formatter 다운받으시면 됩니다
안드로이드 개발할 때에는 JSON 객체를 다루기 위해 GSON 라이브러리를 이용했었는데, jackson 라이브러리는 처음 접해보네요.
위에 RolesServlet 실행한 결과 크롬브라우저에서 [ ] 이렇게만 나오고 JSON 데이터가 나오지 않습니다.
어디를 수정해봐야 할까요? 위에 코드와 동일합니다.
여기서 받아온 json은 jsp에서 어떻게 출력해야하나요?
안녕하세요~
doPut, doDelete은 어떤식으로 요청을 해야 하나요?
위의 doGET과 같이 자세한 설명을 해주시면 감사하겠습니다.
비공개 글입니다.
RolesServlet.java의 List<Role> list = dao.getRoles();에서
The method getRules(Integer) in the type RoleDao is not applicapable for the arguments() 라는 에러가 뜹니다..
해결방법 있을까요..?