1. Web Server(웹 서버)와 WAS(Web Applictaion Server)란?
1) Web Server(웹 서버)
ㄱ. 소프트웨어와 하드웨어로 구분
- 하드웨어 : Web Server가 설치되어 있는 컴퓨터
- 소프트웨어 : 웹 브라우저 클라이언트로부터 HTTP 요청을 받아 정적인 컨텐츠(.html .jpg .css 등)를 제공하는 컴퓨터 프로그램
ㄴ. Web Server의 기능
(1) HTTP 프로토콜을 기반으로 하여 클라이언트의 요청을 서비스하는 기능을 담당
> 쉽게 HTTP 요청을 처리하는 웹서버이다.
(2) 요청에 따라 아래의 두 가지 기능 중 적절하게 선택하여 수행한다.
기능 1)
- 정적인 컨텐츠 제공
- WAS를 거치지 않고 바로 자원을 제공한다.
기능 2)
- 동적인 컨텐츠 제공을 위한 요청 전달
- 클라이언트의 요청(Request)을 WAS에 보내고,
WAS가 처리한 결과를 클라이언트에게 전달(응답, Response)한다.
- 클라이언트는 일반적으로 웹 브라우저를 의미한다.
ㄷ. Web Server의 예)
- Apache Server, Nginx, IIS(Windows 전용 Web 서버) 등
2) WAS(Web Application Server)
ㄱ. WAS의 개념
- DB 조회나 다양한 로직 처리를 요구하는 동적인 컨텐츠를 제공하기 위해 만들어진 Application Server
- HTTP를 통해 컴퓨터나 장치에 애플리케이션 수행을 해주는 미들웨어(소프트웨어 엔진)
- WAS(Web Application Server) = 웹 컨테이너(Web Container) = 서블릿 컨테이너(Servlet Container) 라고도 불림
- 서블릿 컨테이너(Servlet Container)란? JSP, Servlet을 실행시킬 수 있는 소프트웨어로써 클라이언트 요청을 받아 요청을 처리하고 다시 클라이언트에게 응답을 해주는 역할을 함
- 즉, WAS는 JSP, Servlet 구동 환경을 제공함
ㄴ. WAS의 역할
- WAS = Web Server + Servlet Container(또는 Web Container 라고도 함)
즉, WAS는 웹 서버와 서블릿 컨테이너의 결합으로 다양한 역할을 수행하는 서버
- Web Server 기능들을 구조적으로 분리하여 처리하고자하는 목적으로 제시됨
> 분산 트랜잭션, 보안, 메시징, 쓰레드 처리 등의 기능을 처리하는 분산 환경에서 사용된다.
> 주로 DB 서버와 같이 수행된다.
- 현재는 WAS가 가지고 있는 Web Server도 정적인 컨텐츠를 처리하는 데 있어서 성능상 큰 차이가 없다.
ㄷ. WAS의 주요 기능
- 프로그램 실행 환경과 DB 접속 기능 제공
- 여러 개의 트랜잭션(논리적인 작업 단위) 관리 기능
- 업무를 처리하는 비즈니스 로직 수행
ㄹ. WAS의 예)
- Tomcat, JBoss, Jeus, Web Sphere 등
결론)
Web Server(웹 서버)는 정적인 데이터 처리하는 서버
WAS는 동적인 데이터 처리하는 서버
컨테이너 기능(웹서버 + 서블릿)이 가능한가 불가능한가의 차이
2. Apache Tomcat(아파치 톰캣)이란?
Apache와 Tomcat의 역할은 엄연히 다르다. 아파치라는 같은 sw 단체에 만들었기 때문에 아파치 톰캣일 뿐.. 역할은 다르다.
'1. 웹서버와 WAS 란?' 설명에서도 쓰여진 듯이 Apache(아파치)는 웹 서버이고,
Tomcat(톰캣)은 WAS로서 자바 서블릿을 실행시키고 JSP 코드가 포함되어 있는 웹 페이지를 만들어준다.
3. JSP의 처리과정
[전체적인 처리과정]
WAS = 웹 컨테이너 = 서블릿 컨테이너 같은 말이라고 기억하고 처리 과정을 살펴보자!
1) 웹 브라우저에서 URL 입력
2) DNS 서버로부터 입력한 URL을 변환한 IP 주소를 받음
3) 받은 IP 주소의 웹 서버의 8080포트에서 JSP 페이지 요청(포트 번호는 사용하는 포트 번호에 따라 상이)
4) 웹 서버가 요청 내용을 분석하고 서블릿 컨테이너에게 요청을 넘겨 처리
5) 화면에 보일 내용을 HTML 문서 형태로 서블릿 컨테이너가 웹 브라우저에게 전송
[JSP 처리 과정]
단순히 위의 내용에서 JSP 처리 과정(3,4,5)만 추출하여 도식화 한다면 다음 그림과 같다.
1) 웹 브라우저가 웹 서버에게 test.jsp 파일 요청
2) 웹 서버가 웹 컨테이너(서블릿 컨테이너)에게 전달
3) 웹 컨테이너는 해당 JSP파일이 처음 요청된 것인지 수정된 것인지 판단 후 JSP파일을 Servlet으로 파싱
즉, test.jsp 요청을 받았다면 test.java형태로 변환
만약, JSP파일이 수정되지 않고 이전에 이미 요청되었던 페이지라면 다시 파싱할 필요가 없으므로 넘어감
4) 웹 컨테이너가 Servlet(.java 파일)을 컴파일 후 .class 파일 생성(Java에서 실행 가능한 상태로)
5) 웹 컨테이너가 실행 결과를 다시 웹 서버에게 넘김
6) 웹 서버는 웹 컨테이너에게 받은 결과를 웹 브라우저가 이해할 수 있는 HTML 형태로 결과를 줌
7) 웹 브라우저는 그 결과를 사용자에게 표시(출력)
결론)
- JSP파일은 Servlet으로 변환되어, 웹 브라우저 요청에 대한 응답을 html페이지로 반환한다.
test.jsp -> test.java -> test.class
- JSP가 최초로 요청되었을 때만 실행되며, 같은 페이지에 대한 요청이 있으면 이미 변환된 서블릿 파일(.java)가 서비스 되어진다.
- 사용자 -> 웹 서버 -> 웹 컨테이너(서블릿 컨테이너) -> 웹 서버 -> 웹 브라우저
* java 코딩 같은 동적인 처리는 모두 웹 컨테이너(서블릿 컨테이너)가 하는 것
3-1. 웹 컨테이너(서블릿 컨테이너)가 JSP/서블릿 컴파일 처리 과정
- 위에서 설명한 JSP 처리과정에 대한 설명과 비슷한데 웹 컨테이너(서블릿 컨테이너)가 처리하는 과정만 따로 설명하자면 아래와 같다.
1) 웹 브라우저에서 웹 서버로 JSP에 대한 사용자 요청이 컨테이너로 전달
2) 요청 JSP에 대한 서블릿이 존재한다면 다음 단계로 진행 / 서블릿이 존재하지 않는 다면 JSP를 .java 파일로 변환 후 .class 파일로 컴파일(JSP 파일에 대한 서블릿 컨테이너의 변환 및 처리과정)
3) 컴파일된 서블릿 클래스를 컨테이너의 메모리에 적재 후 실행
4,5) DB 처리 혹은 별도의 기능을 위한 클래스 호출 등이 있다면 실행 후 결과를 취합하여 HTML 형태로 구성
6) HTML 형태의 결과를 웹 서버를 경유하여 사용자 브라우저에 전달
이클립스 내에서 배포했을 때의 위치
- 이클립스의 실제 배포 경로 찾기(물리적인 경로, 서버가 있는 경로)
> C:\클래스명\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\도메인\프로젝트명\org\apache\jsp\폴더명
4. 출력 버퍼와 응답
- JSP 페이지는 응답 결과를 곧바로 웹 브라우저에 전송하지 않는다. 출력 버퍼라는 곳에 임시로 응답 결과를 저장한 후 한 번에 웹 브라우저에 전송한다.
- [버퍼에 저장했다가 한꺼번에 웹 브라우저에 전송할 때 생기는 장점]
1) 데이터 전송 성능 향상
2) JSP 실행 도중에 버퍼를 비우고 새로운 내용 전송 가능
3) 버퍼가 다 차기 전까지 헤더 변경 가능
4-1. page 디렉티브에서 버퍼 설정하기 : buffer 속성과 autoFlush 속성
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
- 위의 page 디렉티브에서 buffer 속성의 기본 값은 8kb이고, autoFlush의 기본 값은 true이다.
- autoFlush는 버퍼가 가득차면 자동으로 전송하고 버퍼를 비우라고 설정하는 속성이다.
true이면 버퍼가 다 차면 자동 전송 후 버퍼를 비우고 계속해서 작업을 진행 하라는 설정, flase이면 버퍼가 다 차면 예외를 발생시키고 작업을 중지하는 설정이다.
- 버퍼가 가득 찼는데 전송을 하지 않으면 'java.io.IOException: 오류: JSP 버퍼 오버플로우' 라는 에러가 발생한다.
5. JSP에서 제공하는 기본 객체 9가지
* 오늘 수업에서는 out, pageContext, application 3가지 배움
기본객체 | 실제타입 | 설명 |
request | javax.servlet.http.HttpServletRequest | 클라이언트의 요청 정보를 저장하는 객체 |
response | javax.servlet.http.HttpServletResponse | 응답 정보를 저장하는 객체 |
out | javax.servlet.jsp.JspWriter | JSP 페이지가 생성하는 결과를 출력할 때 사용하는 출력 스트림(출력 버퍼) |
session | javax.servlet.jsp.HttpSession | HTTP 세션 정보를 저장(인증, 권한 정보 저장) ex. 로그인 |
pageContext | javax.servlet.jsp.PageContext | JSP 페이지에 대한 정보를 저장하는 객체 |
page | java.lang.Object | JSP 페이지를 구현한 자바 클래스 인스턴스 -> 페이지를 생성한 객체 |
application | javax.servlet.ServletContext | 웹 애플리케이션(웹 브라우저) 전체에 대한 정보를 저장하는 객체 |
config | javax.servlet.ServletConfig | JSP 페이지의 설정 정보 저장하는 객체 |
exception | java.lang.Throwable | 예외 처리 객체(에러 페이지에서만 사용 가능) |
* request 내용은 https://yelin1217.tistory.com/297
* response 내용은 https://yelin1217.tistory.com/300
5-1. out 기본 객체
- JSP 페이지가 생성하는 모든 내용은 out 기본 객체를 통해 전송되어짐
1) out 기본 객체의 출력 메서드
- print() : 데이터를 출력
- println() : 데이터를 출력하고 줄바꿈 문자("\r\n")를 출력한다.
- newLine() : 줄바꿈 문자를 출력한다.
2) out 기본 객체의 버퍼 관련 메서드
- getBufferSize() : 버퍼의 크기를 구한다
- getRemaining() : 현재 버퍼의 남은 크기를 구한다.
- clear() : 버퍼의 내용을 비운다. 만약, 버퍼를 이미 flush 했다면 IOException 발생시킴
- clearBuffer() : 버퍼의 내용을 비운다. clear() 메서드와 달리 버퍼를 flush한 경우에도 예외를 발생시키지 않음
- flush() : 버퍼를 flush 한다. 즉, 버퍼의 내용을 클라이언트에 전송한다.
- isAutoFlush() : page 디렉티브의 autoFlush 속성 값을 리턴
예시)
5-2. pageContext 기본 객체
* pageContext를 직접 사용하는 경우는 드물다.
1) pageContext 기능
- JSP 페이지의 기본 객체를 얻어올 수 있다. -> request, response, out 등등
- 속성 처리 기능
- 페이지의 흐름 제어(다음에 설명)
- 에러 데이터 구하기(다음에 설명)
2) pageContext가 제공하는 기본 객체 접근 메서드
예시)
5-3. application 기본 객체
1) application 기본 객체 설명과 기능
- 웹 애플리케이션과 관련된 기본 객체(웹 사이트)
- 모든 JSP 페이지에서 공유하는(=1개) 기본 객체 == aplication
- 모든 JSP 페이지에서 공유하는 정보를 저장/읽기
2) 웹 어플리케이션 초기화 파라미터 읽어오기
- 서블릿 규약은 웹 어플리케이션 전체에 걸쳐서 사용할 수 있는 초기화 파라미터를 정의하고 있다.
- 웹 어플리케이션에서 사용할 수 있는 초기화 파라미터는 web.xml 파일에 <context-param> 태그를 사용하여 추가한다.
- web.xml 파일에 초기화 파라미터를 추가하면, JSP는 application 기본 객체가 제공하는 메서드를 사용해서 초기화 파라미터를 사용할 수 있음
* web.xml 이란?
- 웹 어플리케이션을 위한 설정 정보를 담고 있는 파일
- 서블릿 2.5 / JSP 2.1 버전까지는 web.xml 파일이 필수였지만, 서블릿 3.0 / JSP 2.2 버전부터는 필요할 때만 사용
- web.xml 파일은 [웹 어플리케이션 폴더]\WEB-INF 폴더에 위치해야 인식 가능
[ application 기본 객체의 웹 어플리케이션 초기화 파라미터 관련 메서드 ]
- application.getInitParameter(String name);
: 이름이 name에 해당하는 웹 어플리케이션 초기화 파라미터의 value 값을 String으로 반환,
존재하지 않으면 null 반환
- application.getInitParameterNames();
: param-name(웹 어플리케이션 초기화 파라미터의 이름)을 읽어와서 Enumeration<String>으로 반환
3) 서버 정보 읽어오기
[ application 기본 객체가 제공하는 서버 정보 관련 메서드 ]
예시) web.xml에서 <context-param> 태그 추가하여 그 안에 <param-name>과 <param-value>를 설정하여 서버에 대한 정보와 초기화 파라미터의 이름과 값을 읽어온기
4) 웹 어플리케이션의 자원 구하기
[ application 기본 객체가 제공하는 자원 접근 메서드]
- getRealPath(String path) : 웹 어플리케이션 내에서 지정한 경로에 해당하는 자원의 시스템상에서의 경로를 String 자료형으로 리턴
- getResource(String path) : 웹 어플리케이션 내에서 지정한 경로에 해당하는 자원에 접근할 수 있는 URL 객체를 String 자료형으로 리턴
- getResourceAsStream(String path) : 웹 어플리케이션 내에서 지정한 경로에 해당하는 자원으로부터 데이터를 읽어올 수 있는 InputStream을 리턴한다.
String realPath = application.getRealPath("");
// 위의 메서드로 경로를 구할시 아래와 같이 나옴
C:\Class\JSPClass\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\jspPro\
예시) 아까 web.xml에 추가했던 웹 어플리케이션 초기화 파라미터 값으로 이클립스의 셀제 배포 경로(물리적인 경로)를 찾아서 파일들을 가져와 해당하는 파일을 옵션태그로 선택시 웹 브라우저에 츨력하는 예제이다.
[web.xml]
[.jsp 코드]
[결과]
6. JSP 기본 객체와 4가지 영역(Scope)
- 객체의 영역은 객체의 유효기간이라고 생각하자
- 영역이란 데이터를 공유할 수 있는 범위를 말하며 4가지의 영역이 있다.
6-1. 웹 어플리케이션은 다음의 4가지 영역(Scope)로 구성
1) application scope
- 하나의 웹 사이트(웹 어플리케이션) 전체에 사용되는 영역
- 웹 어플리케이션이 실행되는 동안 유지됨
- 한 웹 어플리케이션에 속한 모든 JSP 페이지는 하나의 application 객체를 공유
- 웹 어플르케이션이 종료되는 순간 반환
2) session scope => 세션 수업할 때 다시 배울 예정
- 하나의 웹 브라우저에서 사용되는 영역
- 접속을 한 다음에 접속을 끊을 때 까지의 영역(브라우저를 닫기 전까지)
- 사이트를 닫은 후에 마지막 요청은 20분 뒤에 사라지며 세션 시간은 설정할 수 있음
3) request scope
- 하나의 HTTP 요청을 처리할 때 사용되는 영역 -> 포워딩이나 리퀘스트(링크 태그로는 안됨)
- 브라우저가 웹에 전송하는 요청이 하나의 request 영역이 되어짐
- 브라우저가 요청을 할 때 마다 새로운 request 객체가 생성되고 매번 새로운 request 영역이 생성
- request 영역은 요청(request)부터 응답(response)까지(요청이 들어올 때 생성되서 응답을 받으면 사라짐)
4) page scope
- 하나의 JSP 페이지를 처리할 때 사용되는 영역
- 브라우저의 요청이 들어오면 JSP 페이지를 실행하는데 이 때 실행하는 JSP가 하나의 page 영역
6-2. 각각의 영역(scope)에 관련된 기본 객체
1) 기본 객체
- page scope -> pageContext 기본 객체
- request scope -> request 기본 객체
- session scope -> session 기본 객체
- application scope -> application 기본 객체
2) 속성의 쓰임새
- 속성은 기본 객체에 따라서 쓰임새가 다르다.
6-3. 각각의 객체마다 속성을 처리하는 메서드
- .setAttribute(String name, Object value) : 이름이 name인 속성의 값을 value로 지정한다.
- .getAttribute(String name) : 이름이 name인 속성의 값을 구하여 Object로 돌려준다. 지정한 이름의 속성이 존재하지 않으면 null을 리턴
- .removeAttribute(String name) : 이름이 name인 속성을 삭제한다.
- .getAttributeNames() : 속성의 이름 목록을 구한다.(pageContext 기본 객체는 이 메서드를 제공 X)
예시)
ex06_02.jsp
> 4가지의 영역의 값들이 잘 출력되고 있음을 확인. a 링크 태그를 클릭하여 ex06_03.jsp로 넘어가면
ex06_03.jsp
> addr과 color은 null로 출력
reques인 addr은 한 번의 요청과 응답을 했기 때문에 사라졌으며, page인 color은 하나의 JSP 페이지인 ex06_02.jsp에서 출력되고 ex06_03.jsp에서는 사라진 것
> ex06_02.jsp에 포워드 작업 추가
> ex06_02.jsp를 실행시키면 바로 아래와 같은 웹 브라우저가 보임. 포워딩 작업을 했기 때문에 URL은 ex06_02.jsp이고 출력된 페이지는 ex06_04.jsp임
> page를 닫지 않은 상태에서의 ex06.jsp 결과
> 실행하고 있는 모든 브라우저를 다 닫은 상태에서 ex06.jsp만 실행시키면 name만 출력되고 나머지는 null이 나옴
* JSP 수업 4일차 + 최범균의 JSP p100 부터 내용 정리한 것..
'TIL > View Template' 카테고리의 다른 글
[SIST] JSP_days05_에러 처리 (0) | 2022.06.20 |
---|---|
[JSP] GET과 POST / redirect와 forward / JSP와 Servlet (0) | 2022.06.18 |
[SIST] JSP_days04_급여 등급에 해당하는 사원 정보를 가져와서 아코디언 / 탭 형식으로 출력하는 예제(+JSTL 맛보기) (0) | 2022.06.18 |
[SIST] JSP_days04_부서 선택시 해당 부서의 사원 정보를 테이블로 출력하는 예제 (0) | 2022.06.18 |
[SIST] JSP_days03_response 객체 / 리다이렉트(redirect) / 포워드(forward) / GET 방식 + 서블릿 + JDBC + 포워딩 예제(JSTL 맛보기) (0) | 2022.06.16 |