쌍용 강북 교육센터 국비학원 Day 59일차
서블릿 (Servlet) 이란 ?
서블릿의 정의는 클라이언트의 요청을 처리하고, 그 결과를 반환하는 Servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술이다.
예를들어 form 태그에서 사용자가 입력한 데이터를 받아 action으로 선언된 URL 경로에 데이터를 전송한다. 후에 .xml 파일에서 읽어들여 서블릿 클래스에 전달하여 후 서블릿 클래스에서 doGet, doPost 등의 메소드로 데이터를 처리한다.
서블릿 (Servlet)은 서블릿 클래스로 부터 만들어진 객체(Object) 를 말한다. 웹 컨테이너 (Web Application Server / Tomcat Server)는 서블릿 클래스를 가지고 서블릿 객체를 만든 다음에, 그 객체를 초기화 (사용할 수 있도록 준비된것) 해서 웹서비스를 할 수 있는 상태로 만드는데, 이런 작업을 거친 서블릿 객체만 서블릿이라고 할 수 있다.
즉, 웹 서비스를 할 수 있는 자바의 객체 (자바 클래스)를 서블릿 (Servlet) 이라고 부른다.
'서블릿클래스' -> (인스턴스화) -> '서블릿 객체' -> (초기화) -> '서블릿'
이와 같이 서블릿 클래스가 서블릿이 되기 위해서는 인스턴스와 및 초기화라는 두 단계를 거쳐야 한다. 하지만 이 두 단계는 모두 웹 컨테이너 (Tomcat Server) 에 의해 수행되기 때문에 프로그래머인 우리는 해야할 일이 없다. 우리는 단지, 정해진 규칙에 따라 서블릿 클래스를 코딩해서 작성해서 컴파일하고, 웹 컨테이너에 설치하고, 등록하기만 하면 된다.
<form action="<%= ctxPath%>/02_postMethod.do" method="post">
위의 form 태그를 예제로 submit(전송) 을 하면
<%= ctxPath%>/01_getMethod.do로 보내어서 처리를 요청한다.
/JSPServletBegin/01_getMethod.do은 누가처리를 해주는지 배치서술자인 web.xml에 기술해주어야 한다.
web.xml에 가보면 <servlet-mapping>에 URL 패턴으로 /01_getMethod.do 가 기술되어져 있고 이어서 실제로 처리를 해주는 <servlet-class>에 클래스명으로 chap02.GetMethod_01 이 기술되어져 있다. 이렇게 기술되어진 <servlet-class> 클래스명인 chap02.GetMethod_01 가 action 처리를 해주게 된다.
중요한 것은 web.xml 파일을 읽는 것은 WAS가 구동(start) 되어질 때 web.xml 파일에 기술된 내용을 딱 1번만 읽어들여서 web.xml 파일에 기술된 내용대로 WAS가 작동하도록 되어진다. 그러므로 web.xml 파일에 내용을 추가하거나 삭제하는 등 변경되어지면 변경된 내용대로 작동하기 위해서는 반드시 WAS 재시작 해야한다.
※ web.xml : 서블릿을 작성했다면 해당 서블릿을 사용자가 요청한 경로와 맵핑시켜야 WAS에서 맵핑된 정보를 읽어서 브라우저에서 해당 URL로 HTTP요청 시 해당 서블릿으로 요청을 전달해 줄 수 있다. 소스를 분석할 때도 가장 먼저 확인해봐야 할 부분이다. 톰캣을 예로 들면 웹 어플리케이션 서비스 처리에 대해 정의된 환경 설정 파일이 server디렉터리의 web.xml에 있다.
서블릿(Servlet) 클래스를 올바르게 작성하기 위해서는 반드시 3가지 규칙을 따라야 한다.
1. 서블릿(Servlet) 클래스는 반드시 javax.servlet.http.HttpServlet 클래스를 부모 클래스로 상속을 받아야 한다.
2. 웹 클라이언트의 요청 방식이 GET 방식으로 요청을 해오면 doGet() 메소드로 응답을 해주도록 코딩을 해야 하고, 웹 클라이언트의 요청 방식이 POST 방식으로 요청을 해오면 doPost() 메소드로 응답을 해주도록 코딩을 해주어야 한다. 그러므로 반드시 doGet() 메소드와 doPost() 메소드를 Overriding (재정의)를 해주어야 한다.
3. 응답처리 결과인 HTML 문서는 doGet() 메소드, doPost() 메소드 모두 두번째 파라미터를 이용해서 출력해야 한다.
※ doGet() 메소드와 doPost() 메소드의 첫번째 파라미터는 HttpServletRequest 타입의 request이고, 두번째 파라미터는 HttpServletResponse 타입의 response이다.
※ 서블릿 클래스의 상속/구현 관계
Servlet 인터페이스 < GenericSevlet 클래스 (Servlet 인터페이스를 구현한 클래스)
^
HttpServlet 클래스 (GenericSevlet 클래스의 자손 클래스)
^
우리가 작성하는 서블릿클래스
서블릿 클래스의 주요 메소드
JSP 페이지에서 사용할 수 있는 내장 객체변수의 종류
일반적인 JAVA 프로그램에서는 변수를 사용하기 전에 반드시 선언을 해야 하지만, JSP 페이지 (즉, 스크립틀릿)에서는 선언을 하지 않고도 사용할 수 있는 변수가 있다. 이러한 변수를 JSP 페이지의 내장객체변수 (implicit variable)라고 부른다. 왜냐하면 웹컨테이너 (=WAS, 톰캣서버)가 JSP 페이지를 Servlet 클래스로 변환해줄때 자동적으로 변수선언을 해주기 때문에 우리는 변수선언 없이 그냥 사용만 하면 된다.
내장객체변수이름 | 역할 |
request | doGet, doPost 메소드의 첫번째 파라미터와 동일한 역할을 하는 내장객체로서 웹클라이언트에서 보내온 데이터값을 받아서 처리해주는 역할을 함. |
response | doGet, doPost 메소드의 두번째 파라미터와 동일한 역할을 하는 내장객체로서 웹클라이언트의 요청에 대해 응답결과 처리해주는 역할을 함. |
out | 웹브라우저로 HTML 코드를 출력해주는 기능을 하는 내장객체로서 Servlet 클래스 안에서 response.getWriter() 메소드를 호출해서 얻은 PrintWriter 객체와 동일한 기능을 하는 내장객체임. |
session | 세션이라함은 여러 웹 컴포넌트들이 협력작업을 시작해서 끝내기까지의 기간을 의미하는 것으로써, session 내장객체 속에는 세션을 시작하고 끝내는 기능과 그 기간동안 웹 컴포넌트들이 데이터를 주고 받을 수 있는 기능들이 들어있다. |
application | JSP 페이지가 속한 웹어플리케이션에 관련된 다양한 기능을 하는 내장객체. |
config | JSP 페이지가 속한 웹어플리케이션의 초기상태와 관련된 기능을 하는 내장객체 |
Servlet 동작 방식
- 사용자 (클라이언트)가 URL을 입력하면 HTTP Request가 Servlet Container로 전송합니다.
- 요청을 전송받은 Servlet Container는 HttpServletRequest, HttpServletResponse 객체를 생성합니다.
- web.xml을 기반으로 사용자가 요청한 URL이 어느 서블릿에 대한 요청인지 찾습니다.
- 해당 서블릿에서 service메소드를 호출한 후 클리아언트의 GET, POST여부에 따라 doGet() 또는 doPost()를 호출합니다.
- doGet() or doPost() 메소드는 동적 페이지를 생성한 후 HttpServletResponse객체에 응답을 보냅니다.
- 응답이 끝나면 HttpServletRequest, HttpServletResponse 두 객체를 소멸시킵니다.
Filter
필터란 Servlet 2.3 버전에 추가된 것으로, 클라이언트의 요청을 서블릿이 받기 전에 가로채어 필터에 작성된 내용을 수행하는 것을 말한다. 따라서 필터를 사용하면 클라이언트의 요청을 가로채서 서버 컴포넌트의 추가적인 다른 기능을 수행시킬 수 있다.
- 필터 적용 순서
1. Filter 인터페이스를 구현하는 자바 클래스를 생성.
2. /WEB-INF/web.xml 에 filter 엘리먼트를 사용하여 필터 클래스를 등록하는데 하지만 web.xml 을 사용하지 않고 대부분 @WebFilter 어노테이션을 많이 사용한다.
필터 생성하는 자세한 예제는 사진참고
JSP Action
액션이란 XML 기술을 이용해서 기존의 JSP 문법을 확장해준 매커니즘으로 JSP 규격서에 정의되어 있는 기술이다. 이것은 XML 태그 형태를 띄기 때문에 액션태그라고도 부르며, 간단히 액션이라고 한다. 왜냐하면 이런 태그가 어떤 동작을 수행하는 역할을 하기 때문이다. (쉽게 말하면 비즈니스 로직을 처리하는 부분과 화면을 처리하는 부분을 나눠서 개발할 수 있도록 하기 위해 만들어진 기술이다.)
위는 액션을 사용하는 예제로 include로 가져오는 파일과 현재파일의 표현식(expression) 에서 같은 변수명을 사용했을 경우 등 파일이 충돌할 수 있으므로 코드전체를 가져오는 include 지시어를 사용해 가져오는 것보다 JSP 표준액션을 주로 사용한다.
액션(action) 의 2가지 종류
1. 표준액션 (Standard action)
예) <jsp:include page="abc.jsp" />
-> 표준액션은 모든 태그의 이름 앞에 jsp 라는 접두어가 붙고 JSP 페이지에서 바로 사용이 가능함.
액션 | 설명 |
<jsp:useBean> | 자바 인스턴스를 준비한다. 보관소에서 자바 인스턴스를 꺼내거나 자바 인스턴스를 새로 만들어 보관소에 저장하는 코드를 생성한다. (자바 인스턴스 = Java Bean) |
<jsp:setProperty> | 자바 빈의 프로퍼티 값을 설정한다. 자바 객체의 setter()를 호출하는 코드를 생성한다. |
<jsp:getProperty> | 자바 빈의 프로퍼티 값을 꺼낸다. 자바 객체의 getter()를 호출하는 코드를 생성한다. |
<jsp:include> | 정적(HTML, 텍스트 파일 등) 또는 동적(서블릿/JSP) 자원을 including하는 자바 코드를 생성한다. |
<jsp:forward> | 현재 페이지의 실행을 멈추고 다른 정적, 동적 자원으로 forwarding하는 자바 코드를 생성한다. |
<jsp:param> | jsp:include, jsp:forard, jsp:params의 자식 태그로 사용한다. ServletRequest 객체에 매개변수를 추가하는 코드를 생성한다. |
<jsp:plugin> | OBJECT 또는 EMBED HTML 태그를 생성한다. |
<jsp:element> | 임의의 XML 태그나 HTML 태그를 생성한다. |
2. 커스텀액션 (Custom action)
예) <c:set var="cnt" value="0" />
-> 커스텀액션은 모든 태그의 이름 앞에 jsp 이외의 다른 이름의 접두어가 붙고 별도의 라이브러리를 설치해야만 사용가능함. 라이브러리는 인터넷에서 다운로드 받을수도 있고 (JSTL), 사용자가 직접 만들어 사용할수도 있다.
※ 액션(action)이 HTML 태그와 다른점
- 액션태그(action tag)의 모습은 HTML 태그와 많이 닮았지만, HTML 태그처럼 클라이언트의 웹브라우저로 직접 전달되는 것이 아니라, 웹 컨테이너 (톰캣서버) 쪽에서 실행되고, 그 결과만 클라이언트의 웹브라우저에서 출력된다는 것이다.
※ 표준액션(Standard action)을 이용해서 할 수 있는 일
- <jsp:include> 와 <jsp:forward> 같은 표준액션을 이용하면 자바에서 했던 include() 메소드, forward() 메소드와 똑같은 기능을 구현할수 있다.
- <jsp:useBean>, <jsp:setProperty>등의 표준액션을 이용하면 자바코드를 작성하지 않고도 자바빈 (JavaBean, 자바빈 규격서에 따라 만든 자바클래스)을 만들어 사용할 수 있다.
서블릿에 관해 참고하기 좋은 글 - https://mangkyu.tistory.com/14
- https://velog.io/@falling_star3/Tomcat-%EC%84%9C%EB%B8%94%EB%A6%BFServlet%EC%9D%B4%EB%9E%80
'Web > JSP' 카테고리의 다른 글
쌍용강북교육센터 국비 학원 Day 63일차 JSP (MVC 패턴) (0) | 2023.04.03 |
---|---|
쌍용강북교육센터 국비 학원 Day 62일차 JSP 구현 (0) | 2023.03.31 |
쌍용강북교육센터 국비 학원 Day 61일차 JSP (JSTL - 커스텀 액션, EL) (0) | 2023.03.30 |
쌍용강북교육센터 국비 학원 Day 60일차 JSP (표준 액션 태그 forward, JavaBean, useBean) (0) | 2023.03.29 |
쌍용강북교육센터 국비 학원 Day 58일차 JSP (JSP 란?, Web Server, Web Container) (0) | 2023.03.27 |