Web API 실습 { 사전설정, objectMapper, writeValueAsString }
Ben의 프로그램2023. 7. 24. 21:19
728x90
수업목표
이번 시간에는 서블릿을 이용하여 Web API를 작성해 보도록 하겠습니다. JDBC 수업 시간에 배웠던 RoleDao 도 이번 시간에 재활용됩니다.
- Servlet 을 이용해 Web API를 작성할 수 있습니다. - 객체를 JSON 문자열로 변환시킬 수 있습니다.
Maven 프로젝트 생성 및 라이브러리설정
실습을 위한 Maven 프로젝트를 생성하겠습니다.
이번에는 archetype 을 webapp 으로 설정하고 생성하겠습니다.
Artifact Id 를 webapiexam 으로 두고 생성하겠습니다.
Maven 프로젝트를 생성하였다면 매번 하는 pom.xml 설정이 있었죠. 우선은 java jdk 버전 설정에 대한 플러그인을 <build> 태그 안에 넣어줍니다. (강사님의 경우 이렇게 직접 추가해주셨는데, 저의 경우 추후에 나온 버전이라 자동으로 플러그인이 추가되어 있었습니다)
Web API 를 사용하기 위해 몇 가지 라이브러리를 추가하려고 합니다. Maven 을 이용하여 라이브러리를 추가할 것이므로 dependency 태그 안에 적어주면 되겠죠. - mysql : Web api 를 이용하면서 저번 시간에 jdbc 예제와 같이 사용할 것이기 때문에 mysql 라이브러리를 추가해주었습니다. - jackson : Json 데이터를 활용할 것이기 때문에 json 라이브러리를 추가해주었습니다. - servlet : servlet api 가 필요하기 때문에 추가시켜 주었습니다. - jstl : jstl 을 사용하려고 추가해주었습니다.
이렇게 필요한 라이브러리들을 추가해주었다면 반드시 Maven - Update Project 를 실행시켜주어야 합니다.
.settings 폴더 수정하기
Project Explorer 우측 상단을 보면 ... 이 있다. 클릭하면 Filters and Customization 항목이 있다. 클릭한다.
.resources 체크박스를 해제하고 Ok 를 누른다.
.settings 폴더가 보이게 된다.
.settings 안을 보면 org.eclipse.wst.common.project.facet.core.xml 이라는 파일이 있다. jst.web 의 버전이 2.3 으로 설정되어 있는 것을 확인할 수 있다. 저희는 서블릿을 최소 2.5 버전 혹은 3.0 이상 버전을 사용했었습니다. 이 부분을 다음과 같이 3.1 버전으로 수정합니다.
이렇게 수정하고 나면 eclipse 를 재시작해야합니다.
재시작하고 나서 프로젝트의 properties - Project Facets 에서 Dynamic Web Module 이 3.1로 잘 수정되어있는지 확인합니다.
web.xml 삭제
이번 예제에서는 Annotation 을 이용해서 서블릿을 설정할 것이기 때문에 web.xml 파일을 삭제할 겁니다. src - main - webapp - WEB-INF - web.xml 을 삭제해줍니다.
이렇게 web.xml 삭제를 진행했다면 한 가지 수정해야 하는 부분이 있습니다. pom.xml 파일에서 properties 탭에 <failOnMissingWebXml>false</ ...> 라는 태그를 추가해주어야 오류가 발생하지 않습니다.
패키지 추가
여기까지 진행했다면 java 폴더 아래에 지난 시간 jdbc 예제에서 생성한 패키지와 파일들을 모두 복사해줍니다.
URL 주소 확인하면서 Servlet 구상하기
이런 URL 들을 볼 수 있는데요. Get / roles / {roleId} 는 Get 방식이니까 'SELECT'는 명령인데, roleId 에 해당하는 roles 를 읽어오라는 의미입니다. Post / roles 는 Post 방식이니까 'INSERT' 명령인데, roles 에 한 건 넣어줘요라는 명령입니다. Put / roles 는 Put 방식이니까 'UPDATE' 명령인데, roles 를 업데이트 해달라는 명령입니다. DELETE 방식은 'DELETE' 명령입니다. 위에서 보이는 모든 URL 들을 하나의 서블릿으로 처리할 수는 없을 겁니다. Get 방식은 doGet( ) 메서드, POST 방식은 doPost( ) 메서드, DELETE 방식은 doDelete( ) 메서드로 Http 메서드 요청을 구현해야 합니다. 그런 부분들을 이해한 상태에서 roles 의 모든 정보를 보여주는 RolesServlet 을 먼저 작성하겠습니다.
RolesServlet 작성
모든 데이터를 보여주는 RolesServlet 을 webapiexam.api 패키지에 추가해주었습니다.
코드는 위와 같은데요. 하나씩 살펴보도록 하겠습니다. response.setCharacterEncoding 은 응답 하는 객체의 인코딩을 설정합니다. response.setContentType 은 응답하는 방식을 설명하는데 현재 우리는 json 을 사용할 것이기 때문에 application/json 으로 설정하였습니다. RoleDao 객체를 생성하여 getRoles( ) 메서드를 사용하여 Role 테이블에 있는 모든 Role 객체를 리스트에 담습니다. json 사용하려고 추가했던 라이브러리가 제공해주는 ObjectMapper 를 사용하면 Role 객체가 담겨있는 리스트를 json 문자열로 바꾸거나 json 문자열을 객체로 바꾸는 기능이 가능해집니다. ObjectMapper 객체를 생성한 다음 objectMapper 의 writeValueAsString( ) 메서드를 사용하여 list 객체를 json 문자열로 변환하였습니다. 그 다음 response.getWriter( ) 메서드로 PrinterWriter 객체를 생성하였고, json 을 web browser 의 출력 결과로 보내주었습니다.
프로그램을 실행하면 위와 같은 화면을 볼 수 있습니다. Json 은 Javascript Object Notation 의 약어로 아주 가벼운 형태의 데이터 교환 형식입니다. Javascript 에서는 객체로 만들 때 사용하는 표현식이기도 합니다. 대괄호는 배열, 리스트 등을 의미하구요. 중괄호는 객체 한 건을 의미합니다. 중괄호 안에는 속성명과 속성 값이 나오게됩니다.