Web/Servlet

01. 웹 프로그래밍

  • -
반응형

이번 포스트에서는 웹 프로그래밍이란 무엇인지 주요 특성에 대해 살펴보고 자바 기반의 웹 프로그래밍 개요에 대해 살펴보자.

 

웹 프로그래밍

 

웹 프로그램이란?

웹 프로그램이란 HTTP(Hyper Text Transfer Protocol) 통신 규약에 따라 서버와 클라이언트 컴퓨터 간 데이터를 주고받는 네트워크 기반 프로그램으로 통상 원격지의 서버에서 실행되는 프로그램을 말한다.

웹 프로그램의 기본 구조

전통적으로 웹 프로그램의 클라이언트는 브라우저를 이야기한다. 브라우저에서는 일정 형식의 요청(request)를 생성해서 HTTP 프로토콜을 통해 원격지의 서버에 요청하게 되고 서버는 응답을 생성해서 html 형태로 응답(response)을 만들어 클라이언트에게 전달하면 브라우저가 이를 해석해서 화면에 보여주는 형태로 동작한다.

이런 서버 프로그램을 작성하는 방식은 언어에 따라 여러 형태가 가능한데 자바 진영에서는 Servlet기반으로 작성된다.

 

웹 서버의 구성

일반적으로 웹 서버는 용도에 따라 여러개의 티어로 구성된다.

웹 서버의 구성

  • 웹 서버: 클라이언트의 요청을 받고 응답을 전달하는 역할을 수행하는데 주로 HTML, IMAGE , CSS, JS등 정적인 리소스에 대한 처리를 담당한다. 따라서 동일한 요청이 들어오면 언제나 동일한 응답만 처리하게 된다.
  • 웹 애플리케이션 서버(WAS): 웹 애플리케이션 서버는 웹 서버로부터 사용자의 동적인 요청을 위임받아서 처리하는 서버이다. 우리가 일반적으로 웹 프로그램을 사용하는 대부분의 행위가 이뤄지는 부분이라고 생각할 수 있고 통상 백엔드 프로그램이 동작하는 서버이다. 따라서 앞으로 "서버"라고 이야기하면 WAS로 이해해도 거의 무방하다. WAS의 가장 대표적인 녀석으로는 무료로 사용하는 아파치의 톰켓이 있다. 소규모의 사이트들의 경우는 굳이 웹서버를 따로 두지 않고 WAS에서 정적인 요청과 동적인 요청을 모두 처리하는 형태로 가기도 한다.
  • DB 서버: 웹 애플리케이션이 필요한 자료를 저장하기 위한 영역으로 Oracle, Mysql 등이 사용된다.

 

Servlet과 동작 방식

Servlet이란 Server + applet(applecation + let)으로 WAS에서 실행되는 작은 java의 컴포넌트 정도로 해석될 수 있다. 웹 애플리케이션은 일반 stand alone 애플리케이션과 달리 이런 Servlet 객체의 생성 및 라이프사이클 전반에 대한 관리를 WAS가 담당하게 된다. 따라서 WAS를 서블릿 컨테이너(Servlet Container)라고도 부르게 된다.

다음은 WAS에서 Servlet이 동작하는 절차를 보여준다.

Servlet의 동작 절차

  1. 서블릿은 GuguServlet과 같은 Servlet의 라이프 사이클을 관리하며 동작한다.
  2. 브라우저에서 WAS에 특정 데이터를 요청한다. 요청은 HTTP 프로토콜을 통해 서버로 전달된다.
  3. WAS는 사용자의 요청과 응답을 처리하기 위해 HttpServletRequest와 HttpServletResponse객체를 생성해서 Servlet을 호출한다.
  4. 서블릿에서는 요청을 동적으로 처리해서 응답을 생성한다
  5. 생성된 응답을 HTTP 프로토콜을 통해 클라이언트로 전달하면 브라우저가 HTML을 해석해서 화면에 출력한다.

 

Simple Servlet Programming

 

프로젝트 생성 및 환경 구성

Eclipse(STS)를 통해서 Servlet 프로그래밍을 하기 위해서는 Dynamic Web Project를 생성하면 된다.

create > new > Dynamic Web Project 생성

만약 Dynamic Web Project를 생성하는 메뉴가 출력되지 않으면 를 마켓 플레이스에서 검색해서 설치하고 다시 시작해 보자.

Eclipse Enterprise Java and Web Developer Tools

[New Dynamic Web Project] 화면에 Target runtime을 입력하는 부분이 있는데 이 부분이 바로 WAS를 설정하는 부분이다. 아직 아무런 WAS가 설정되지 않았다면 [New Runtime]을 클릭해서 새로운 WAS를 등록한다. 안정성을 위해 Tomcat 10.0을 선택해 주자.

Next를 클릭하다 보면 Web Module에 대한 설정 화면이 나오는데 Context root를 눈여겨봐두자. 

contextWAS에서 실행되는 개별 애플리케이션이라고 볼 수 있는데 Context Root는 그 애플리케이션의 root 경로 즉 WAS에 있는 여러 웹 애플리케이션 중 해당 앱을 접근하기 위한 경로가 된다. 여기서는 그 이름을 example로 변경해보자.

 

Servlet 생성

일반적으로 Servlet을 생성할 때는 HttpServlet을 상속받아서 생성한다. 새로운 Servlet을 생성할 때에는 [new]-[Servlet] 메뉴를 사용하면 Superclass가 자동으로 설정되므로 java package와 Class name만 기입해 주면 된다.

 

다음 화면에서 Servlet에 대한 상세 설정을 할 수 있는데 가장 중요한 것은 URL mappings 정보이다.  URL 작성 시 중요한 점은 맨 처음 문자는 "/"로 시작해야 한다는 점이다. 이렇게 생성된 경로는 서버주소:포트번호/context_root/url_mapping 형태로 완성된다. 

 

마지막으로 필요한 메서드를 재정의 하면 되는데 일반적으로 재정의 가능한 메서드를 선택할 수 있도록 가이드된다.

많은 메서드가 있지만 여기서는 doGet 만 체크하고 넘어가자. doGet은 get방식으로 서블릿이 호출될 때 동작하는 메서드이다.

참고로 서블릿을 호출할 때는 get/post 방식으로 호출할 수 있는데 두 방식의 특징은 다음과 같다.

  Get Post
상황
주소창에 직접 경로명을 입력하고 요청하는 경우
<a> 링크를 통해 요청하는 경우
form 태그에서 get 방식으로 전달할 경우
특별한 지정이 없는 경우 default
form 태그에서 post 방식으로 전달하는 경우
파라미터 전달
주소 창의 query string으로 전달
www.google.co.kr?page=1&q=today
요청 헤더의 바디에 포함되어 전달
데이터 양
255자 이하의 적은 데이터만 전송 가능
용량에 제한이 없음
용도
request의 처리가 서버에 아무런 영향을 주지 않을 경우 - 단순 조회
데이터가 포함된 request 자체를 bookmark로 사용하고 싶을 때
request의 처리가 서버의 상태에 영향을 줄 경우 - 자료의 수정, 삭제, 추가
비밀번호와 같이 URL상에 보이지 말아야 할 자료를 전송할 경우
보안성
데이터가 노출될 수 있어 보안에 취약
데이터가 노출되지 않고 보안에 강함(암호화는 아님)

생성된 servlet을 다음과 같이 살짝 수정해 보자.

public class HomeServlet extends HttpServlet {
  private static final long serialVersionUID = 1L;
  
  protected void doGet(HttpServletRequest request, HttpServletResponse response) 
                                                 throws ServletException, IOException {
    // 요청: 파라미터 확인
    String name = request.getParameter("name");
    // 응답 설정
    response.setContentType("text/html;charset=utf-8");
    String html = """
                <html>
                  <body>
                    <h1>Welcome to %s's Home!!
                  </body>
                </html>
                """.formatted(name);
    // 응답 처리
    response.getWriter().print(html);
  }
}

 

web.xml

서블릿은 잘 작성되었는데 앞서 설정한 url mapping 경로가 보이지 않는다. 이 정보는 src/main/webapp/WEB-INF/web.xml이라는 배포 관리자(deployment descriptor) 파일에 작성되어 있다. 파일을 분석해 보면 <servlet>을 통해 실제 서블릿을 등록하고 <servlet-mapping>을 통해 그 서블릿에 접근하기 위한 url-pattern을 지정하고 있음을 알 수 있다.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xmlns="https://jakarta.ee/xml/ns/jakartaee" 
         xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee 
                             https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd" 
         version="5.0">
  <servlet>
    <description></description>
    <display-name>HomeServlet</display-name>
    <servlet-name>HomeServlet</servlet-name>
    <servlet-class>com.quietjun.example.controller.HomeServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>HomeServlet</servlet-name>
    <url-pattern>/home</url-pattern>
  </servlet-mapping>
</web-app>
이 파일은 Servlet 3.0이 도입되면서 @WebServlet을 이용한 Annotation 방식이 적용되면서 거의 없어지는 듯했는데 Servlet 5.0에서는 또 기본으로 사용되고 있다.  각 방법의 장/단점이 존재하지만 동작은 동일하므로 여기서는 그냥 xml을 사용하자.

 

실행해 보기

이제 프로젝트를 오른 클릭해서 [Run as] - [Run on Server]를 차례로 선택해 주자.

그럼 Servers 탭의 Tomcat 서버에 방금 작성한 애플리케이션이 배포된 것을 확인할 수 있다.

서버에 애플리케이션이 배포된 모습

그리고 브라우저를 통해 방금 작성한 Servlet이 실행되는데 name 파라미터를 넘겨주지 않았기 때문에 Welcome to null's Home!!이라고 출력된다. get 방식이므로 주소창의 주소를 localhost:8080/example/home?name=홍길동 이라고 수정 후 엔터를 입력해 다시 요청해 보자.

정상적으로 파라미터가 전달되고 출력된 모습

이로써 간단히 Servlet이 동작하는 모습을 살펴보았다. 다음 포스트에서는 좀 더 상세한 Servlet의 모습을 살펴보자.

 

반응형

'Web > Servlet' 카테고리의 다른 글

꼭 알아둬야 할 HTTP  (0) 2024.03.05
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.