가희의자기개발블로그

Servlet 본문

백엔드/JSP

Servlet

가희gahui 2020. 7. 13. 20:10
반응형

1_Servlet(서블릿)

서블릿은 웹프로그래밍에서 클라이언트의 요청을 처리하고 그 결과를 다시 클라이언트에게 전송하는 Servlet클래스의 구현 규칭을 지킨 자바 프로그래밍이다.

간단히 말해서, 서블릿이란, 서블릿이란 자바를 사용하여 웹을 만들기 위해 필요한 기술입니다. 그런데 좀더 들어가서 설명하자면 클라이언트가 어떠한 요청을 하면 그에 대한 결과를 다시 전송해주어야 하는데, 이러한 역할을 하는 자바 프로그램입니다. 

예를 들어, 어떠한 사용자가 로그인을 하려고 할 때. 사용자는 아이디와 비밀번호를 입력하고, 로그인 버튼을 누릅니다. 

그때 서버는 클라이언트의 아이디와 비밀번호를 확인하고, 다음 페이지를 띄워주어야 하는데, 이러한 역할을 수행하는 

것이 바로 서블릿(Servlet)입니다. 그래서 서블릿은 자바로 구현 된 *CGI라고 흔히 말합니다.

 

2_Servlet(서블릿) 특징

  • 클라이언트의 요청에 대해 동적으로 작동하는 웹 어플리케이션 컴포넌트

  • html을 사용하여 요청에 응답한다.

  • Java Thread를 이용하여 동작한다.

  • MVC 패턴에서 Controller로 이용된다.

  • HTTP 프로토콜 서비스를 지원하는 javax.servlet.http.HttpServlet 클래스를 상속받는다. UDP보다 속도가 느리다.

  • HTML 변경 시 Servlet을 재컴파일해야 하는 단점이 있다.

일반적으로 웹서버는 정적인 페이지만을 제공합니다. 그렇기에 동적인 페이지를 제공하기 위해서 웹서버는 다른 곳에 도움을 요청하여 동적인 페이지를 작성해야 합니다. 동적인 페이지로는 임의의 이미지만을 보여주는 페이지와 같이

사용자가 요청한 시점에 페이지를 생성해서 전달해 주는 것을 의미합니다. 여기서 웹서버가 동적인 페이지를 제공할 수 있도록 도와주는 어플리케이션이 서블릿이며, 동적인 페이지를 생성하는 어플리케이션이 CGI입니다. 

 

  1. 사용자(클라이언트)가 URL을 클릭하면 HTTP Request를 Servlet Container로 전송합니다.
  2. HTTP Request를 전송받은 Servlet Container는 HttpServletRequest, HttpServletResponse 두 객체를 생성합니다.
  3. web.xml은 사용자가 요청한 URL을 분석하여 어느 서블릿에 대해 요청을 한 것인지 찾습니다.
  4. 해당 서블릿에서 service메소드를 호출한 후 클리아언트의 POST, GET여부에 따라 doGet() 또는 doPost()를 호출합니다.
  5. doGet() or doPost() 메소드는 동적 페이지를 생성한 후 HttpServletResponse객체에 응답을 보냅니다.
  6. 응답이 끝나면 HttpServletRequest, HttpServletResponse 두 객체를 소멸시킵니다.

3_Servlet(서블릿) 생명주기

Servlet클래스 안에는 크게 네개의 메서드가 있다. 서블릿의 초기화를 담당하는 init()메서드, get방식으로 받을 때, 처리할 doGet()메서드 Post방식으로 받을 때, 처리해주는 doPost()메서드 그리고 실행해주는 execute()메서드이다. 

3_1서블릿의 초기화

클라이언트의 요청이 들어오면 컨테이너는 해당 서블릿이 메모리에 있는지 확인하고, 없을 경우 init() 메소드를 호출하여 적제한다. 즉, 클라이언트로부터 최초 요청시 단 한번 초기화되며 생성된다. 이때 호출 되는 메소드가 init()메서드인데 이 과정을 서블릿 로딩이라고 한다.  그렇기 때문에 이 서블릿 스레드에서 공통적으로 사용해야 하는 것이 있다면 오버라이딩으로 구현하면 된다. 실행 중 서블릿이 변경될 경우, 기존 서블릿을 파괴하고 init()을 통해 새로운 내용을 다시 메모리에 적재하면 된다.

3_1_1 초기화 메서드 init()

init()메서드의 경우 HttpServlet의 최상위 클래스인 Servlet인터페이스에 정의 되어있다. Servlet의 구현체이자 HttpServlet의 부모 클래스인 GenericServlet에서는 init()메서드를 다음과 같이 두가지로 구현한다. 

 @Override
    public void init(ServletConfig config) throws ServletException {
        this.config = config;
        this.init();
    }
 
    public void init() throws ServletException {
    }


출처: https://dololak.tistory.com/47 [코끼리를 냉장고에 넣는 방법]

 

 

 

 

3_1_2 서블릿 상속도와 init() 메서드 오버라이딩

서블릿의 기능이나 역할에 따라 서블릿 객체가 생성되는 시점에 필요한 행동들이 있으며, 그에 대한 내용을 원하는 init() 메서드를 오버라이딩하여 구현 한다.


3_1_3 init()메서드와 ServletConfig 객체를 이용한 서블릿 초기화 방법

클라이언트로부터 최초 요청시 서블릿 객체 생성 후 init() 메서드를 호출할때 ServletConfig를 자동으로 생성해서 넘겨준다. 이 ServletConfig는 서블릿당 하나가 생성되며 web.xml에서 우리가 필요에 따라 입력한 파라미터 값들을 담고 있다. 

<servlet>
    <servlet-name>ControlServlet</servlet-name>
    <servlet-class>com.control.ControlServlet</servlet-class>
    <init-param>
      <param-name>propertyConfig</param-name>
      <param-value>D:/java_ee/workspace/miniProject/WebContent/WEB-INF/command.properties</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>ControlServlet</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>

여기서 web.xml에서 Servlet맵핑 설정시에 <init-param> 태그를 통해 서블릿 초기화시 넘겨받을 값들을 설정할 수 있고 값들은 <param-name>과 <param-value>를 통해 지정해준다.

그리고 실제 서블릿에서는 다음과 같이 설정한 파라미터 값을 가져올 수 있다. 

.getInitParameter("propertyConfig") - 매개변수로 web.xml에서 지정했던 param-name을 넘겨주면 그에 해당하는 값들을 가져온다. 

public void init(ServletConfig config) {
		String propertyConfig = config.getInitParameter("propertyConfig");
	System.out.println("propertyConfig = " + propertyConfig + "\n");
    //propertyConfig = D:/java_ee/workspace/miniProject/WebContent/WEB-INF/command.properties
    
}

3_1_4 ServletConfig를 이용했을때 이점

ServletConfig를 통해 서블릿을 초기화하게 되면 유지보수성이 높아지는 이점이 있다. 예를 들어 데이터베이스 설정값이라든지, 인코딩 캐릭터셋을 지정할때 web.xml과 ServletConfig를 이용하게 되면 나중에 수정이 되어도 적용이 간편해지기 때문이다.

만약, 해당 값들이 서블릿 클래스 안에 소스상으로 하드코디 ㅇ되었을 경우에는 값을 변경하기 위해 실제로 운영되고 있는 서버에 소스를 수정하고 컴파일 한 후에 다시 올리는 일을 반복해야 하지만 web.xml을 이용하면 xml에서만 값을 고쳐주면 설정을 쉽게 변경 할 수 있다. 

  1. init()이 호출된 후 클라이언트의 요청에 따라서 service()메소드를 통해 요청에 대한 응답이 doGet()가 doPost()로 분기됩니다. 이때 서블릿 컨테이너가 클라이언트의 요청이 오면 가장 먼저 처리하는 과정으로 생성된 HttpServletRequest, HttpServletResponse에 의해 request와 response객체가 제공됩니다.
  2. 컨테이너가 서블릿에 종료 요청을 하면 destroy()메소드가 호출되는데 마찬가지로 한번만 실행되며, 종료시에 처리해야하는 작업들은 destroy()메소드를 오버라이딩하여 구현하면 됩니다.

3_1_5 init()메서드의 흐름

init() 메서드는 위에서 설명했다시피, Servlet을 생성, 초기화 하는 메서드 이다. 이 메서드가 호출 됐을 경우, 가장먼서 properties 파일의 있는 위치가 불러와 지고 해당 파일의 key-value 값은 key값과 해당 파일을 주소값으로 Iterator를 이용해 Map에 저장 된다. map에 저장하는 이유는 나중에 사용자의 요청이 들어왔을 때, 맞는 페이지를 호출해 주기 위해서 이다. 

 

https://mangkyu.tistory.com/14?category=761303

 

[JSP] 서블릿(Servlet)이란?

오늘은 Spring프로젝트를 진행하면서 막혔던 Servlet(서블릿)에 대해 공부해보고자 합니다. 처음으로 웹서버 분야를 공부하는데, 역시나 망나니개발자에게 보이는 것들은 처음보는 것들 뿐 입니다

mangkyu.tistory.com

3_2 doGet()메서드

get방식으로 보내왔을 때 excute() 실행한다.

3_3 doPost()메서드

post방식으로 보내왔을 때 excute() 실행한다.

3_4 excute()메서드

excute메서드는  get방식으로는 post방식으로든 이 메서드가 실행 되는데 만약 Post방식으로 넘겨줬다면, request.setCharacterEncoding("UTF-8") 로 한글 처리를 꼭 해줘야 한다. 

if (request.getMethod().equals("POST")) {
			request.setCharacterEncoding("UTF-8");
		} // doPost()는 한글처리를 꼭 해줘야 한다.

이 후, request.getServletPath()메서드를 이용한다. 이 메서드는 

http://localhost:8080/miniProject/main/index.do 로 요청시에, Servletpath인 /main/index.do만을 잘라낸다.

 

다음으로, init()메서드에서 생성해줬던 map에서 내가 원하는 카테고리 값(주소)을 가져오면 된다.

CommandProcess commandProcess = (CommandProcess) map.get(category);

commandProcess에 내가 원하는 주소값을 가져오면 CommandProcess에 잡아준 requestPro메서드를 호출해준다.

String view = null;
		try {
			view = commandProcess.requestPro(request, response); // 요청하면 jsp파일주소(?)를 반환한다.
		} catch (Throwable e) {
			e.printStackTrace();
		}

이렇게 호출하면 return값으로 원하는 jsp나 html등의 주소를 반환한다. 이때,! forward시켜줘서 Servlet과 Jsp파일을 묶어줘야 한다. 

// forward
		RequestDispatcher dispatcher = request.getRequestDispatcher(view);// 상대번지
		dispatcher.forward(request, response);// 제어권 넘기기

 

반응형

'백엔드 > JSP' 카테고리의 다른 글

한글처리  (0) 2020.07.09
JSESSIONID  (0) 2020.07.07
기초- JSP프로젝트 구조  (0) 2020.06.16
MVC  (0) 2020.06.16
Connection Pool  (0) 2020.06.12
Comments