본문 바로가기
■Development■/《Web》

[Web] JSP / Servlet/ Java 에서 현재 경로 알아내는 방법 완벽 가이드

by 은스타 2020. 4. 8.
반응형

웹 개발 시 JSP/Servlet/Java에서 현재 경로 알아내는 방법 완벽 가이드

웹 개발을 하다 보면 현재 작업 중인 파일이나 디렉토리의 경로를 알아내야 하는 상황이 자주 발생합니다. JSP, Servlet, Java 각 환경에서 현재 경로를 알아내는 방법은 조금씩 다릅니다. 이 글에서는 각 환경별로 현재 경로를 쉽고 정확하게 알아내는 방법을 상세히 알아보겠습니다.


목차

  1. Java에서 현재 경로 알아내기
  2. JSP에서 현재 경로 알아내기
  3. Servlet에서 현재 경로 알아내기
  4. 상대 경로와 절대 경로 이해하기
  5. 자주 발생하는 문제와 해결 방법

 

#1. Java에서 현재 경로 알아내기

일반 Java 애플리케이션에서는 다양한 방법으로 현재 작업 디렉토리와 클래스 경로를 알아낼 수 있습니다.

1. 현재 작업 디렉토리(Working Directory) 얻기

// 방법 1: System.getProperty() 사용
String currentPath = System.getProperty("user.dir");
System.out.println("현재 작업 디렉토리: " + currentPath);

// 방법 2: java.nio.file.Paths 사용 (Java 7 이상)
import java.nio.file.Paths;
String currentPath = Paths.get("").toAbsolutePath().toString();
System.out.println("현재 작업 디렉토리: " + currentPath);

// 방법 3: new File("").getAbsolutePath() 사용
import java.io.File;
String currentPath = new File("").getAbsolutePath();
System.out.println("현재 작업 디렉토리: " + currentPath);

2. 클래스 파일 위치 얻기

// 현재 클래스 파일의 위치 얻기
URL location = MyClass.class.getProtectionDomain().getCodeSource().getLocation();
System.out.println("클래스 위치: " + location.getPath());

// 클래스 로더를 통해 리소스 위치 얻기
URL resourceUrl = MyClass.class.getClassLoader().getResource(".");
System.out.println("리소스 루트 위치: " + resourceUrl.getPath());

// 특정 리소스 파일 위치 얻기
URL configFile = MyClass.class.getClassLoader().getResource("config.properties");
System.out.println("설정 파일 위치: " + configFile.getPath());

3. 클래스패스 내 모든 경로 출력하기

// 클래스패스 내 모든 경로 출력
String classpath = System.getProperty("java.class.path");
String[] classpathEntries = classpath.split(File.pathSeparator);
System.out.println("클래스패스 항목:");
for (String path : classpathEntries) {
    System.out.println(path);
}

 

#2. JSP에서 현재 경로 알아내기

JSP에서는 웹 애플리케이션의 컨텍스트 관련 경로를 알아내는 방법이 다양합니다.

1. 웹 애플리케이션 루트 경로 얻기

<%
// 웹 애플리케이션의 실제 파일시스템 경로
String realPath = application.getRealPath("/");
out.println("웹 애플리케이션 실제 경로: " + realPath + "<br>");

// 컨텍스트 경로 (URL 상의 경로)
String contextPath = request.getContextPath();
out.println("컨텍스트 경로: " + contextPath + "<br>");

// 현재 JSP 파일의 실제 경로
String jspRealPath = application.getRealPath(request.getServletPath());
out.println("현재 JSP 파일 실제 경로: " + jspRealPath + "<br>");

// 현재 JSP 파일의 URI
String jspUri = request.getRequestURI();
out.println("현재 JSP URI: " + jspUri + "<br>");

// 현재 JSP 파일이 있는 디렉토리의 실제 경로
String jspDirRealPath = new java.io.File(application.getRealPath(request.getServletPath())).getParent();
out.println("현재 JSP 디렉토리 실제 경로: " + jspDirRealPath + "<br>");
%>

2. 상대 URL 생성하기

<%
// 현재 페이지 기준 상대 URL 생성
String currentUrl = request.getRequestURL().toString();
String baseUrl = currentUrl.substring(0, currentUrl.lastIndexOf("/"));
out.println("현재 URL 기준 상대 경로: " + baseUrl + "<br>");

// 웹 애플리케이션 루트 기준 절대 URL 생성
String absoluteUrl = request.getScheme() + "://" + request.getServerName() + ":" + 
                    request.getServerPort() + request.getContextPath();
out.println("웹 애플리케이션 루트 URL: " + absoluteUrl + "<br>");
%>

3. pageContext 객체 활용하기

<%
// pageContext를 사용한 컨텍스트 경로 얻기
String contextPath2 = pageContext.getServletContext().getContextPath();
out.println("pageContext를 통한 컨텍스트 경로: " + contextPath2 + "<br>");

// 현재 서블릿 경로
String servletPath = pageContext.getRequest().getServletPath();
out.println("현재 서블릿 경로: " + servletPath + "<br>");
%>

 

#3. Servlet에서 현재 경로 알아내기

Servlet에서는 HttpServletRequest와 ServletContext 객체를 통해 다양한 경로 정보를 얻을 수 있습니다.

1. 기본적인 경로 정보 얻기

protected void doGet(HttpServletRequest request, HttpServletResponse response) 
        throws ServletException, IOException {

    PrintWriter out = response.getWriter();

    // 컨텍스트 경로
    String contextPath = request.getContextPath();
    out.println("컨텍스트 경로: " + contextPath + "<br>");

    // 서블릿 경로
    String servletPath = request.getServletPath();
    out.println("서블릿 경로: " + servletPath + "<br>");

    // 웹 애플리케이션 실제 경로
    ServletContext context = getServletContext();
    String realPath = context.getRealPath("/");
    out.println("웹 애플리케이션 실제 경로: " + realPath + "<br>");

    // 현재 서블릿의 실제 경로
    String servletRealPath = context.getRealPath(servletPath);
    out.println("현재 서블릿 실제 경로: " + servletRealPath + "<br>");
}

2. URL 관련 정보 얻기

protected void doGet(HttpServletRequest request, HttpServletResponse response) 
        throws ServletException, IOException {

    PrintWriter out = response.getWriter();

    // 요청 URL
    StringBuffer requestURL = request.getRequestURL();
    out.println("요청 URL: " + requestURL.toString() + "<br>");

    // 요청 URI
    String requestURI = request.getRequestURI();
    out.println("요청 URI: " + requestURI + "<br>");

    // 쿼리 스트링
    String queryString = request.getQueryString();
    out.println("쿼리 스트링: " + queryString + "<br>");

    // 전체 URL (쿼리 스트링 포함)
    String fullURL = requestURL.toString();
    if (queryString != null) {
        fullURL += "?" + queryString;
    }
    out.println("전체 URL: " + fullURL + "<br>");
}

3. 서버 정보 얻기

protected void doGet(HttpServletRequest request, HttpServletResponse response) 
        throws ServletException, IOException {

    PrintWriter out = response.getWriter();

    // 서버 이름
    String serverName = request.getServerName();
    out.println("서버 이름: " + serverName + "<br>");

    // 서버 포트
    int serverPort = request.getServerPort();
    out.println("서버 포트: " + serverPort + "<br>");

    // 프로토콜
    String scheme = request.getScheme();
    out.println("프로토콜: " + scheme + "<br>");

    // 서버 기본 URL
    String serverBaseURL = scheme + "://" + serverName + ":" + serverPort;
    out.println("서버 기본 URL: " + serverBaseURL + "<br>");
}

 

#4. 상대 경로와 절대 경로 이해하기

웹 개발에서 경로를 다룰 때는 상대 경로와 절대 경로의 차이를 이해하는 것이 중요합니다.

1. 절대 경로 vs 상대 경로

<%
// 절대 경로 (컨텍스트 루트부터 시작)
String absolutePath = request.getContextPath() + "/resources/css/style.css";
out.println("절대 경로: " + absolutePath + "<br>");

// 상대 경로 (현재 페이지 기준)
String relativePath = "./resources/css/style.css";
out.println("상대 경로: " + relativePath + "<br>");

// 상위 디렉토리로 이동하는 상대 경로
String parentRelativePath = "../images/logo.png";
out.println("상위 디렉토리 상대 경로: " + parentRelativePath + "<br>");
%>

2. 경로 조합하기

// Java에서 경로 조합하기 (java.nio.file.Paths 사용)
import java.nio.file.Path;
import java.nio.file.Paths;

public void combinePaths() {
    Path basePath = Paths.get("/var/www/html");
    Path combinedPath = basePath.resolve("resources/images");
    System.out.println("조합된 경로: " + combinedPath.toString());

    // 상위 디렉토리 참조하기
    Path parentPath = combinedPath.getParent();
    System.out.println("부모 경로: " + parentPath.toString());
}

 

#5. 자주 발생하는 문제와 해결 방법

1. 경로에 공백이나 특수문자가 포함된 경우

// URL 인코딩 사용하기
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;

String pathWithSpaces = "/path with spaces/file name.txt";
String encodedPath = URLEncoder.encode(pathWithSpaces, StandardCharsets.UTF_8.toString());
System.out.println("인코딩된 경로: " + encodedPath);

// 디코딩하기
import java.net.URLDecoder;
String decodedPath = URLDecoder.decode(encodedPath, StandardCharsets.UTF_8.toString());
System.out.println("디코딩된 경로: " + decodedPath);

2. 운영체제별 경로 구분자 처리

// File.separator 사용하기
String osIndependentPath = "resources" + File.separator + "images" + File.separator + "logo.png";
System.out.println("OS 독립적 경로: " + osIndependentPath);

// Path 클래스 사용하기
Path osIndependentPath2 = Paths.get("resources", "images", "logo.png");
System.out.println("Path 클래스 사용 경로: " + osIndependentPath2.toString());

3. 웹 애플리케이션 배포 시 경로 문제

// ServletContext를 통해 실제 경로 얻기
public void getRealPathInProduction(ServletContext context) {
    // 개발 환경과 운영 환경에서 모두 작동
    String resourcePath = context.getRealPath("/WEB-INF/config.properties");
    System.out.println("설정 파일 실제 경로: " + resourcePath);

    // 클래스로더를 통해 리소스 접근하기
    URL resourceUrl = getClass().getClassLoader().getResource("config.properties");
    if (resourceUrl != null) {
        System.out.println("리소스 URL: " + resourceUrl.getPath());
    }
}

4. 클래스패스와 웹 경로 혼동 방지

public void distinguishClasspathAndWebPath(ServletContext context) {
    // 클래스패스 내 리소스 접근
    InputStream classpathResource = getClass().getClassLoader().getResourceAsStream("config.properties");

    // 웹 애플리케이션 내 리소스 접근
    String webResourcePath = context.getRealPath("/WEB-INF/config.properties");
    InputStream webResource = null;
    try {
        webResource = new FileInputStream(webResourcePath);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }

    // 사용 후 리소스 닫기
    try {
        if (classpathResource != null) classpathResource.close();
        if (webResource != null) webResource.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

결론

JSP, Servlet, Java 각 환경에서 현재 경로를 알아내는 방법은 조금씩 다르지만, 기본 원리를 이해하면 웹 개발을 더 효율적으로 할 수 있습니다. 특히 웹 애플리케이션에서는 상대 경로와 절대 경로의 차이를 이해하고, 실제 파일 시스템 경로와 웹 URL 경로를 적절히 구분하여 사용하는 것이 중요합니다.

이 가이드에서 다룬 방법을 활용하면 다양한 환경에서 정확하게 경로를 처리할 수 있으며, 경로 관련 문제를 효과적으로 해결할 수 있을 것입니다. 웹 개발 시 발생하는 경로 관련 문제의 대부분은 환경 차이와 경로 표기법의 혼동에서 오므로, 이를 명확히 이해하고 적용하는 것이 중요합니다.

긴 글 읽어주셔서 감사합니다.

끝.

반응형