클라이언트/ 서버/ 엔지니어 " 게임 개발자"를 향한 매일의 공부일지

서블릿의 기초 5 - 서블릿 프로젝트 만들며 서블릿의 과정 익히기 본문

웹 · 앱 개발/JSP & Servlet

서블릿의 기초 5 - 서블릿 프로젝트 만들며 서블릿의 과정 익히기

huenuri 2024. 8. 24. 10:25

어제 저녁에 공부를 조금 했고 다음날 아침에 일어나서 서블릿 공부를 이어서 해보는 중이다. Hello Servlet을 출력하기 위한 서블릿 클래스를 만들어보겠다.


 

 

 

Dynamic Web Project로 서블릿 만들기

 

포트 번호 옆에 Servlet이라고 표시된 부분은 컨텍스트 패스라고 한다. 웹 서버에서 제공하는 다양한 웹 애플리케이션을 구분하기 위해 사용하는 것이다. 예를 들어 병원 관리를 위한 웹 애플리케이션을 위한 병원 관리 프로젝트를 hospital이란 이름으로 이클립스에서 생성하면 이 이름의 컨텍스트 패스가 추가된다.

이클립스를 사용하지 않고 웹 애플리케이션을 개발할 때는 일일이 <Context> 태그를 개발자가 기술해야 했지만 이클립스튼 컨텍스트 패스를 프로젝트 단위로 자동 생성해준다.

 

톰캣 서버의 환경 설정을 위한 server.xml 파일을 열어보면 이클립스에서 자동으로 추가해주는 컨텍스트 패스를 확인할 수 있다.


 

 

 

 

과정별 개념 설명

 

1. @WebServlet 어노테이션으로 URL 매핑

URL 매핑을 보다 쉽게 자바 클래스에서 절정할 수 있도록 제공되는 어노테이션이다. 

 

어노테이션(Anotation)

어노테이션은 문장이나 문서에 추가적인 정보를 기입하는 것을 말한다. 자바 프로그램에 영향을 주는 것이 아니라 컴파일할 때 환경 설정을 변경해 줄 것을 알려주는 주석 형태를 말한다. 이전에는 환경설정을 XML 파일에서 직접 해왔다. 어노테이션 등장 덕분에 개발 시간이 단축되었다.

 

URL 매핑이란 서블렛을 동작시키기 위해서 실제 자바 클래스명(HelloServlet)을 사용하는 대신 서블렛을 요청하기 위한 문자열(hello)을 서블릿 클래스와 매핑시키는 것을 말한다. URL 매핑을 하는 이유는 뭘까? 실제 서블릿 클래스를 공개하지 않기 위해서이다 실제 호출되는 서블렛 클래스가 아닌 매핑된 URL인 hello로 접근한다.

서블릿 클래스를 요청하기 위해서 브라우저의 주소 입력란에 서블릿 클래스 이름 대신 URL 파잉으로 지정한 이름을 입력하여 호출하기 위한 설정이다.

 

 

hello로 요청하면 HelloServlet 클래스가 요청받는다

 


 

 

 

 

 

2. 서블릿 클래스 정의하기

서블릿 클래스를 정의하는 것은 정형화되어 있다. 새롭게 서블릿 클래스를 정의하기 위해서는 javax.servlet.http 패키지에서 제공하는 HttpServlet 클래스를 상속받아 구현해야 하고 브라우저를 통해 외부에서 실행되기 때문에 접근 제한자는 반드시 public이어야 한다.

 

 

서블릿이 정형화되어 있다는 말은 자바 클래스에서 사용하던 상속이란 개념을 그대로 사용하는데, 자바 클래스에서는 어떤 클래스의 상속을 받아도 된다. 하지만 서블릿 클래스는 HttpServlet 클래스의 상속만을 받아야 하는 것으로 정해져 있다는 것을 말한다.


 

 

 

 

3. 요청 메소드

요청 방식에 따라 doGet() 또는 doPost()가 호출도기 때문에 요청 방식에 맞추어 HttpServlet 클래스의 doGet() 혹은 doPost()를 오버라이딩해야 한다. 이 메소드는 요청이 되면 호출되기 때문에 요청메소스라고 부르기도 한다.

 

 

하나의 서블릿이라도 get과 post 방식에 따라 서로 다른 기능을 제공해야 하는 경우도 있기 때문에 그럴 경우에는 doGet()과 doPost()를 모두 오버라이딩해야 한다.


 

 

 

 

4. 응답 객체에 콘텐트 타입 지정하기

HttpServletResponse 객체인 response로 setContentType() 메소드를 호출하여 클라이언트에게 응답할 페이지에 대한 환경 설정을 결정해 주어야 한다. 응답 방식이 "text/html"로 지정되어 있으므로 text나 html로 보여주겠다는 의미이다.

 

출력할 내용이 한글일 경우 인코딩 방식을 지정하지 않으면 한글이 깨지는 현상이 나타난다.

 

 

한글이 깨지지 않도록 하기 위해서는 인코딩을 "UTF-8"로 지정해야 한다.

 


 

 

 

 

5. 출력 스트림 얻어오기

response.setContentType() 문장은 결과로 출력되는 HTML 문서의 인코딩 방식을 지정해주는 문장이다. 한글이 깨지지 않도록 response.setContentType() 메소드에 캐릭터 셋을 UTF-8로 지정해 주어야 한다.

response 객체의 인코딩 형태를 바꿔준 후에는 결과 출력을 위해 출력 스트림을 얻어오는 response.getWriter() 메소드를 호출해야 한다. 순서가 바뀌면 인코딩 방식이 지정되지 않은 response 객체에서 출력 스트림을 얻게 된다. 따라서 반드시 response.setContentType() 문장이 먼저 실행한 후에 response.getWriter() 메소드로 출력 스트림 객체를 얻어와야 한다.

 

스트림이란?

데이터는 메모리에 저장된다. 사용자가 입력한 데이터를 메모리에 저장하는 과정을 입력이라 하고, 메모리에 저장된 데이터를 사용자가 볼 수 있도록 하는 과정을 출력이라고 한다. 입출력 과정이 가능하도록 하는 객체를 자바에서는 스트림이라고 한다.

 

 


 

 

 

 

6. 클라이언트에게 HTML 문서 형태로 결과 출력하기

PrintWriter 객체인 out의 출력 메소드인 println()을 통해 결과를 사용자에게 출력할 수 있다. 사용자에게 전송된 내용은 브라우저를 통해 출력되기 때문에 결과를 HTML 태그 형태로 만들어서 보내야 한다.

 


 

 

학습을 마치고

이론 공부는 정말 지루해서 하기가 싫었지만 그래도 끝까지 마칠 수 있어서 감사했다.