본문 바로가기
멀티캠퍼스 풀스택 과정/백엔드

백엔드2-1. Servlet-1 Servlet기초와예제, HttpServlet, web-xml, url(get,post방식)

by 이쟝 2022. 3. 5.

Servlet(Server Application Let)

Dynamic Web Page를 만들 때 사용되는 자바 기반의 웹 애플리케이션 프로그래밍 기술

즉, 자바 웹 서버로 웹 페이지를 제공할 때, 동적인 데이터를 제공하는 것을 도와준다.

HTTP 프로토콜 서비스를 지원하는 javax.servlet.http.HttpServlet 클래스를 상속받는다!!

 

JSP Servlet
HTML 코드에 Java언어를 삽입해 동적 문서를 만들 수 있다. Java언어를 이용해 문서를 작성하고 출력객체를 통해 HTML 코드를 삽입한다.

 

 

Servlet을 사용하는 대표적인 웹 서버는 톰캣(Tomcat) (아파치는 WAS)

Servlet이 JAVA언어로 작성되기 때문에 톰캣은 JDK가 설치된 환경에서 작동한다. 저장된 Servlet은 JDK에 의해 필요할 때마다(request) 사용된다.(response) -> JAVA의 필요한 기능만 사용하는 클래스 개념을 웹 서버에 적용해 만든 것이 Servlet이다.

Tomcat서버에는 실제로 Servlet이 .class파일로 저장되어 있다. 

서버는 Cilent의 요청에 반응하기 위해 만들어졌다. (요청에 따라 Data를 가공해서 반응하는 역할)
로그인 요청, 검색 요청, 각종 버튼 요청 등등 수많은 요청이 있다. 이런 요청을 커버하기 위해, 모든 코드를 메모리에 적재시킨다면 엄청난 비효율을 초래한다.

그래서 요청에 따라 그에 맞는 반응을 해줄 '조각(let)'만 메모리에 적재시킨다면 효율적으로 반응할 수 있다. 고로 Servlet이란 서버(Server)의 조각(let)이다.

 

.class로 저장되어 있는 Servlet

 

HttpServlet 클래스

HttpServletRequest HttpServletResponse
http프로토콜의 request정보를 서블릿에게 전달하기 위한 목적으로 사용
WAS는 어떤 클라이언트가 요청을 보냈는지 알고 있고, 해당 클라이언트에게 응답을 보내기 위한 HttpServleResponse 객체를 생성한다.

그 후 서블릿에게 전달하고 이 객체를 활용하여 content type, 응답 코드, 응답 메시지 등을 전송한다.
헤더 정보, 파라미터, 쿠키, URI, URL 등의 정보를 읽어 들이는 메서드와
Body의 Stream을 읽어 들이는 메서드를 가지고 있다. 

 

HttpServlet 클래스는 HttpServletRequest 클래스HttpServletResponse 클래스의 객체를 파라미터로 받아서 HTTP 통신과 관련된 많은 데이터를 처리할 수 있다.

HttpServlet 메서드는 HTTP 요청에 따라 service 메서드의 실행이 8가지로 분류되는데 기본적으로 4가지가 자주 사용된다.

1. POST 2.GET 3.PUT 4.DELETE. 개발자는 4가지 요청에 따라 영역을 구분하여 개발할 수 있다.

doPost() doGet() doPut() doDelete() 중에서 doGet() doPost()가 기본적으로 사용된다. (GET방식과 POST방식)

get방식 post방식 
클라이언트에서 서버로 어떠한 정보를 요청하기 위해 사용되는 메서드(예, 게시판의 게시물 조회)
클라이언트에서 서버로 리소스를 생성하거나 업데이트하기 위해 데이터를 보낼 때 사용되는 메서드(예, 게시판에 게시글 작성) 
get을 통한 요청은 URL 주소 끝에 파라미터로 포함되어 전송되고, 이 부분을 쿼리 스트링(query string)이라고 부른다.  get에서 url의 파라미터로 보냈던  변수명1=값1&변수명2=값2... 가 body에 담겨 보내진다고 생각하면 된다. (서버 쪽에서)
쿼리스트링: URL 끝에 "?"을 붙이고 그다음 변수명1=값1&변수명2=값2... 형식으로 이어 붙이면 된다. 
길이 제한이 있어서 제한된 용량이 있다. 파라미터가 노출되어서 보안에 취약하다. 길이 제한이 따로 없어 용량이 큰 데이터를 보낼 때 사용하거나 데이터가 외부적으로 드러나지 않아 보안에 강하다. 

 

 


Servlet 사용법

1. webServleProject 생성(Dynamic Web Project)

2. web.xml을 사용하기 위해서 세팅

servlet을 사용하기 위해서 web.xml를 복사해서 프로젝트의 WEB-INF 폴더 안에 넣는다. (반드시 lib 아래에)

Source에 들어가서 servlet 코드를 작성한다. <web-app></web-app> 안에 <servlet> 코드를 작성하면 된다.

 

 

 

3. src/main/java에 JAVA 패키지를 만들고 파일 생성

src/main/java에 패키지를 만들면 자동으로 src > main > java > myApp 폴더가 생성된다.

 

 

myApp > new > servlet > class name을 ServletStart로 한다. 

기본으로 doget방식과 doPost방식을 한 다음에 finish > 파일 생성 완료!

 

 

Servlet 파일

HttpServlet을 상속받은 것을 알 수 있다. 

 


4.-1 web.xml과 servletStart.java파일을 연결해 사용

web.xml 파일
 metadata-complete="true">
 
  <servlet>
  	<servlet-name>ServletStart</servlet-name>
  	<servlet-class>myApp.ServletStart</servlet-class>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>ServletStart</servlet-name>
  	<url-pattern>/index.do</url-pattern>
  </servlet-mapping>
<servlet> 서블릿 내부명과 완전한 클래스명과의 매핑정보
<servlet-name> 임의의 이름 생성(보통 보기쉽게 servlet-name은 클래스명으로)
<servlet-class> 매핑할 클래스 파일명을 패키지명을 포함해 입력
<servlet-mapping> 서블릿 내부명과 URL명과의 매핑정보 <servlet-name>이 같아야 함
<url-pattern> servlet-class의 클래스를 매핑할 가상의 이름을 입력, "/"로 시작 (이동할 url주소)

 

servletStart.java 
package myApp;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

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

    public ServletStart() {
        super();
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("doGet메서드가 호출됨");	
		
	}

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

}
더보기

 

Servlet 파일을 실행하면 바로 index.do 파일로 이동!!

 

System.out.println("doGet메서드가 호출됨"); 코드 때문에 콘솔에 doGet메서드가 호출됨이 찍힌다.

 

doGet메서드에서 변수 request와 response는 마음대로 설정 가능하다.   

protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
	System.out.println("doGet메서드가 호출됨");
}

URL 주소 매핑
URL 주소 매핑
1. Servlet의 @WebServlet("/URL") 어노테이션을 사용한 매핑
2. web.xml을 통한 매핑

매핑(mapping)을 하는 이유는 보안에 노출되어 있기 때문이다.
-> 기존 경로가 http://localhost:9090/프로젝트명/servlet/패키지명.클래스명 이라고 자세히 나와있는 부분을
URL 매핑을 통해 http://localhost:9090/프로젝트명/URL명 으로 간단하게 변경하는 것이다.

1. servletStart.java에서 @webServlet("/index.do") 이때 web.xml에서 metadata-complete="false">로 해줘야 한다. 안 하면 오류가 난다... 

2. web.xml파일에서 아래처럼 입력
<servlet-mapping>
<servlet-name>ServletStart</servlet-name>
<url-pattern>/index.do</url-pattern>
</servlet-mapping>
이때는   metadata-complete="true">로 해야한다. true일 때는 web.xml 방식 사용

 

URL 주소에서 프로젝트명 생략하기

Window > Servers > 실행되고 있는 server 더블 클릭 > 하단의 Modules 클릭 > 프로젝트 클릭 > Edit 클릭 > Path를 /로 설정 > OK 

 


4.-2 web.xml과 servletStart.java파일을 연결해 사용

index.do로 접속한 클라이언트에게 "doGet메서드가 호출됨" 정보 보내기(출력하기)

 

 

web.xml 파일은 동일. servletStart.java
package myApp;

import java.io.IOException;
import java.io.PrintWriter;
...

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

    public ServletStart() {
        super();
    }

    protected void doGet(HttpServletRequest rq, HttpServletResponse rsp) throws ServletException, IOException {
    	rsp.setContentType("text/html; charset=UTF-8");
     	PrintWriter pw = rsp.getWriter(); 
		pw.print("<h1>doGet메서드가 호출됨</h1>");
		pw.close();
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}
response.setContentType("text/html; charset=UTF-8")
1. 현재 페이지의 Content-Type을 세팅한다.
- 클라이언트에게 응답할 글을 인코딩하는 것이므로 똑같이 response로 시작하고 setContentType을 작성해준다. - 'ContentType(컨텐츠 타입)을 set(정한다)'는 의미를 갖는다.
- UTF-8은 한글을 인코딩할 때 사용하는 인코딩 방법으로 한글을 응답할 때는 무조건 위의 코드를 작성해야 한다.
- PrintWriter pw = response.getWriter();가 '인코딩 코드'보다 먼저 오면 안 된다.

PrintWriter pw = response.getWriter();
2. 화면에 출력하기 위해서(클라이언트의 요청에 응답을 위해) PrintWriter 객체를 얻어온다. 
- response는 서버가 클라이언트에게 '응답'한다는 의미를 가진 객체인데 서버가 클라이언트에게 '응답'하려면 무조건 response라는 객체를 통해 작업을 해야 한다.

- response.getWriter( )은 클라이언트에 응답하기 위한 출력 스트림을 반환하고, 출력 스트림을 이용해 클라이언트에게 응답을 보내게 된다. 데이터 타입은 PrintWriter이다.
- 메서드의 반환 값은 기본자료형 뿐 아니라 객체가 될 수 있기 때문에 getWriter( )의 return값은 PrintWriter객체인 것이다. 

pw.close( )

- 응답을 마친 후에 출력 스트림 객체의 close( ) 메서드를 이용해 스트림을 닫아서 클라이언트와 웹서버 간에 연결된 출력 스트림을 끊어준다.
- 자바의 입출력 스트림은 항상 맨 끝에 close( )로 닫아준다.

2022.03.02 - [멀티캠퍼스 풀스택 과정/백엔드] - 백엔드1-1. WAS(Web Application Server)과 Web Server

2022.03.03 - [멀티캠퍼스 풀스택 과정/백엔드] - 백엔드1-2. JSP-1: JSP기초와 예제(이클립스에서 웹 프로젝트 생성)

https://lordofkangs.tistory.com/33?category=868521