✔️ 웹 어플리케이션 전반에 걸쳐서 사용되는 정보를 담고 있다.
특정 웹 어플리케이션에 포함된 모든 JSP 페이지는 하나의 application 기본 객체를 공유하게 된다.
application 기본 객체를 사용하여 다음과 같은 일을 수행할 수 있다.
초기 설정 정보를 읽어올 수 있다.
서버정보를 읽어올 수 있다.
웹 어플리케이션이 제공하는 자원(파일)을 읽어올 수 있다.
✔️ WEB-INF\web.xml 파일에
<context-param>
태그를 사용하여 추가
서블릿 규약은 웹 어플리케이션 전체에 걸쳐서 사용할 수 있는 초기화 파라미터를 정의하고 있다.
<context-param>
<description>파라미터 설명(필수 아님)</description>
<param-name>파라미터 이름</para-name>
<param-value>파라미터 값</param-value>
</context-param>
web.xml 파일은 설정파일이라서 수정하고 나서는 restart해줘야 한다.
✔️ 웹 어플리케이션을 위한 설정 정보를 담고 있는 파일
다른말로 dd(Deployment Descriptor : 배포서술자) 파일이라고도 불린다.
web.xml 파일은 [웹 어플리케이션]\WEB-INF 폴더에 위치해야 한다. 다른 폴더에 위치하면 인식하지 못한다.
현재에서는 JSP 프로그래밍을 할 때 web.xml 파일이 꼭 필요한 것은 아니다.
서블릿 3.0 버전부터는 web.xml파일 대신 java코드를 이용해서 설정할 수 있는 기능이 추가됐다.
getInitParamater(String name) ⭐️⭐️
: String
: 이름이 name인 웹 어플리케이션 초기화 파라미터의 값을 읽어온다.
: 존재하지 않으면 ➡️ null
getInitPramaterNames()
: Enumeration(String)
: 웹 어플리케이션 초기화 파라미터의 이름 목록을 리턴한다.
❓ 웹 어플리케이션 초기화 파라미터는 언제 사용할까?
- 웹 어플리케이션을 초기화하는데 필요한 설정 정보를 지정하기 위해 사용된다.
- 다른 JSP 파일에서도 쓸 수 있도록 공유하는 목적으로 사용된다.
- 간접적으로 브릿지 역할을 해주는 목적으로 사용된다.
- 찾고있는 파일의 경로를 찾을 때 사용된다.
📌 데이터베이스 연결과 관련된 설정 파일의 경로 지정
📌 로깅 설정 파일 지정
📌 웹 어플리케이션의 주요 속성 정보를 담고 있는 파일 경로 등을 지정
✔️ 현재 서버 정보 및 지원하는 서블릿 API의 버전을 출력할 수 있다.
application 기본 객체는 현재 사용 중인 웹 컨테이너에 대한 정보를 읽어오는 메서드를 제공하고 있다.
프로그램 버전 관리 할 때, 소수점 형식으로 많이 쓴다.
예를 들어, 1.5라고 하면 1이 메이저 버전이고 5가 마이너 버전이다.
프로그램의 사용 성능이라든지 크게 바뀔 때 메이저 버진이 올라간다. 하지만 대부분 마이너 버전이 올라가다가 메이저 버전으로 바뀌는 식으로 된다.
getServerInfo()
: String
: 서버 정보를 구한다.
getMajorVersion()
: String
: 서버가 지원하는 서블릿 규약의 메이저 버전을 리턴한다.
: 버전의 정수 부분을 리턴한다.
getMinorVersion()
: String
: 서버가 지원하는 서블릿 규약의 마이너 버전을 리턴한다.
: 버전의 소수 부분을 리턴한다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>서버 정보 출력</title>
</head>
<body>
서버 정보: <%=application.getServerInfo() %><br>
서블릿 규약 메이저 버전: <%=application.getMajorVersion() %><br>
서블릿 규약 마이너 버전: <%=application.getMinorVersion() %><br>
</body>
</html>
서버 정보: Apache Tomcat/9.0.73
서블릿 규약 메이저 버전: 4
서블릿 규약 마이너 버전: 0
✔️ 웹 컨테이너가 사용하는 로그 파일에 로그 메시지 기록
특정한 상황이 되면 기록해 두었다가 로그들을 쭉 보면서 이런일이 있었구나 확인하는 용도로 사용된다. 특히 시스템에 예외가 생겼을 때 로그를 기록한다.
로그는 외부라이브러리를 많이 쓴다. 유지보수 관리 차원에서 로그를 지원한다.
❗️ 로깅: 로그를 남기는 행위
실제로 배포를 할 때는 파일로 남긴다.
log(String msg)
: void
: msg를 로그로 남긴다.
log(String msg, Throwable throwable)
: void
: msg를 로그로 남긴다.
: 익셉션 정보도 함께 로그에 기록한다.
JSP 페이지에서 웹 어플리케이션 폴더에 위치한 파일을 사용해야 할 때가 있다.
폴더에 위치한 텍스트 파일의 내용을 그대로 응답으로 출력하고 싶다. 이 경우 JSP 페이지는 절대경로를 사용하여 지정한 자원을 읽어올 수 있다.
<%@page import="java.io.IOException"%>
<%@page import="java.io.InputStreamReader"%>
<%@page import="java.io.FileInputStream"%>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>절대경로 사용하여 자원읽기</title>
</head>
<body>
<%
char[] buff = new char[128];
int len = -1;
String filePath = "C:\\test\\notice.txt";
FileInputStream fis = null;
InputStreamReader isr = null;
try {
fis = new FileInputStream(filePath);
isr = new InputStreamReader(fis);
while((len = isr.read(buff)) != -1) {
out.print(new String(buff, 0, len));
}
} catch(IOException e) {
out.println("익셉션 발생: " + e.getMessage() );
} finally {
try {
} catch(Exception e) {}
try {
fis.close();
} catch(Exception e) {}
}
%>
</body>
</html>
절대 경로를 사용해서 파일을 읽어오면 유지보수에 문제가 생길 수 있다.
예를 들어, 톰캣 버전을 8.0.21에서 8.0.22로 업그레이드했다고 가정해 보자.
이 경우 텍스트 파일의 절대경로가 다르게 시작하게 된다. 이렇게 경로를 변경해야 하는 JSP 파일 개수가 1~2개뿐이라면 문제가 없겠지만, 변경할 JSP 파일이 많다면 유지보수에 어려움을 겪게 된다.
application 기본 객체는 이런 문제를 해결할 수 있도록 웹 어플리케이션의 파일에 접근할 수 있는 메서드를 제공하고 있다.
getRealPath(String path)
: String
: 웹 어플리케이션 내에서 지정한 경로에 해당하는 자원의 시스템상에서의 경로를 리턴한다.
getResource(String path)
: java.net.URL
: 웹 어플리케이션 내에서 지정한 경로에 해당하는 자원에 접근할 수 있는 URL 객체를 리턴한다.
getResourceAsStream(String path) ⭐️
: java.io.InputStream
: 웹 어플리케이션 내에서 지정한 경로에 해당하는 자원으로부터 데이터를 읽어올 수 있는 InputStream
을 리턴한다.
이러한 메서드를 사용하면, 절대 경로를 사용하지 않고도 웹 어플리케이션 폴더의 파일에 접근할 수 있다.
경로를 웹 어플리케이션 내에 넣어준다.
<%@page import="java.io.IOException"%>
<%@page import="java.io.InputStreamReader"%>
<%@page import="java.io.InputStream"%>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>기본 객체 사용하여 자원 읽기</title>
</head>
<body>
<%
String resourcePath = "/message/notice.txt";
%>
자원의 실제경로: <%= application.getRealPath(resourcePath) %> <br>
<%= resourcePath %>의 내용 <br>
<%
char[] buff = new char[128];
int len = -1;
InputStream is = null;
InputStreamReader isr = null;
try {
is = application.getResourceAsStream(resourcePath);
isr = new InputStreamReader(is);
while( (len = isr.read(buff)) != -1 ) {
out.println(new String(buff, 0, len));
}
} catch(IOException e) {
out.println("익셉션 발생: " + e.getMessage() );
} finally {
try {
isr.close();
} catch(Exception e) {}
try {
is.close();
} catch(Exception e) {}
}
%>
</body>
</html>
/
: 루트를 의미. 어플리케이션의 내부 경로