- 클래스 로더(Class Loader)를 통한 접근: 클래스패스에 있는 리소스를 로드하는 데 사용.
- ServletContext를 통한 접근: 웹 애플리케이션 환경에서 웹 애플리케이션 루트 디렉토리의 리소스에 접근하는 데 사용.
1. 클래스 로더를 통한 접근 (Class Loader)
클래스 로더는 Java 클래스를 로드하는 역할을 하며, 클래스패스에 있는 리소스(텍스트 파일, 이미지, 설정 파일 등)를 찾는 데에도 사용될 수 있다.
방법:
Class.getResourceAsStream(String name):
- 주어진 이름의 리소스를 찾아서 InputStream으로 반환.
- name은 리소스의 경로를 나타내며, /로 시작하면 절대 경로(클래스패스 루트 기준), / 없이 시작하면 상대 경로(해당 클래스가 속한 패키지 기준)로 해석.
- 리소스를 찾지 못하면 null을 반환.
Java
// MyClass.class와 같은 패키지에 있는 resource.txt를 읽음
InputStream is = MyClass.class.getResourceAsStream("resource.txt");
// 클래스패스 루트의 config/data.xml을 읽음
InputStream is2 = MyClass.class.getResourceAsStream("/config/data.xml");
ClassLoader.getResourceAsStream(String name):
- 클래스 로더를 직접 사용하여 리소스를 찾는다.
- name은 항상 클래스패스 루트를 기준으로 하는 절대 경로.
Java
ClassLoader classLoader = MyClass.class.getClassLoader();
InputStream is = classLoader.getResourceAsStream("config/data.xml");
ClassLoader.getResources(String name):
- 클래스 로더를 사용하여, 주어진 이름과 일치하는 모든 리소스를 찾고 Enumeration<URL>형태로 반환
Java
ClassLoader classLoader = MyClass.class.getClassLoader();
Enumeration<URL> resources = classLoader.getResources("META-INF/services/java.sql.Driver");
장점:
- JAR 파일 안에 포함된 리소스도 쉽게 접근할 수 있다.
- 클래스패스에 있는 리소스에 대한 플랫폼 독립적인 접근 방식을 제공.
주의 사항:
- 클래스 로더는 리소스를 읽기 전용으로만 접근할 수 있다. 리소스를 수정할 수 없다.
2. ServletContext를 통한 접근 (웹 애플리케이션)
ServletContext는 웹 애플리케이션의 컨텍스트 정보를 제공하며, 웹 애플리케이션 루트 디렉토리에 있는 리소스에 접근하는 데 사용.
방법:
ServletContext.getResourceAsStream(String path):
- 주어진 경로(path)에 있는 리소스를 InputStream으로 반환.
- path는 웹 애플리케이션 루트 디렉토리를 기준으로 하는 상대 경로이며, 반드시 /로 시작해야 한다.
- 리소스를 찾지 못하면 null을 반환.
Java
@WebServlet("/myServlet")
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
ServletContext context = getServletContext(); // 또는 req.getServletContext()
InputStream is = context.getResourceAsStream("/WEB-INF/data.xml");
// ... 리소스 사용 ...
}
}
ServletContext.getResource(String path):
- 주어진 경로에 있는 리소스를 URL 객체로 반환.
Java
ServletContext context = getServletContext();
URL resourceURL = context.getResource("/images/logo.png");
ServletContext.getResourcePaths(String path):
- ServletContext에서 주어진 디렉토리 경로 아래의 모든 리소스 경로를 Set<String>형태로 반환.
Java
ServletContext context = getServletContext();
Set<String> resourcePaths = context.getResourcePaths("/WEB-INF/");
장점:
- 웹 애플리케이션 루트 디렉토리에 있는 리소스에 쉽게 접근할 수 있다.
- 웹 애플리케이션 배포 구조에 맞는 리소스 관리 방식을 제공.
주의 사항:
- ServletContext를 통한 리소스 접근은 웹 애플리케이션 환경에서만 가능. 일반 Java 애플리케이션에서는 사용할 수 없다.
- WEB-INF 디렉토리 아래의 리소스는 웹 브라우저에서 직접 접근할 수 없다.
정리
방법사용 환경경로 해석반환 타입특징
Class.getResourceAsStream() | 모든 Java 애플리케이션 | /로 시작: 클래스패스 루트 기준, / 없음: 해당 클래스의 패키지 기준 | InputStream | 클래스패스에 있는 리소스 접근, JAR 파일 안의 리소스도 접근 가능 |
ClassLoader.getResourceAsStream() | 모든 Java 애플리케이션 | 클래스패스 루트 기준 | InputStream | 클래스패스에 있는 리소스 접근, JAR 파일 안의 리소스도 접근 가능 |
ClassLoader.getResources() | 모든 Java 애플리케이션 | 클래스패스 루트 기준 | Enumeration<URL> | 클래스패스에 있는 동일한 이름의 리소스들을 모두 접근 |
ServletContext.getResourceAsStream() | 웹 애플리케이션 | 웹 애플리케이션 루트 디렉토리 기준 (/로 시작) | InputStream | 웹 애플리케이션 루트 디렉토리에 있는 리소스 접근, WEB-INF 아래의 리소스도 접근 가능 |
ServletContext.getResource() | 웹 애플리케이션 | 웹 애플리케이션 루트 디렉토리 기준 (/로 시작) | URL | 웹 애플리케이션 루트 디렉토리에 있는 리소스 접근 |
ServletContext.getResourcePaths() | 웹 애플리케이션 | 웹 애플리케이션 루트 디렉토리 기준(/로 시작, 해당 path는 디렉토리여야 함.) | Set<String> | 주어진 디렉토리 경로의 모든 리소스 path를 반환 |
이 두 가지 방법을 적절히 활용하면 Java 애플리케이션에서 다양한 위치에 있는 리소스를 효율적으로 관리하고 사용할 수 있다.
'개발 > servlet' 카테고리의 다른 글
리스너(Listener) (0) | 2025.03.13 |
---|---|
필터(Filter) (0) | 2025.03.13 |
PRG(Post-Redirect-Get) 패턴 (0) | 2025.03.05 |
MVC 패턴 (0) | 2025.03.05 |
HttpSession 과 Cookie 인터페이스 정리 (0) | 2025.03.05 |