[Spring] 서블릿 컨텍스트 패스(ex : webapp 폴더) 실제경로 가져오기

[Spring] 서블릿 컨텍스트 패스(ex : webapp 폴더) 실제경로 가져오기

1. 스프링 컨트롤러(@Controller) 또는 서블릿에서 컨텍스트 패스(ex : webapp 폴더) 실제경로를 알아내고 싶다면 아래처럼 HttpServletRequest 객체를 이용해서 가져온다.

참고로 request.getSession().getServletContext() 를 쓰거나 request.getServletContext() 쓰거나 동일한 값을 가져온다.

@RequestMapping(value = “/”, method = {RequestMethod.GET,RequestMethod.POST})

public void test(HttpServletRequest request) {

    ServletContext servletContext = request.getSession().getServletContext();
    String realPath = servletContext.getRealPath(“/”);
}

2. 스프링 컨트롤러(@Controller)가 아닌 경우(서블릿이 아닌 경우) HttpServletRequest 객체를 파라미터로 넘겨줘야 한다.

3. 스프링 컨트롤러가 초기화될 때(@PostConstruct) 컨텍스트 패스를 알아내고 싶다면 ServletContext 를 @Autowired 로 받아서 사용한다.

@Controller
public class TestController {
    @Autowired
    private ServletContext servletContext;
 
    @PostConstruct
    public void initialize() {
        String realPath = servletContext.getRealPath(“/”);
    }
}

첨언하자면 getRealPath()의 리턴값 마지막 문자로 슬래시 또는 역슬래시가 오는지 여부는 OS 및 WAS 환경을 타는 것 같다. 로컬환경에서는 마지막 문자로 역슬래시가 있었는데, 운영환경(윈도우 서버였음)에서는 마지막 문자로 역슬래시가 오지 않는 현상이 있었다(믿기 어렵지만 사실이다). 따라서 마지막 문자로 슬래시 또는 역슬래시가 오기를 원한다면 코드 상에서 명시적으로 붙여주도록 한다.

예를 들어 아래와 같이 코딩하면 된다.

String realPath = servletContext.getRealPath(“/”);

if (!realPath.endsWith(File.separator)) {
    realPath = realPath + File.separator;
}

참고사이트 1 : https://sourcestudy.tistory.com/360