리소스에 접근하는 방법

2025. 3. 14. 05:37·개발/servlet
 
  1. 클래스 로더(Class Loader)를 통한 접근: 클래스패스에 있는 리소스를 로드하는 데 사용.
  2. 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
'개발/servlet' 카테고리의 다른 글
  • 리스너(Listener)
  • 필터(Filter)
  • PRG(Post-Redirect-Get) 패턴
  • MVC 패턴
함수형 인간
함수형 인간
잘 까먹는 개발자의 두뇌 확장 장치
  • 함수형 인간
    개발 기록 노트
    함수형 인간
  • 글쓰기 관리
  • 전체
    오늘
    어제
    • 글 목록 (84)
      • 기타 (1)
      • 개발 (82)
        • Java (6)
        • Javascript (1)
        • Spring (20)
        • jQuery (0)
        • Git (0)
        • servlet (11)
        • JSP (6)
        • HTML (0)
        • CSS (10)
        • SQL (9)
        • JSTL (3)
        • Mybatis (4)
        • Design Patterns (0)
        • HTTP (2)
        • Devtools (0)
        • IntelliJ (5)
        • JDBC (1)
        • Lombok (3)
        • Logging (1)
      • 책 리뷰 (0)
  • hELLO· Designed By정상우.v4.10.3
함수형 인간
리소스에 접근하는 방법
상단으로

티스토리툴바