2023. 6. 29. 09:14ㆍ프로그래밍/웹 개발
<img src="test/test.jpg" alt="">
HTML코드에서 img태그에서 src 항목에 파일의 경로를 입력한다.
그러나 서버에 파일을 올릴 때 여러가지 의문점과 문제점이 생겼고 다음과 같다.
문제상황 : Tomcat과 JSP를 이용해 서버에 올라온 파일의 경로를 이용해 웹 서버에 띄우는 원리가 이해가 되지 않음. 예를 들어 다음과 같은 소스 폴더 계층구조가 있을 때 참조가 다음과 같았다.
물리 경로(실제 로컬 pc의 경로를 뜻함) : web > JSP_File > bookstore > imageFileSave
여기서 imageFileSave에는 그 어떤 이미지 소스도 포함하고 있지 않은데도 불구하고 다음과 같이 작성시 서버에 올라온 img파일을 사용할 수 있었다.
<img src="imageFileSave/01.jpg" alt="">
이것이 어떻게 가능할까? 우선 서버에 올라온 이미지 파일이 어떤 식으로 형성되는지 알 필요가 있다.
우리가 어떤 홈페이지의 url을 통해 사진파일의 경로를 설정하는 것은 서버가 동작하고 있는 상태에서 그 폴더에 접근해 사진 파일을 가져오는 것이다. 이것을 냐 컴퓨터에서도 동일하게 실행해보자.
localhost:(설정한포트번호)/파일경로 다음과 같은 url이 있다고 했을 때 localhost : 포트번호는 내가 구동하고 있는 웹 서버상의 기본으로 설정된 폴더 경로를 뜻한다. 한 번 확인해보자.
String realFolder = "";
// 파일이 업로드 되는 폴더를 지정한다.
//String saveFolder = "JSP_File/01_file_basic";
// 인코딩 타입
String encType = "utf-8";
// 최대 업로드 될 파일의 크기
int maxSize = 5 * 1024 * 1024;
// 현재 jsp 페이지의 웹 어플리케이션 상의 경로를 구한다.
ServletContext context = request.getServletContext();
realFolder = context.getRealPath("");
out.println("the real path is : " + realFolder + "<br>");
웹 서버를 구동한 다음 다음과 같이 코드를 작성하게 되면 홈페이지에 실제 서버상의 default 경로를 알 수 있다.
Intellij 기준으로 java 프로젝트에서 볼 수 있는 out폴더는 프로젝트 폴더 내의 소스 파일이나 리소스들의 수정사항을 그대로 반영한 채 가지고 있는 폴더이다. 이 out폴더가 즉 컴파일과 수정사항이 적용된 후의 서버에서 동작하고 있는 리소스 및 소스 파일들을 가지고 있는 폴더가 되는 것이다. 그리고 이 경로를 MultiParatRequest 클래스의 객체를 통해 전달받은 파일의 기본 경로로 설정할 수 있다.
다음과 같이 파일을 전달받았다고 해보자.
<form action="01_fileUpload.jsp" name="fileForm" method="post" enctype="multipart/form-data">
작성자 : <input type="text" name="user"><br>
제목 : <input type="text" name="title"><br>
파일명1 : <input type="file" name="uploadfile1"><br>
<input type="submit" value="파일올리기">
</form>
input 태그의 file type은 일반적인 request 객체로는 받지 못하고 MultipartRequest객체를 통해 가져올 수 있다.
MultipartRequest를 사용 시 form태그내의 일반적인 데이터(name = value)뿐만 아니라 파일형태의 데이터도 가져올 수 있게 되는 것이다.
이때 가져온 파일을 위에서 얻게 된 서버 상의 폴더경로로 지정하면 서버 폴더로 이미지가 저장된다.
그렇다면 문제상황의 처음으로 돌아가 어떻게 서버상의 경로를 추가하지 않고도 웹 서버상의 폴더의 이미지 파일에 접근할 수 있는 것일까?
웹 서버상의 폴더는 물리 경로 폴더에 절대적인 영향을 받는다. 즉 물리경로에서 파일을 추가하면 서버폴더에도 추가되고 물리경로 폴더에서 삭제되면 서버상의 폴더에서도 삭제되는 것이다.
반대로 물리 경로 폴더는 웹 서버 폴더에 영향을 받지 않는다.즉 웹 서버에 어떤 파일이 업로드되고 삭제가 되든 실제 물리 경로에는 파일이 추가되고 삭제되지 않는다는 것이다.
이를 알고 img태그에 파일 경로가 어떻게 설정되는지 고민해보면 다음과 같은 결론을 내릴 수 있다.
서버 위에서 동작하는 img 태그의 경로는 웹 서버상의 폴더 경로를 포함하고 있다는 사실이다.
<img src="imageFileSave/01.jpg" alt="">
따라서 도입부에 작성한 이 코드는 실제로는 /Users/kim/dev/MY_WEB_PROJECT/web_test/out/artifacts/my_artifact/JSP_File/bookstore/imageFileSave의 경로를 참조하는 것이다. (웹 서버상의 파일에 접근한다는 의미)
그렇다면 마지막으로 파일이 가지고 있는 웹 서버 주소로 이동했을 때 파일경로를 확인해보자.
실제 물리 경로인 imageFileSave 폴더에는 아무 파일이 없음에도 서버상의 이미지로 접근할 수 있음을 알 수 있다.(서버를 끄면 당연하게도 접근하지 못한다)
'프로그래밍 > 웹 개발' 카테고리의 다른 글
[Intellij] 웹 프로젝트에 라이브러리 경로 적용(WEB-INF에 lib의 jar파일이 적용되지 않는 문제 해결) (0) | 2023.07.05 |
---|---|
[Servlet] 서블릿에서 클래스를 찾지 못해 404 Not Found가 발생하는 현상 (0) | 2023.06.29 |
[JSP] QueryString으로 데이터 넘기는 법(feat. form태그 GET Method) (0) | 2023.06.21 |
[IntelliJ] IntelliJ에서 MySQL과 JDBC를 연동한 웹 프로젝트 생성하기 (0) | 2023.06.20 |
[Intellij] JSP Web Project 생성 세팅(Tomcat 연동) (0) | 2023.06.20 |