티스토리 뷰
자바로 백앤드 개발을 하다보면 컨트롤러에서 URL을 리턴해야할 일이 있다.
프론트부분 (JSP,HTML) 부분에서도 리소스를 로드할 때 , 경로를 쓰기 때문에 때문에 굉장히 많이 헷갈렸다.
이번 기회로 정리해보았다.
상대경로, 절대경로
1. 상대경로
상대경로는 현재 위치한곳을 기준으로 해서 위치를 의미한다.
- ./ : 현재 경로를 의미한다.
- ../ : 이전 경로를 의미한다.
., ..는 디렉토리를 만들면 파일시스템에서 만드는 일종의 파일이고, 이를 접근하면
"." : 현재 폴더로 연결되는 참조를 가지고 있다.
".." : 부모 폴더로 연결되는 참조를 가지고 있다.
2. 루트경로
"/" : 루트 경로를 의미한다.
루트경로와 상대경로의 차이는 아래 사진에서 명확하게 알 수 있다.
example.css 기준으로
1. images/body-bg.png 는 ./images/body-bg.png 의미로 해석된다.
2. /images/body-bg.png는 root/images/body-bg.png 라는 의미로 해석된다.
3. 절대경로
절대경로는 웹페이지나 파일이 가지고 있는 고유한 경로를 의미한다.
정확하게 그 위치를 의미한다.
예를들어서 "C:\users\document\untitled.jpg" 같은 경로를 의미한다.
Java 개발 시 경로?
프론트, 백앤드 개발시에 여러가지 경로를 사용하게 되는데,
경로를 쓰다보면 헷갈리는 부분이 있다.
경로 기준이 다르기 때문인데, 경로 기준이 왜 달라지는지 알아보겠다.
프론트와 백앤드가 알고있는 앱 루트의 기준이 다르다.
일단 Java 서블릿 개발 환경을 보자.
Project - dynamic web project 폴더를 만든다.
이를 빌드하면 위와 같이 폴더 구조가 변경된다.
여기서 Service-root란,
프로젝트 명 (혹은 context-path) 를 의미한다.
나는 톰캣을 쓰는데, .metadata/org.eclipse.wst.server.core라는 폴더에 보면, deploy된 폴더 구조를 볼 수 있다.
그럼 이 앱 내에서 루트는 바로 context-path가 될것이다.
그럼 백앤드 앱 내에서 최상위 루트는 http://localhost:8080/context-path/ 가 된다.
그에비해 프론트(브라우저)는 저런 앱의 구조에 대해서 모른다.
http://localhost:8080/context-path 로만 앱이 있는것도 아니고, 다양한 앱이 있을 수 있기 때문에 모르는건 당연하다.
프론트에서 명시해서 앱을 접근하고 싶으면 context-path를 붙여줘야 한다.
context-path를 붙여야 하는 경우와 붙이지 말아야 하는 경우를 구분해보겠다.
1. JSP에서 URL을 통해 컨트롤러에 접속하려는 경우.
context-path를 붙여줘야한다. JSP를 읽는건 결국 프론트 브라우저이기 때문이다.
2. Controller에서 forward를 통해 다른 JSP를 읽는 경우.
context-path를 붙여줄 필요가 없다. forward의 경우 java내부에서 처리되는 로직이라서, java 내부에서는 같은 루트 path를 공유한다.
2. Controller에서 redirect를 통해 다른 JSP를 읽게하는경우.
context-path를 붙여줘야한다. redirect는 브라우저에서 다시 요청을 보낼 수 있도록 요청하는 페이지 이동 동작이다. 따라서 브라우저가 정확한 URL을 알 수 있도록 미리 처리를 해줘야한다.
request.getServletPath() : 이 서블렛을 부른 URL (Path-matching된 주소)를 부른다. 다만 쿼리 스트링 등은 포함되지않는다.
request.getContextPath() : 서블릿 context path가 주어진다. context-path가 web-app이라면 /web-app이다.