본문 바로가기
프로그래밍/Back-end

자바에서 경로 다루기: File, Request, Session을 활용한 경로 처리 방법

by @GodWin 2024. 11. 12.

-

 
-
자바로 웹 애플리케이션을 만들다 보면, 파일 경로를 제대로 다루는 것이 정말 중요해요.
예를 들어, 파일 업로드나 다운로드를 구현하거나 웹 애플리케이션 내에서 특정 파일을 참조할 때 경로 처리가 잘못되면 예상치 못한 오류가 발생할 수 있죠.
그래서 오늘은 자바에서 파일 경로를 다루는 방법을 File, Request, Session을 기준으로 알아보려고 해요.


File 클래스를 이용한 경로 처리
자바에서는 File 클래스를 이용해서 파일 경로를 다룰 수 있어요.
File 클래스를 사용하면 현재 경로를 절대경로나 상대경로로 쉽게 알 수 있습니다.

절대경로 (Absolute Path)
절대경로는 파일 시스템의 루트부터 시작하는 완전한 경로에요.
예를 들어, Windows에서는 C:\Users\Username\Documents\file.txt처럼, Unix 계열에서는 /home/username/file.txt처럼 말이죠.
File 클래스에서 getAbsolutePath() 메서드를 사용하면 파일의 절대경로를 쉽게 얻을 수 있어요.

import java.io.File;

public class FilePathExample {
    public static void main(String[] args) {
        File path = new File("");  // 현재 디렉터리
        System.out.println(path.getAbsolutePath());  // 절대경로 출력
    }
}




상대경로 (Relative Path)
상대경로는 현재 작업 디렉터리(CWD)를 기준으로 한 경로예요.
예를 들어, 현재 작업 중인 폴더에서 다른 폴더로 이동하거나 파일을 찾을 때 상대경로를 사용할 수 있어요.
getCanonicalPath()는 파일 시스템에서 실제로 존재하는 경로를 반환하는데, 보통 절대경로와 비슷한 결과를 얻을 수 있습니다.

import java.io.File;

public class FilePathExample {
    public static void main(String[] args) {
        File path = new File("");  // 현재 디렉터리
        System.out.println(path.getCanonicalPath());  // 실제 경로 출력
    }
}




Request 객체를 이용한 경로 처리
웹 애플리케이션에서는 HttpServletRequest 객체를 통해 서버 내에서 실제 경로를 얻을 수 있어요.
웹 애플리케이션의 파일 시스템에서 실제 파일 경로를 알아야 할 때 유용한 방법이죠.

서블릿 컨텍스트 경로 얻기
request.getServletContext().getRealPath("경로") 메서드를 사용하면, 웹 애플리케이션의 실제 디렉터리 경로를 얻을 수 있어요.
예를 들어, "/WEB-INF/classes/config.properties" 파일의 절대경로를 얻고 싶다면 아래와 같이 사용하면 됩니다.

import javax.servlet.http.HttpServletRequest;

public class RequestPathExample {
    public void getRealPath(HttpServletRequest request) {
        String realPath = request.getServletContext().getRealPath("/WEB-INF/classes/config.properties");
        System.out.println(realPath);  // 실제 경로 출력
    }
}




Request와 Session 객체를 이용한 경로 처리
세션을 이용해 경로를 처리하는 방법도 있어요.
HttpSession 객체를 사용하면 현재 세션과 관련된 정보를 바탕으로 경로를 처리할 수 있습니다.
이렇게 하면, 사용자별로 다른 경로를 동적으로 다룰 수 있겠죠.

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

public class SessionPathExample {
    public void getRealPathFromSession(HttpServletRequest request) {
        HttpSession session = request.getSession();
        String realPath = session.getServletContext().getRealPath("/WEB-INF/classes/config.properties");
        System.out.println(realPath);  // 실제 경로 출력
    }
}


이 방법은 request.getServletContext().getRealPath()와 비슷하지만, 세션 정보를 이용할 수 있기 때문에 조금 더 유연한 처리가 가능해요.



경로 처리 시 주의할 점!
상대경로와 절대경로 차이:

상대경로는 현재 작업 디렉터리를 기준으로 하므로, 실행 위치에 따라 다르게 동작할 수 있어요. 그래서 항상 현재 작업 디렉터리를 정확히 알고 있는 게 중요해요.
절대경로는 시스템의 루트부터 시작하는 경로라, 어디서 실행해도 동일한 파일을 참조할 수 있죠.


getRealPath()와 배포 환경:

getRealPath()는 실제 경로를 반환하지만, WAR 파일로 배포된 애플리케이션에서는 이 메서드가 null을 반환할 수 있어요. 이는 WAR 파일이 서버에 배포된 상태에서는 파일 시스템에 직접 접근할 수 없기 때문이에요. 그래서 배포 환경에서는 경로를 다룰 때 주의가 필요합니다.


서버와 파일 시스템의 차이:

운영체제마다 파일 경로 구분자가 다르죠. Windows는 \, Unix 계열은 /를 사용해요. 자바는 이를 자동으로 처리하지만, 경로를 하드코딩할 때는 이 점을 유의해야 해요.

 

자바에서 파일 경로를 다루는 방법은 File, Request, Session을 이용한 다양한 방식이 있어요.
상황에 맞게 적절한 방법을 사용하면 파일 경로 문제를 쉽게 해결할 수 있답니다.
예를 들어, 로컬 파일 경로가 필요하다면 File 클래스를, 웹 애플리케이션에서 서버 경로가 필요하면 request.getServletContext().getRealPath()를 사용하면 돼요.


이 글을 통해 자바에서 경로를 다루는 데 조금 더 익숙해지셨으면 좋겠어요. 
실습을 통해 조금씩 경로 처리에 자신감을 얻어가세요!
 

추가 참고 URL : 
https://logger-debug.tistory.com/entry/%EC%9E%90%EB%B0%94%EC%97%90%EC%84%9C-%EC%84%9C%EB%B2%84%EC%9D%98-%ED%98%B8%EC%8A%A4%ED%8A%B8%EB%AA%85%EC%9D%84-%EA%B0%80%EC%A0%B8%EC%98%A4%EB%8A%94-%EB%B0%A9%EB%B2%95 

 

자바에서 서버의 호스트명을 가져오는 방법

- -자바를 사용하다 보면, 서버의 호스트명(혹은 로컬 머신의 호스트명)을 가져와야 할 때가 있습니다. 그럴 때 사용할 수 있는 두 가지 방법을 소개할게요. 바로 InetAddress 클래

logger-debug.tistory.com