기억의 DataBase

경로 본문

Tips

경로

Zester; 2019. 12. 2. 13:12

파일을 업로드 할 때 실제 파일이 올라가는 경로는 어디일까?

Local에서만 구동할 때는 정확한 차이를 못 느낄 수 있다.

하지만 실제 Server에 올라가는 어플리케이션의 경우 실제 파일은 Server에 저장되어야 한다.

(사용자는 개발자 Local PC에 접속하는 것이 아니라, Server에 접속하는 것이기 때문에)

그렇다면 이 Server에서의 파일 저장 경로는 어디일까?


이클립스와 같은 IDE에서 Run on Server를 실행한다는 것은 Build 된 jar나 war 파일을

Tomcat과 같은 서버 프로그램에 Deploy한다는 것을 의미한다.

그 Deploy한 jar나 war파일이 사용자가 제공받는 내용물이다.

(Workspace 내의 소스를 제공받는 것이 아니다!)


.metadata

이러한 파일의 경로가 .metadata 폴더내의 경로다.

(생각을 다시 해보니 여기에 파일을 직접 업로드하면, Deploy 할 때마다 이 파일들도 같이 Deploy해야 해서 용량이 너무 커질 듯...

실제 서비스는 외부경로에 파일을 저장하고 불러오는 형식일 것 같다.)

더 알아보니 정확히는 서버의 경로라기 보다는 

이클립스를 활용해 변경사항을 편리하게 관리할 수 있는 경로라고 말하는 것이 맞을 것 같다.

(참고 : https://wanzargen.tistory.com/21?category=700064)

실 서버에 배포할 때는 톰캣의 wepapps 폴더에 war파일을 넣어주는 것이지 

이클립스를 통해 빌드, 배포하는 것이 아니기 때문이다. 


업로드 할 파일에서 getRealPath()를 활용해 실제 경로를 파악하면(상대경로) 

C:\Users\Zester\Desktop\WorkSpace\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp2\wtpwebapps\SpringExample

다음과 같은 서버 폴더 경로를 얻을 수 있다.


여기에서부터 삽질을 좀 많이 했는데 

path 뒤에 추가한 resources/uploadFiles/ 안으로 파일이 저장되는 것이 아니라

resources/ 안으로 파일이 저장되었다.

마지막 "/" 문자가 trim( ) 되는지 인식되지 않았다.  


그래서 결국 하드코딩했다... (이유는 아직도 모르겠다...)

역슬래쉬를 쓸꺼면 2개써야 한다 ex) \\ (java를 비롯한 C 계열 언어에서는 \ 하나는 escape 문자열로 인식)


서버에서 파일을 불러올 때는 다음과 같이 경로를 찾으면 된다.


위의 경로로 바로 파일을 이미지 파일을 불러올 수 있었던 것은 

위와 같은 설정이 servlet-context.xml에 존재했기 때문이다.

(해당 요청(/resources/**)이 들어오면 location에 해당하는 경로를 탐색)


위와 같은 설정이 없다면 들어온 url("/")을 

DispatcherServlet이 바로 가져가서 Controller에서 Mapping하려 하기 때문에

(/resources/를 Controller에서 찾음)

404 Error가 발생한다. 


번외로 오늘 뉴스에 수능성적 발표 2일전에 성적을 미리 확인하는 방법으로 Elements 조작이 올라왔는데

이것도 원리는 비슷한 것 같다.


위와 같이 Elements 탭에서 값을 변경해주면 

해당 서버 폴더 위치에 있는 파일을 가져올 수 있다.

(수능성적표 파일은 서버 경로에 저장되어 있었나??)


평소와는 좀 다른 글인 것 같은데 가끔 이렇게 삽질의 기록을 남기는 것도 좋을 것 같다.

나도 같은 삽질은 방지하고, 보는 사람도 삽질을 줄이고...

삽질하며 배운다지만 같은 삽질은 지양하자

이상 삽질의 기록 끄읏 

Comments