관련글


application 기본 객체
웹 어플리케이션에 대한 정보를 다룰 수 있는 application 기본 객체를 이용하면 웹 어플리케이션상에 위치한 파일 자원을 편하게 얻어올 수 있습니다.



절대경로로 시스템상의 파일 가져오기
먼저 application 기본객체를 이용하지 않고 File IO(입출력)를 사용하여 서버가 구동중인 시스템상의(여기서는 윈도우) 위치의 텍스트 파일의 내용을 가져와서 콘솔에 출력해보도록 하겠습니다.
<%@page import="java.io.FileReader"%> 
<%@page import="java.io.BufferedReader"%> 
<%@page import="java.io.IOException"%> 
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> 
     
<!DOCTYPE html> 
<html> 
<head> 
     <meta charset="UTF-8"> 
</head> 
<body> 
     <
           BufferedReader reader = null
     
           String filePath = "C:\\studyspace\\tomcat_8.0.52\\webapps\\ROOT\\resources\\test.txt"
     
     
           try
                reader = new BufferedReader(new FileReader(filePath)); 
                
                while(true){ 
                     String str = reader.readLine();
                     
                     //더이상 파일 읽어올 파일의 내용이 없으면 break 
                     if(str == nullbreak
                     
                     System.out.println(str);
                }
                     
           }catch(IOException e){ 
                e.printStackTrace();
           }finally
                if(reader != null){ 
                     reader.close();
                }
           }
     %> 
</body> 
</html> 
cs


JSP 소스에 별다른 어려운 점은 없고 다음의 경로에 있는 파일을 읽어서 콘솔에 내용을 한 줄씩 출력하는 코드입니다. 문자열에는 \(역슬래시)를 이스케이프 처리 해주어야 해서 역슬래시를 각각 두 번 사용했습니다. 경로는 톰캣의 ROOT 웹 어플리케이션 하위의 resources\test.txt 파일입니다. JSP 파일 또한 ROOT 웹 어플리케이션 하위에 배포하였습니다.

중요한 점은 절대경로(시스템 상의 가장 최상위 경로부터 시작하는 경로 표현방법)로 파일의 경로를 지정해 주었다는 점입니다.
"C:\\studyspace\\tomcat_8.0.52\\webapps\\ROOT\\resources\\test.txt"                                
cs


test.txt 파일에는 단순히 별 내용 없는 한글을 저장해 두었습니다.



톰캣을 띄우고 JSP 페이지를 요청하면 다음과 같이 텍스트 파일의 내용이 출력됩니다.
이 파일은 단순한                                                                                
텍스프 파일입니다.
cs

 






어플리케이션에서 절대경로를 사용했을때의 문제점
절대경로를 사용해도 별 다른 문제업이 파일을 입력해오는데 별 이상은 없었습니다. 그러나 여기에는 단점이 존재하는데, 절대경로는 시스템이나 배포 환경에 따라 달라질 수 있다는 점입니다. 예를 들어 내가 개발한 어플리케이션이 기업 내에서 사용하는 직원들의 커뮤니케이션(예를 들어 웹 메신저 등의..) 어플리케이션이라고 가정했을때 우리는 이것을 여러 기업에게 판매하게 될 것입니다.

그러나 고객은 우리가 판매한 웹 어플리케이션을 설치하는 과정에서 시스템을 구성할때 서버를 C드라이브가 아닌 D드라이브에 설치할 수도 있고 심지어는 톰캣 버전이 다를수도 있으며, 더욱이 톰캣이 아닌 다른 서블릿 컨테이너를 사용할 수도 있습니다. 그렇게되면 이런식으로 자원들이 모여있는 경로를 절대경로로 지정해 주었을때 고객에게 판매할 때마다 하드코딩 되어있는 절대 경로 설정들을 고객에 맞게 모두 수정해주어야 할 것입입니다. 여기서는 JSP 페이지 하나에서만 사용되었지만 만약 웹 어플리케이션 전반에 걸쳐 절대경로를 사용하는 코드가 늘어난다면 매우 일이 번거로워 질 수 있습니다.





application 기본객체를 이용한 자원 가져오기
application 기본객체를 이용한다면 위와 같은 문제점들을 해결할 수 있는데, appilcation 기본객체는 다음과 같은 메서드들을 제공하고 있습니다.
메서드
반환타입
설명
getRealPath(String realPath)
String
웹 어플리케이션 내에서의 경로를 매개변수로 넘겨주면 시스템상에서의 절대 경로로 바꾸어 반환합니다.
getResource(String path)
java.net.URL
웹 어플리케이션 내에서의 경로를 매개변수로 넘겨주면 해당 경로에 대한 URL 객체를 만들어 반환합니다.
getResourceAsStream(String path)
java.io.InputStream
웹 어플리케이션 내에서의 경로를 매개변수로 넘겨주면 해당 경로의 자원을 읽을 수 있는 InputStream을 반환합니다.

웹 어플리케이션을 기준으로 상대경로
웹 어플리케이션 경로는 [톰캣 경로]/webapps/[웹어플리케이션]/ 하위의 경로입니다.
즉 [톰캣 경로]/webapps/ROOT/resources/test.txt 라는 파일은 ROOT 어플리케이션 하위에 있는 자원이며
웹어플리케이션을 기준으로는 /resources/test.txt 로 표현할 수 있습니다.
cs



변경한 JSP 소스
<%@page import="java.io.FileReader"%> 
<%@page import="java.io.BufferedReader"%> 
<%@page import="java.io.IOException"%> 
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>             
     
<!DOCTYPE html> 
<html> 
<head> 
     <meta charset="UTF-8"> 
</head> 
<body> 
     <
           BufferedReader reader = null
     
           String filePath = "/resources/test.txt"
           String realPath = application.getRealPath(filePath);
     
           try
                reader = new BufferedReader(new FileReader(realPath)); 
                
                while(true){ 
                     String str = reader.readLine();
                     
                     //더이상 파일 읽어올 파일의 내용이 없으면 break 
                     if(str == nullbreak
                     
                     System.out.println(str);
                }
                     
           }catch(IOException e){ 
                e.printStackTrace();
           }finally
                if(reader != null){ 
                     reader.close();
                }
           }
     %> 
</body> 
</html> 
cs


이전과 비교해서 변경된 부분은 FileReader를 생성할 때 경로를 지정하는 방법입니다. 절대경로가 아닌 application 기본객체를 이용하였습니다. 또 한가지는 윈도우 시스템에 맞춰 역슬래시를 사용한 것이 아닌 / 슬래시를 사용했다는 점 입니다. 이렇게 되면 운영체제에 독립적이고 유연하게 경로를 설정할 수 있습니다.
String filePath = "/resources/test.txt"
String realPath = application.getRealPath(filePath); //각 시스템에 맞게 경로를 바꾸어 반환됨        
cs



getResourceAsStream() 메서드를 사용하면 다음과 같이 바꿀 수 있습니다.
<%@page import="java.io.BufferedInputStream"%> 
<%@page import="java.io.FileReader"%> 
<%@page import="java.io.BufferedReader"%> 
<%@page import="java.io.IOException"%> 
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>     
     
<!DOCTYPE html> 
<html> 
<head> 
     <meta charset="UTF-8"> 
</head> 
<body> 
     <% 
           BufferedInputStream input = null
           byte[] buffer = new byte[128]; 
           String filePath = "/resources/test.txt"
     
           try
                input = new BufferedInputStream(application.getResourceAsStream(filePath)); 
                
                int len = -1
                while((len = input.read(buffer)) != -1){ 
                     
                     System.out.println(new String(buffer, 0, len)); 
                }
                     
           }catch(IOException e){ 
                e.printStackTrace();
           }finally
                if(input != null){ 
                     input.close();
                }
           }
     %> 
</body> 
</html> 
 
cs



마지막으로 getResource() 메서드를 통해 URL을 반환하여 이용하는 경우 위의 코드를 다음과 같이 바꿀 수 있습니다.
URL url = application.getResource(filePath);
input = new BufferedInputStream(url.openStream());                                             
cs



블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

댓글을 달아 주세요! 질문 환영합니다!