Servlet 작성 방법 { HttpServletRequest & HttpServletResponse 객체 이해하기, Servlet으로 화면에 1~10 출력하기}
Ben의 프로그램2023. 7. 12. 22:30
728x90
들어가기 전에
현재 프로젝트에서 웹을 개발할 때 서블릿을 직접 써서 개발하지는 않습니다. 조금 더 편하게 사용할 수 있게 도와주는 다양한 프레임워크를 사용해서 개발하는 경우가 대부분입니다. 하지만, 프레임워크들도 서블릿 없이는 동작할 수 없기 때문에 서블릿의 기본적인 작성법이나, 서블릿의 라이프 사이클을 이해하고 있다면 웹의 동작을 이해하는 데 많은 도움이 됩니다.
Servlet 작성방법 2가지 이해하기 { HttpServletRequest & HttpServletResponse 객체, Servlet으로 화면에 1~10 출력하기 }
서블릿의 작성방법은 서블릿의 버전에 따라서 2가지로 나뉘게됩니다. Servlet 3.0을 기준으로 이상과 미만에서 나뉘어지게 됩니다. 3.0 이상에서는 web.xml 을 사용하지 않고 자바 Annotation 을 사용합니다. 앞에서 실습했던 firstweb 에서 사용했었습니다.
위의 그림과 같은 방식으로 @WebServlet 이라는 Annotation 을 사용했습니다. 굉장히 간결합니다. 하지만 3.0 미만 버전에서는 좀 더 많은 방식을 사용해야 합니다.
3.0 미만 버전에서는 Servlet 을 등록할 때 web.xml 파일에 위의 코드를 작성해주어야 합니다.
Servlet 3.0 spec 이상에서 사용하는 방법
우리가 하려는 것은 Servlet 3.1 spec 으로 exam31 라는 프로젝트를 생성할 겁니다. 해당 프로젝트에 1부터 10까지 출력하는 TenServelt 을 작성한 다음 실제로 URL 주소를 통해서 잘 실행되는지 확인해보겠습니다.
프로젝트를 먼저 생성해야 합니다.
Default folder 를 볼 수 있는데요. 우리가 이전에 살펴보았던 것처럼 서블릿은 build\classes 폴더 안에 들어가게 됩니다.
next 를 눌러보면 Context root 가 exam31 로 되어 있는 것을 볼 수 있는데요. 이렇게 설정을 해놓았기 때문에 나중에 웹 브라우저 주소창에 exam31\ten 이 동작할 수 있게 됩니다. 체크박스에 Generate web.xml 라는 것이 보이는데요. 3.0 대 버전의 가장 큰 차이는 web.xml 파일에 직접 등록을 하느냐 아니면 Annotation 을 이용하느냐의 차이라고 했었는데요. 3.0 버전 대의 서블릿은 Annotation 을 이용한다고 배웠습니다. 그래서 Web.xml 이 필수는 아닙니다. 그런데 나중에 Spring 을 이용할 때에는 Servlet 을 3.0 이상의 버전으로 만들었다고 해도 다른 설정 부분을 web.xml 부분에 추가해야 할 필요가 있기 때문에 그 경우에는 반드시 web.xml 을 생성하게 체크를 해주어야합니다. 여기까지 하고 Finish 를 누르면 프로젝트가 생성됩니다.
여기에 서블릿을 만들면 됩니다. URL mapping 부분을 edit 해야겠네요. ten 으로 수정합니다. Finish 하면 다음과 같은 파일이 생성됩니다.
서블릿은 동적으로 응답결과를 만들어낸다고 했었습니다. 동적으로 응답한다는 것은 프로그램의 요청이 들어왔을 때,즉 사용자가 웹 브라우저를 통해 ~ten 이라고 URL 주소를 입력하면 응답할 코드를 만들어내고 그 때 그 코드로 응답을 하게 하는 것입니다. 처음부터 모든 것을 다 이해할 수는 없지만 차차 이해하게 될 것입니다. doGet 메서드가 있는데요. 여기서 주의깊게 봐야하는 점은 HttpServletRequest 와 HttpServletResponse 객체입니다. 사용자의 요청과 서버의 응답이 있는데요. 서버는 사용자의 요청을 받으면 사용자의 요청을 담아내는 객체와 거기에 대응하는 서버의 응답을 담아내는 객체를 자동으로 만들어냅니다. 요청과 응답에 대한 내용이 각각의 객체에 추상화되어 담기게 됩니다. 즉 서버가 어떤 응답을 하기 위해서는 반드시 응답할 내용들을 HttpServletResponse 객체에 담아주어야 하는 것입니다. 이런 이유로 우리가 1부터 10까지 작성하려는 응답을 하려고 한다면 우리는 우선 HttpServletResponse 객체에 우리의 응답을 담아주어야 합니다.
그런데, 클라이언트가 응답을 받았을 때 누군이지 알아야합니다. 알려주는 메서드가 setContentType 메서드입니다. 그래야 브라우저가 응답을 받았을 때 이것이 어떤 것인지 이해할 수 있게 됩니다. 그러니까 이것에 맞게 나는 어떻게 해석해야지라는 판단을 할 수 있습니다. 그래서 우리의 응답에 관한 모든 것이 담기게 되는 HttpServletResponse 객체에 다음과 같은 내용을 담게 됩니다. response.setContentType("text/html;charset=utf-8") 입니다. 이 내용을 이해하자면 다음과 같습니다. text 를 보낼건데 html 입니다. 해당 text 는 utf-8 방식으로 작성했으니 알아두세요. 라는 내용입니다.
웹 브라우저에게 우리의 응답의 형식을 알려주었는데요. 이제 진짜 보낼 내용을 넣어주어야겠죠. 그런데 아무 곳에 넣는 것이 아니라 일단 보낼 내용을 넣어줄 통로를 하나 만들어줘야 합니다. 그래서 response 라는 객체에는 getWriter 라는 메서드가 존재하는데, Printwriter 객체가 반환됩니다. 이 Printwriter 객체를 반환 받았다는 것은 입력을 위한 통로를 받았다는 것을 의미합니다. 이제 우리는 이 Printwriter 객체를 사용해서 우리가 원하는 정보를 출력해주면 됩니다.
Printwriter 를 변수에 담은 다음 print 메서드를 활용해서 우리가 원하는 정보를 브라우저에 출력할 수 있게 됩니다. 여기서 html 의 특징이 하나 드러나는데요. print 메서드와 println 메서드 두 메서드의 화면 출력 차이가 없습니다. html 에서는 줄 바꿈이 <br> 태그로 이루어지기 때문이죠. 아무튼 print 메서드를 활용해서 우리가 출력하고자 하는 html 을 작성해줄 수 있게 됩니다. 일단 제목을 <h1> 태그를 사용해서 작성해주었습니다.
이제 실제로 1부터 10까지 출력해줄 일이 남았는데요. 서블릿은 엄연한 자바 파일입니다. 즉, 자바에서 사용하는 문법을 그대로 사용할 수 있다는 것을 의미합니다. for 구문을 PrintWriter 객체를 반환받은 변수와 함께 사용하여 1부터 10까지 출력해주었습니다.
이제 PrintWriter 객체를 다 사용했으니까 닫아주겠습니다. 저장을 해주고 실행해보겠습니다.
우리가 원하는대로 화면이 출력된 것을 확인할 수 있습니다.
다시 코드로 돌아가보면 우리가 작성하지 않았던 @WebServlet("/ten") 이라는 Annotation 이 추가되어 있는 것을 확인할 수 있습니다. 서블릿 3.0 이상부터는 이런 방식으로 서블릿이 작성됩니다. 만약 해당 페이지의 URL 은 ten 이 아니라 다른 것으로 바꾸고 싶다면 이 Annotation 안의 값을 수정해주면 됩니다.
해당 어노테이션의 값을 ttt 로 수정했더니 실제로 URL 도 바뀐 것을 확인할 수 있습니다. URL mapping 이 뭐냐에 따라서 요청하는 주소값이 달라지는 것을 확인할 수 있습니다.
아까 처음에 지정했던 ten 으로 접속을 시도하면 다음과 같은 404 Response 가 반환되는 것을 볼 수 있습니다. 이렇게 서블릿 3.0 이상 버전에서 서블릿을 작성하는 방법을 알아보았습니다.