2023. 7. 25. 13:50ㆍ프로그래밍/웹 개발
프로젝트를 하다 보면 파일을 업로드하고 img 파일의 경로를 설정하기 위해서 getContextPath() 및 getServletContext() 메서드를 사용할 일이 종종 있다. 이 메서드들의 차이는 무엇이고 각 메서드가 어떤 경로를 불러오는지, 그 경로를 통해 어떻게 파일에 접근하는지에 대해 알아보자.
System.out.println("getContextPath : " + request.getContextPath());
ServletContext context = request.getSession().getServletContext();
System.out.println("servlet context : " + context.getRealPath("") );
컨트롤러에 위 코드를 작성하고 콘솔창 출력을 확인해보면 위와 같이 출력된다. 코드를 보면 알 수 있듯이 getContextPath()는 프로젝트 이름에 의한 artifact_id 를 뜻한다. server를 설정할 때(필자의 경우 Tomcat) context를 설정할 수 있는데 그 경로가 바로 저것이다.
servlet context는 웹 서버에서 페이지를 처리하기 위해 서블릿이 기본경로로 잡고 있는 폴더를 뜻한다.
물리 경로로는 webapp까지의 경로와 sever실행시에는 target폴더의 SNAPSHOT 폴더까지의 경로가 동일하다고 보면 된다.
우리가 일반적으로 프로젝트를 실행시킬때는 다음과 같이 포트번호를 포함한 localhost:8080( = 현재 사용하고 있는 네트워크의 ip 주소) + context(프로젝트 생성시 설정한 추가 경로 = kurly_answer_war_exploded) 의 구조로 기본경로를 가지는 것을 알 수 있다.
즉 localhost:8080은 servlet context의 경로를 나타내고 kurly_answer_war_exploded는 context를 뜻한다.
getRealPath는 이때 servlet-context의 경로를 가져오는 메서드이고 이 때 인자로 문자열을 설정하면 뒤에 추가적으로 경로가 따라붙는 식이다.
따라서 서버에서 직접 내 컴퓨터의 파일(target폴더 혹은 out폴더) 폴더에 저장하기 위해서는 다음과 같이 작성한다.
ServletContext context = request.getSession().getServletContext();
String saveFolder = "/resources/file";
String uploadPath = context.getRealPath(saveFolder);
이렇게 설정하면 내 서버상의 기본 소스경로와 context경로가 합쳐진 경로이기 때문에 서버에서 업로드한 파일이 내 local PC(서버)의 절대경로로 파일이 저장되게 된다.
jsp파일에서 해당 경로에 접근하기 위해서는 다음과 같이 설정한다.
<img src="${contextPath}/resources/img/logo.png" height="80">
${} el태그를 이용한 contextPath는 컨트롤러에서 request.getContextPath()의 결과값으로 설정했다.
즉 위 img태그의 src를 풀어쓰자면
주소창의 URL로 접근한 것과 같은 것이다. 물론 실제 target폴더의 계층구조에는 context이름을 가진 폴더가 존재하지 않지만 서버상에서는 servlet context뒤에 context를 붙인 후에야 snapshop폴더로 접근할 수 있음을 알 수 있다.
아마도 servlet-context의 경로는 snapshot폴더까지이지만 프로젝트의 context까지 붙여줘야 비로소 안쪽의 리소스들에 접근할 수 있는듯하다.
'프로그래밍 > 웹 개발' 카테고리의 다른 글
[Spring-Boot] gradle 프로젝트 리소스 파일 수정 후 변경사항 적용 안되는 문제 해결 (0) | 2023.08.19 |
---|---|
Intellij로 spring boot 프로젝트 설치부터 생성까지 (0) | 2023.08.17 |
[spring] 웹 서버에서 img를 로드하지 못하는 문제 해결 (0) | 2023.07.24 |
[Spring] log4j.xml 추가하기 (콘솔창에서 로그내역 확인하기) (0) | 2023.07.15 |
[Spring] Intellij에서 Spring 프로젝트 생성 (1) | 2023.07.13 |