[JSP] application 기본 객체

Jeini·2023년 4월 23일
0

🌐 JSP

목록 보기
11/24
post-thumbnail

✔️ 웹 어플리케이션 전반에 걸쳐서 사용되는 정보를 담고 있다.

특정 웹 어플리케이션에 포함된 모든 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해줘야 한다.

📎 web.xml

✔️ 웹 어플리케이션을 위한 설정 정보를 담고 있는 파일

  • 다른말로 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>

/: 루트를 의미. 어플리케이션의 내부 경로

profile
Fill in my own colorful colors🎨

0개의 댓글