본문 바로가기

Programming/Servlet

DAY 105. Servlet - 기본 개념

 

 

서블릿(Servlet)

- Server + Applet : active X같은 자바 진영의 브라우저에서 사용하는 작은 운영 프로그램

 = 서버 쪽에서 사용하는 JAVA 언어의 운영 프로그램

- JAVA 언어를 이용하여 사용자의 요청을 받아 처리하고, 그 결과를 다시 사용자에게 전송하는 역할을 하는 class 파일

즉, 웹에서 동적인 페이지를 JAVA로 구현한 서버 프로그램이다.

확장자가 .java 인 파일

자바의 서블릿 클래스를 상속받은 클래스

 

++

 

- 서블릿이란, 웹 서비스를 위한 자바 클래스를 말하며 자바를 사용해서 웹을 만들기 위한 기술로 javax.servlet.http.HttpServlet 클래스를 상속 받는다.

- java 파일에 웹 페이지 구현을 위한 HTML이 들어간 구조로 클라이언트의 요청을 처리하고 그 결과로 HTML 동적으로 생성하여 클라이언트에게 전송한다.

- 단, HTML 변경 시 servlet을 재 컴파일해야 한다는 단점이 있다.

 

 

[Servlet 설계 규약]

1. 모든 서블릿은 최상위의 javax.servlet.Servlet 인터페이스를 상속 받아서 구현한다.

2. 서블릿 구현 시 Servlet 인터페이스와 ServletConfig인터페이스를 javax.servlet.GenericServlet에 구현한다.

3. HTTP 프로토콜을 사용하는 서블릿인 javax.servlet.http.HttpServlet 클래스는 javax.servlet.GenericServlet을 상속한 클래스로 서블릿은 HttpServlet 클래스를 상속 받는다. (주로 우리는 HttpServlet 클래스만 상속 받고, doGet(), doPost() 메소드만 사용한다. )

4. 서블릿 Exception 처리를 위해서는 javax.servlet.ServletException을 상속 받아야 한다.

 

 

배포 서술자(DD, Deployment Descriptor)

배포 서술자는 Java EE 스펙으로 개발된 웹 애플리케이션의 기본적인 설정을 위해 작성하는 파일이다. (Servlet, Filter 등)

애플리케이션에 대한 전체 설정 정보를 가지고 있는 파일

이 정보를 가지고 있는 웹 컨테이너가 서블릿을 구동한다.

xml 파일로 **요소(태그)**로 이루어져 있다.

애플리케이션 폴더의 WEB-INF 폴더에 web.xml 파일이 배포 서술자이다.

 

<!-- 
  	welcome-file은 
  		- 디렉터리(폴더)에 기본 웹 페이지이다.
  		- 클라이언트가 리소스(html, 서블릿 등)의 이름을 생략하고 디렉터리까지만 지정해서 요청한다면
  		  웹 서버는 해당 디렉터리에서 welcome-file을 찾아서 응답한다.  
   -->
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  
  
  <!-- 서블릿 등록 -->
  <servlet>
  	<servlet-name>내부에서 사용할 서블릿의 이름</servlet-name>
  	<servlet-class>해당하는 이름을 가지는 클래스 파일을 지정</servlet-class>
  </servlet>
  
  <!-- !!! 클래스는 풀패키지 명을 전체 다 작성해야 한다!!! -->
 
 
  <!-- 등록한 서블릿을 주소와 연결 = URL과 매핑(mapping) -->
  <!-- http://localhost:8088/01_Servlet/first.do  
  	http:// 		: 프로토콜(어떤 식으로 데이터를 주고 받을지 요청 프로토콜)
  	localhost:8088  	: 서버에 대한 정보(도메인 포트 번호)
  	01_Servlet		: 톰캣에 올라가 있는 애플리케이션의 명칭(Context)
  	first.do		: 서블릿을 실행시키기 위한 주소
  -->
  
  <servlet-mapping>
  	<servlet-name>내부에서 사용할 서블릿의 이름</servlet-name>
  	<url-pattern>/서블릿을 실행시키기 위한 주소</url-pattern>
  </servlet-mapping>

 

 

 

 

서블릿 매핑(Servlet Mapping)

클라이언트가 servlet에 접근할 때 원본 클래스 명이 아니라 다른 명칭으로 접근할 때 사용한다.

어떤 URL에 대해서 해당하는 서블릿을 활용할지 정해주는 역할

 

  • web.xml
  • @annotation

@WebServlet("/매핑명칭")

 

 

 

Context Path

애플리케이션에 접근하는 경로, 즉 애플리케이션의 root 경로이다.

웹 애플리케이션은 톰캣 위에서 돌아가는 애플리케이션이기 때문에 메인 메소드가 없다.

여러 개의 애플리케이션 하나하나가 Context이다.

(cf. 스프링부트는 내부에 톰캣을 내장하고 있어서 메인 메소드가 필요하다.)

외부에서 톰캣에서 접근하려면 IP포트번호를 알아야 한다.

어떤 Context에 접근할건지는 Context Path를 가지고 알 수 있다.

  • 프로젝트 별칭 = Context Path

 

 


 

서블릿 라이프 사이클

- 서블릿이 객체로 만들어져서 생성 되어서 소멸 될 때까지의 과정을 말한다.

- 사용자가 요청을 보내면 웹 서버가 본인이 처리할 수 없을 때 서블릿 컨테이너에 넘겨준다.

- 이 때, 컨테이너는 요청을 처리할 서블릿 객체가 존재하는 지 확인하고, 없으면 이 때 서블릿 객체를 생성하고 처음 요청한 것에 대해서 init() 메소드를 호출한다.

- 요청을 처리한다.

- 요청을 처리할 때는 service() 메소드가 사용자가 요청한 타입 get or post 에 따라서 어떤 메소드에 요청을 넘겨줄 지 골라서 처리해준다.

- 요청에 대한 응답을 받게 된다고 바로 destroy()가 되는 것은 아니다.

- 또 다시 요청이 오면 이미 생성되어 있는 객체가 있기 때문에 생성 작업을 건너뛰고 어떤 요청인지에 따라서 doGet() 혹은 doPost() 호출하여 응답한다.

- 소멸은 서버를 종료하거나 서블릿에 코드가 변경되어서 재 컴파일이 되면 그때 destroy()가 되고

이미 소멸 된 상태에서 다시 같은 요청이 오면 다시 객체를 생성한다.

 

 

1. 첫 번째 요청 → 객체를 생성한다 → init() 메소드를 호출한다.

2. 작업이 실행 될 때마다 service() 메소드가 요청한 HTTP Type에 따른 doGet() 혹은 doPost() 메소드를 호출한다.

3. 최종적으로 서버가 종료 되었거나, 서블릿의 내용이 변경되어 재 컴파일 될 때 destroy() 메소드가 호출된다.

 

 


 

서블릿 구동

  • request 객체 : 사용자의 요청 메세지의 내용들을 가지고 만들어진 객체
  • response 객체 : 사용자의 요청에 응답해줄 사용자에 대한 정보도 담겨있고, 응답해주는 내용들을 response 객체를 통해 출력해서 클라이언트한테 전달해준다.
  • 스레드 : service() 메소드 단계부터 스레드라고 생각하면 된다. 요청에 따라 처리하는 내용을 스레드 단위로 만들어서 처리한다. service() 메소드를 호출한다.

 

 

🎄페이지를 로드할 때 직접 index.html 파일은 연 것이 아니라 브라우저에서 톰캣에게 요청해서 프로그램의 .html 파일을 받아온 것이다(응답을 받은 것)!

 

 

📌 01. What is localhost?

여러 대 PC가 있다고 가정하면, 각각의 PC당 고유 IP를 가지고 있는데, 서버 역시 IP를 가지고 있다.

서버의 IP 주소를 알아야 네트워크 상에 연결된 컴퓨터에 접근할 수 있다.

IP로 직접 접근해도 되지만, 보통은 도메인 서버를 이용한다. (도메인이 없을 때는 IP로 직접 접근한다.)

본인 IP:포트번호/Context

보통은 도메인 네임 서비스(ex. www.naver.com) 에 요청해서 도메인에 해당하는 IP를 알아내서 접속한다.

이 때, 도메인을 태우기 전에 hosts (in windows>system32>drivers>etc>hosts파일) 를 확인해서 그 안에 적힌 지정된 IP와 도메인을 확인하고 연결한다.

즉, **localhost : 본인 PC의 IP**

결과적으로 localhost를 입력하는 것이 본인 IP:포트번호/Context 와 같다.

 

 

📌 02. What is PortNumber?

톰캣 서버와 함께 여러 개의 서버 프로그램이 동시에 실행될 수 있다.

외부에서 컴퓨터에 있는 서비스를 요청할 때, 컴퓨터 안에 여러 프로그램을 구분해주는 값이 바로 포트 넘버이다.

따라서 포트 넘버는 겹치면 안된다.

(보통, 프로토콜이 http: 주소 뒤에 8080 포트 넘버는 생략 가능 | https: 는 주소 뒤에 443 포트 넘버가 생략 가능)

 

 

[서버에서 서블릿을 실행시키는 방법]

1. 서블릿 클래스를 작성한다.

  • javax.servlet.http.HttpServlet을 상속하는 클래스를 생성한다.
  • doGet(), doPost() 메소드를 재정의한다.

 

2. 서블릿을 등록 및 URL을 매핑한다.

  • 방법 1> web.xml에 작성한 서블릿을 등록 및 URL을 매핑한다.
  • 방법 2> @WebServlet으로 서블릿을 등록 및 URL을 매핑한다.

→ 즉, 클래스만 만든다고 사용자 요청을 바로 처리하는 것이 아니라, 서블릿을 컨테이너에 등록하고 서블릿이 어떤 URL로 요청이 왔을 때 처리할지 매핑을 해야한다.

 

 

 

📌 03. What is HTTP 프로토콜?

- 사용자가 웹 서버에 데이터에 요청을 하고 응답을 받을 때는 http 라는 프로토콜을 사용한다. (요청하고 데이터를 응답 받는 걸 정해진 규약에 따라서 데이터를 주고 받는 통신규약)

- HTTP 프로토콜은

 : 요청할 때 = request,

 : 서버가 요청에 대해서 처리하고 응답하는 것을 = response라고 한다.

- 클라이언트에서 서버로 요청을 보낼 때, 요청 메시지를 만들어서 보내고, 응답할 때도 응답 메세지를 만들어서 보낸다.

- 1) 브라우저에서 웹 서버로 요청할 때는 HTTP 리퀘스트 메시지를 만들어서 보내고,

  2) 서버에서는 응답 요청 받은 HTTP인지 정상적인 요청 메시지인지 확인하고 처리하고 나서 응답을 보낼 때에도 응답 메시지를 만들어서 보내고,

 3) 다시 브라우저에서 응답 메시지를 보면서 처리가 잘 되었는지 확인하는 형식이다.

- HTTP 메시지들은 3가지 정도로 나뉜다.

  - 시작 라인 : 요청인지 응답인지 구분, 요청할 때 어느 URL로 요청하는지 기본 적인 내용들을 담고 있다.

  - 헤더 : 서버에 대한 정보, 브라우저에 대한 정보, 날짜 등을 담고 있다. 요청 헤더와 응답 헤더가 다르다.

  - 본문(body) : 데이터들이 담겨있다. 응답된 내용들이 적힌 <HTML> <태그>들이 담긴다.

 

 

 

 

사용자 데이터 전송 방식

✔️ get 방식

  • GET 방식은 URL에 데이터를 포함시켜 요청하는 것으로 보안 유지가 불가능하다.
  • 따라서 로그인 같은 경우는 GET 방식은 부적합하다.
  • GET 방식에서 데이터를 Header에 포함하여 전송하고 Body는 빈 상태로 전송되며 Header의 내용 중에 body의 데이터를 설명하는 content-type 헤더도 포함되지 않는다.
  • 데이터 전송 길이 제한이 있다.

 

✔️ post 방식

  • POST 방식은 데이터를 노출하지 않고 요청하는 것으로 보안 유지가 가능하다.
  • 데이터를 Body에 포함하여 전송하고 body의 데이터를 설명하는 content-type 헤더가 포함된다. (데이터가 어떤 타입인지 명시가 된다.)
  • 데이터 전송 길이 제한이 없다.