인프런 커뮤니티 질문&답변

pimang님의 프로필 이미지
pimang

작성한 질문수

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

MVC와 템플릿 엔진

인텔리제이에서 실행과 jar파일 배포해서의 실행 차이에 대해 궁금합니다.

작성

·

694

0

@Controller

@RequestMapping("/test")

public class TestController {

    @GetMapping("/test")

    public void test1(){

        System.out.println("test1");

    }

    @GetMapping("/test2")

    public String test2(){

        System.out.println("test2");

        return "test/test";

    }

    @GetMapping("/test3")

    public String test3(){

        System.out.println("test3");

        return "/test/test";

    }

}

위와 같이 컨트롤러 작성하고 

resources/templates/test/test.html 파일을 생성해 두었습니다.

인텔리제이에서는 아무런 문제없이 test, test2, test3 모두 정상적으로 실행되는데

jar파일 생성후 java -jar로 실행하면 test, test2는 실행되는데 test3를 호출하면

http://localhost:8080/test/test3

ERROR 3380 --- [nio-8080-exec-3] org.thymeleaf.TemplateEngine : [THYMELEAF][http-nio-8080-exec-3] Exception processing template "/test/test": Error resolving template [/test/test], template might not exist or might not be accessible by any of the configured Template Resolvers

위와 같이 오류가 발생됩니다.

test3의 리턴값에 "/" 을 붙여 절대경로로 설정되어 있는것인데. 왜 인텔리제이에서는 정상적으로 실행되는반면 jar배포 파일로 실행하면 오류가 발생되는지 모르겠네요.

1. 위의 상황에서 리턴값에 "/" 이 포함안된 상대경로로 하는게 맞는것인지? "/" 포함된 절대경로로 하는게 맞는것인지? 또는 둘다 맞는것인지 궁금합니다.

2. 인텔리제이와 jar파일 배포시 왜 다른 결과가 나오는지 궁급합니다.

인텔리제이 2020.0.4 버전

스프링부트 2.5.0

자바 11

답변 2

2

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. pimang님

결론부터 말씀드리면 test3과 같은 방식은 사용하시면 안됩니다. test2와 같은 방식을 사용하셔야 합니다.

기본으로 다음 두가지를 함께 조합하는데요.

prefix = "classpath:/templates/"

suffix = ".html"

test/test

classpath:/templates/test/test.html

/test/test

classpath:/templates//test/test.html

조합된 결과를 보시면 결과적으로 // 슬래시 2개가 들어가게 됩니다.

여기에서 IntelliJ에서 동작하는 이유는 저도 잘 모르겠지만, 결국 다른 환경에서 잘 동작하지 않을 가능성이 높습니다.

1번의 경우 return이 void이면 요청 URL을 맞추어서 뷰의 경로를 찾아줍니다. 그런데 이때도 2번과 같이 앞의 슬래시는 제거된다고 이해하시면 됩니다.

감사합니다.

1

pimang님의 프로필 이미지
pimang
질문자

아. 답변 너무 감사합니다.

pimang님의 프로필 이미지
pimang

작성한 질문수

질문하기