Servlet - 서블릿 튜토리얼

스프링을 공부하다가 모호한 부분이 많아서 시작하게된 공부이다.

스프링 기반기술이 서블릿인데 사실 자바 언어를 사용하며 웹 애플리케이션을 개발하기 위해서는 반드시 서블릿을 사용할 수 밖에 없다. 웹 애플리케이션을 개발하기 위해서는 Http로 통신하는 애플리케이션을 개발해야하는데 서블릿은 HttpServlet 클래스를 상속받아서 Http 프로토콜로 요청과 응답을 구현하는, WAS에서 동작하는 클래스이기 때문이다.

요즘은 개발자가 직접 서블릿을 생성할 필요가 없는데 스프링 프레임워크와 스프링부트처럼 간단하게 웹 개발할 수 있는 프레임워크가 존재하기 때문이다. 그러나 개발자가 직접 생성하지 않을뿐이지 결국 이런 자바 기반의 웹 개발 프레임워크 모두 서블릿 기반의 프레임워크라는 사실을 잊어서는 안된다.

서블릿은 WAS에서 동작하는 자바 클래스이다.


Servlet 만들어보기

프로젝트(Dynamic Web Project) 생성하기

서블릿은 정적 웹(Static Web)이 아닌 동적인 웹(Dynamic Web)을 위해 탄생한 기술이다. 따라서 이클립스에서 [File] - [New] - [Other] 를 클릭하고, [Dynamic Web Project] 선택한다.

앞서 서블릿은 WAS에서 작동하는 자바 클래스라고 했다. 따라서 설정할때 어디서 실행될지(Terget runtime)를 정해야한다. 필자는 Apache Tomcat 9.0을 WAS로 지정했다. 이렇게 WAS를 지정하고, Next로 넘어간다.


서블릿 클래스 생성하기

프로젝트가 생성되었으니 이제 프로젝트에서 서블릿 클래스를 생성할 차례이다. src 디렉토리 하위에 패키지를 하나 생성하고(생성하지 않아도 상관은 없다. default package가 생성될 것이다.) 생성된 패키지 하위에 [New] - [Web] - [Servlet] 을 선택해서 서블릿 클래스를 생성한다.


서블릿 클래스 작성하기

서블릿 클래스를 생성하면, 자동으로 doGet(), doPost() 가 완성된 클래스 파일이 생성된다. 현 상태로도 브라우저에서 화면을 출력할 수 있지만, 상징적인 의미로 Hello World를 찍어보겠다.

서블릿의 동작원리는 다음과 같다.

  1. java 코드를 작성하고, Run on Server를 실행하면,

  2. IDE(Eclipse)에서 java코드를 class코드로 컴파일.

  3. 컴파일한 코드를 톰캣(서블릿 컨테이너)에서 서블릿 규칙에 따라 코드를 실행하고 결과를 서버에 전달.

  4. 전달받은 서버는 클라이언트로부터 정해진 요청(HttpServletRequest)이 들어올 경우, 해당 요청에 맞는 응답(HttpServletResponse)을 HTTP 프로토콜을 통해 브라우저로 전송한다.

따라서 doGet() 에 코드를 작성해보겠다.

전체 코드 보기

1
2
3
4
5
6
7
8
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
PrintWriter out = response.getWriter();
out.println("<h1>Hello World</h1>");
out.println("My <span style=\"color: red;\">First</span> Servlet!");

response.getWriter().append("Served at: ").append(request.getContextPath());
}

그리고 서버를 실행하면, 브라우저가 자동으로 실행되며 다음과 같은 화면을 뿌려줄 것이다. 서버를 실행할 때 어떤 서버에서 실행할지 실행환경을, 즉 WAS를 물어보는데 이 때 서버를 선택하고 Next로 넘어가면 된다. 아래 Always user thie server 라는 체크박스를 체크하면, 다음부터 서블릿을 실행하면 자동으로 해당 WAS로 서블릿을 실행하게 된다.

만약 브라우저가 안열린다면 이클립스의 Preference에서 browser 설정을 다음처럼 바꿔준다.

클라이언트로부터 요청을 받아야 서버가 응답을 한다고 했는데, 어떤 요청을 했길래 웹 서버가 자동으로 결과를 뿌려준걸까? 여기서 요청은 웹 브라우저 주소창에 있는 URL이 요청에 해당한다.

이클립스로 실행한 톰캣 서버에 아래의 URL을 요청하여 페이지를 반환받은 것이다.

1
http://localhost:8080/{URI (include server-name)}

각각의 의미는 어떻게 될까? 여기부터는 아래의 글을 참고바란다.

URI에 server-name이 포함되어 있는데, 이 server-name은 무엇을 의미하는걸까?

이클립스의 Servers 탭에서 서버를 더블클릭한다. (이미지에서 표기한 Servers탭 말고 해당 탭에 있는 로컬서버를 클릭하셔야한다.)

그리고 서버 환경설정 화면이 나오면, 하단 메뉴에서 Modules를 클릭한다.

그럼 위와 같이 Web Modules에서 현재 서버의 Path를 볼 수 있다. 이 Path가 우리가 서블릿으로 만든 웹서버에 접속할 수 있는 요청을 할 URL에 포함시켜야할 주소이다.

간단하게 서블릿 작업만 하고 싶다면, 위의 Path를 그냥 / 로 바꾸는게 편할 수 있다.

위의 주소로 입력하면, 내장 톰캣 서버가 해당 요청에 맞는 응답을 클라이언트로 response하는 건데, 이 과정은 다음과 같다.

서블릿 클래스에서@WebServlet("/HelloServlet") 이라는 어노테이션을 작성하면, 어노테이션의 파라미터로 들어간 URI(“/HelloServlet”)로 접속을 하면, 서블릿 클래스에 작성된 로직이 실행되는 것이다. 그리고 이 서블릿 클래스 중에서도 doGet()에 작성된 로직이 웹 서버에 요청되면서 아까 PrinterWriter 객체로 작성한 html 코드가 브라우저로 반환된 것이다.


파라미터 담아서 요청하기

URL에 파라미터를 붙여서 요청할 수도 있다. 요청할 URL에 ?를 붙이고 파라미터 이름과 파라미터 값을 추가하면 된다.

1
http://localhost:8080/{server-name}/{annotation}?{parameter1}={value1}&{parameter2}={value2}

이렇게 브라우저 주소창에 입력한 파라미터를 웹서버에서 요청받고, 응답하려면 서블릿 클래스에도 파라미터를 받아줄 코드를 작성해주어야 한다.

doGet()에서 HttpServletRequest 객체의 getParameter()를 이용하면 URI로 넘어오는 인자값을 서버에서 받아서 처리할 수 있게 된다.

1
2
String name = request.getParameter("name");
out.printWriter("Hello, "+name);

그럼 이렇게 요청받은 인자값을 서버에서 받아서 다시 화면에 출력한 걸 확인할 수 있다.


다음 포스트에서는 이 간단한 실습때 사용했던 서블릿의 개념들에 대해 조금 더 알아보자.
다음 포스트 읽으러 가기