이미지 - 스타터스 취업 부트캠프(STARTERS) 공식 블로그

7주차 학습 내용을 정리합니다.
이번주는 Servlet과 JSP에 대해서 학습하였습니다.
CGI(Common Gateway Interface)

  CGI는 웹 서버(Apache, NginX)와 사용자가 작성한 프로그램 사이의 규약, 인터페이스이다. 초기 웹 서버는 모든 사용자에게 동일한 정적인 데이터(HTML, XML, 이미지 등)만을 제공할 수 있는 정적인 웹서버였다. 하지만 웹이 발전하고 사용자들의 요구가 점차 복잡해지면서, 사용자별로 데이터를 입력받고 처리할 수 있는 동적인 웹 서버가 필요하게 되었다. 사용자로부터 입력받은 데이터를 저장하고 처리하기 위해서는 웹 서버가 외부 프로그램과 통신할 수 있어야 하는데, 이러한 연계법을 정해놓은 것이 CGI이다. 

    CGI는 크게 두가지 문제점을 가지고 있었는데,

  • 요청이 들어올 때마다 '프로세스'를 생성하여 처리하므로 서버에 부하가 쉽게 걸린다.
  • 동일한 CGI 구현체(프로그램)를 사용하더라도 요청(request)이 다르다면 여러 개의 CGI 구현체가 각각 생성된다. 

이러한 CGI의 문제점을 보완하고 성능을 개선하여 Java Servlet이 등장하게 되었다.

 

Servlet

 Servlet은 웹 어플리케이션을 만들 때 사용되는 자바 인터페이스이다. Servlet은 동적 웹 어플리케이션 컴포넌트로, Apache Tomcat이라는 웹 컨테이너 위에서 동작한다. Servlet을 통해 자바 언어로 CGI 프로그래밍을 할 수 있으며, Thread Pool 객체를 이용해 요청에 대해 제한된 개수만큼의 쓰레드를 생성하여 서버의 부하를 줄인다. 아래 그림처럼 Servlet으로 생성한 자바 클래스는 기본적으로 HttpServlet 클래스를 확장한다. 

IDE에서 Servlet을 생성하면 자동으로 제공되는 초기 템플릿
HttpServlet클래스 상속 계층도

  GenericServlet은 추상클래스로 Servlet 인터페이스와 ServletConfig 인터페이스를 구현한다. Servlet 인터페이스 내부에는 init(), destroy()와 같은 추상메서드들이 선언되어 있고, ServletConfig 인터페이스에는 파라미터와 컨텍스트와 관련된 추상 메서드들이 선언되어 있다. HttpServlet은 이러한 GenericServlet 추상클래스를 상속받아서 확장한 클래스이기 때문에 GenericServlet에서 정의된 메서드들을 오버라이딩하여 사용해야 한다.

   

Servlet Lifecycle

  클라이언트에서 요청이 들어오면, 서버에서는 Servlet 컨테이너 안에 쓰레드와 Servlet 객체를 생성한다. 최초 요청 시에만 Servlet 객체를 새로 생성(= Heap 메모리 위에 load)하고 init() 메서드를 호출한다. 이후 요청에 대해서는 이미 생성된 Servlet 객체를 재활용하기 때문에 init() 메서드를 호출하지 않는다. 이후 service() 메서드가 호출되어 doGet() 또는 doPost() 메서드가 실행되고, 해당 메서드 내부에서 로직을 통해 요청을 처리한다. (이들은 요청이 들어올 때마다 매번 호출되는 메서드들이다) 그리고 마지막으로 destroy() 메서드가 호출되면서 서버가 종료된다.

 

Servlet Mapping

 Servlet을 생성할 때 반드시 필요한 과정 중 하나로 '맵핑(Mapping)'이 있다. Servlet 클래스와 클라이언트가 사용하게 될 요청 URL을 연결하는 작업이다. 직접적인 파일명과 프로젝트 구조의 노출을 방지하고, 사용자가 사용하기 쉽도록 경로를 간단하게 축약한다.

  Servlet Mapping에는 두 가지 방법이 존재한다. 첫 번째는 독립적인 web.xml 파일에 맵핑 정보를 입력하는 방법이고, 두 번째는 Servlet 파일 내부에 어노테이션(@WebServlet)으로 맵핑명을 지정하는 방법이다. 첫 번째 방법은 web.xml이라는 별도의 파일을 열고 각종 태그를 사용하여 여러 정보를 기입해야 하므로 다소 번거롭다는 단점이 있다. 하지만 독립된 파일로 관리하기 때문에 유지보수 면에서 유리하고(URL 정보가 수정된다고 하더라도 다시 컴파일하여 배포할 필요가 없음), 어노테이션 방법과 동시에 사용하면 더 높은 우선순위를 가지고 있기 때문에 web.xml에 기록된 맵핑 정보를 바탕으로 서버가 요청을 처리한다. 따라서 규모가 큰 프로젝트에서는 web.xml을 사용한 URL Mapping을 권장한다.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>Practice_Chap02_Servlet-1</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.jsp</welcome-file>
    <welcome-file>default.htm</welcome-file>
  </welcome-file-list>
  
  <!-- 1.매핑해야 될 서블릿 파일을 지정함 -->
	<servlet>
		<servlet-name>HelloWorld</servlet-name> <!-- 매핑할 이름(=닉네임) -->
		<servlet-class>sec01_exam.HelloWorld</servlet-class> <!-- 파일 경로명(=패키지명.클래스네임) -->
	</servlet>
  
  <!-- 위에서 작성한 매핑될 서블릿 파일을 url-pattern 태그를 이용하여 url창에 표식이 되도록 함 -->
  <!-- servlet-name : 위에서 서블릿 네임으로 지정한 값과 동일하게 입력해줘야 함! -->
  <servlet-mapping>
  	<servlet-name>HelloWorld</servlet-name> <!-- 위에서 지정한 매핑 이름(=닉네임)과 동일해야 함!! -->
  	<url-pattern>/hw</url-pattern>
  </servlet-mapping>
  
</web-app>

  반면 두 번째 방법은 Servlet 클래스를 생성할 때 어노테이션만을 사용해서 바로 지정해줄 수 있으므로 상대적으로 간편한 방법이다. 하지만 배포 이후에 URL 수정이 필요하게 되면 소스코드를 직접 수정해야 하기 때문에 컴파일 작업과 재배포 작업이 필수적이다. 그렇기 때문에 어노테이션을 이용한 URL Mapping 방법은 상대적으로 규모가 작고, 많은 수정이 필요하지 않은 파일에 주로 사용된다.

@WebServlet("/NowTime")
public class NowTime extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	}

}

 

 

참고

  • JSP 기초에서 실무까지 완전정복, 아이티고, 유데미강의
  • 자바 웹을 다루는 기술,  길벗, 이병승
  • [10분 테코톡] 타미의 Servlet vs Spring, 유튜브
  • [JSP/Servlet] CGI 그리고 Servlet과 JSP와의 관계, 네이버 블로그
  • 공용 게이트웨이 인터페이스, 위키백과
  • [JSP Servlet] doGet / doPost / Servlet 기본 원리 / 한글 처리, 티스토리 블로그

* 유데미 바로가기 : https://bit.ly/3V220ri

* STARTERS 취업 부트캠프 공식 블로그 보러가기 : https://blog.naver.com/udemy-wjtb

본 후기는 유데미-웅진씽크빅 취업 부트캠프 3기 백엔드 과정 학습 일지 리뷰로 작성되었습니다.

+ Recent posts