[스프링 오류] 404오류는 web.xml 파일에 답이 있다.(하나씩 찾아보자)
공부하는 책의 테스트 코드를 실행하려고하였다.
코드를 하나씩 넣어서 하고있는 중 코드를 실행하였다.
톰캣 실행 후 실행하려고 하는 jsp 파일을 실행하였다.
/WEB-INF/views/main.jsp 파일을 실행하니 아래와 같이 404 오류가 발생하였다.
WEB-INF에 있어서 그럴 수 있으니 이번에는 webapp에 jsp 파일을 하나 만든 후 다시 한번 톰캣으로 실행을 해보자.
동일하게 404 오류가 발생한다.
해당 파일도 안되는 것으로 봐서 경로의 문제일 가능성이 농후하다
톰캣 콘솔도 봤지만 명확하게 나와 있지 않아 하나씩 진행을 해야 한다.
web.xm 파일을 주석처리한 후 다시 한번 실행해보았다.
webapp에 있는 jsp 파일은 정상 구동이 된다.
이로인해 web.xml의 경로 문제 또는 저기에 포함되어 있는 파일 문제라는 것을 유추해볼 수 있다.
그럼 이제 어디서 문제가 발생하는지 하나씩 찾아 보도록하자.
WEB-INF에 있는 jsp 파일은 여전히 안되는 것을 확인할 수 있다.
우선 프로젝트 동작 순서 및 중요한 부분을 알아보자
1. 톰캣 구동은 jsp 파일이 아닌 프로젝트에서 해야한다.
2. 톰캣을 구동하면 프로젝트로 진입 후 web.xml이 실행된다.
3. web.xml에서 servlet-context.xml이 실행된다.
4. servlet-context는 객체를 생성한다.
5. HomeController 클래스의 객체에 의존성 주입이 된다.
6. 의존성 주입된 클래스는 Requestmapping으로 인하여 /을 받는다.
7. 객체 prefix로 인하여 앞에는 /WEB-INF/views/가되고
8. sufix로 인해 뒤에는 .jsp가 붙는다.
그럼 순서대로 하나씩 확인해보자.
1. 톰캣 구동은 jsp 파일이 아닌 프로젝트에서 해야 한다.
우선 jsp 파일로 한번 구동을 해보겠다.
다음과 같이 찾을 수 없다고 나온다.
그럼 이번에는 프로젝트를 구동해보도록하자.
아래와 같이 정상 구동되는 것을 확인할 수 있다.
자 그럼 어떻게 구동되는 것인지 추적을 해보도록하자.
2. 톰캣 구동 후 web.xml으로인해 servlet이 실행된다.
3. WEB-INF의 servlet-context.xml 파일이 실행된다.
4. servlet-context는 bean으로 객체를 생성한다.
생성된 객체는 prefix로 인해 앞에는 /WEB-INF/views/가 붙고
suffix로 인해 뒤에는 .jsp가 붙는다.
5. HomeController 클래스의 객체에 의존성 주입이 된다.
객체 의존성 주입은 component-scan에 의하여 진행된다.
6. controller 어노테이션은 위의 사진에 scan으로 인하여 의존성 주입이 된 것이다.
그리고 @Requestmapping으로 인하여 value가 /이면 home 메소드가 실행된다.
실행된 home 메소드는 return "home"을 반환한다.
7. 반환된 home은 객체 prefix로 인하여 앞에는 /WEB-INF/views/가되고
8. 뒤에는 .jsp가 붙는다.
그래서 결국 /WEB-INF/views/home.jsp가 되어 home.jsp 파일이 실행되는 것이다.
그럼 우리가 처음에 발생했던 문제를 다시 보도록하자.
필자의 실수는 처음 프로젝트로 톰캣 구동을 한게 아니라 jsp 파일로 구동한게 문제였다.
이 문제는 상기 설명한 것과 같이 프로젝트 구동으로 해결하였다.
그리고 web.xml을 보면 하단 부분은 문제가 없는 것으로 확인되었다.
그렇기 때문에 주석 처리한 윗 부분에 문제가 있는 것을 알 수 있다.
자 그럼 이제 다음과 같이 주석을 해제한 후 다시 한번 실행을 해보자
대부분의 문제에 답은 콘솔 창에 나와 있다.
콘솔 확인시 properties를 로드할 수 없었다고 나온다.
이유는 jdbc.properties 파일을 오픈할 수 없었기 때문이라고 나온다.
이유는 아까 문제가 되었던 action-mybatis 때문이다.
필자는 필요한 부분만 공부를 하고 있었기 때문에 jdbc.properties 파일을 생성하지않았다.
그렇기 때문에 위와 같이 해당 파일을 열 수 없었다는 에러 메시지가 발생하는 것이다.
그럼 해당 부분을 주석처리 해보자.
주석 처리한 후 다음과 같이 코드를 실행해보면 정상 구동되는 것을 확인할 수 있다.
만약 main.jsp 파일을 실행하길 원할 경우에는 아래와 같이 주소창으로 입력시에는 변경이 불가하다.
다음과 같이 home.jsp에서 main.jsp로 이동을 시도해보자.
이동이 불가능한 것으로 나온다.
그럼 링크를 걸어서 이동해보자.
동일하게 이동이 불가능한 것으로 나온다.
mvc 패턴으로 구성되어 있기 때문에 @Requestmapping을 통하여 이동을 해야한다.
다음과 같이 RequestMapping을 추가해주고
home.jsp의 링크를 다음과 같이 수정해주면
.do로 인해 main.jsp로 이동된다.
처음부터 메인 페이지로 접속을 원한다면 다음과 같이 설정해서 해결할 수 있다.
다음과 같이 톰캣 구동시 바로 main.jsp로 구동된다.