들어가기 전에
이번 시간엔 Spring MVC를 이용하여 웹 어플리케이션을 작성하는 방법에 대하여 실습을 통해 알아보도록 하겠습니다.
학습 목표
- Spring MVC를 이용해 프로젝트를 구성할 수 있고, 개발자가 작성해야 할 파일이 무엇인지 이해한다.
- Spring MVC를 이용해 웹 어플리케이션을 작성할 수 있다.
핵심 개념
- DispacherServlet
- WebApplicationInitializer
- @RequestMapping = @GetMapping = @PostMapping
학습하기
comment
21.8.3
스프링 5 사용하시는 분들은 extends WebMvcConfigurerAdapter 대신 implements WebMvcConfigurer 적용만 하시면 될 거 같습니다. 물론 그냥 주어진 코드 그대로 실행해도 별 문제는 없었습니다! (업뎃되면서 어댑터 클래스가 비권장 된 이유 https://namocom.tistory.com/566, 공식문서 https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/servlet/config/annotation/WebMvcConfigurerAdapter.html)
404 해결법들 다 해봤는데도 안 되길래 빡쳐 있었는데,, 알고보니까 프로젝트를 run 해야 되는거더라구요^^;; .
혹시 저같이 java 파일만 run 하신 분들,,, 프로젝트 자체를 실행시키세요 ㅎㅎ
콘솔에는 No mapping found for HTTP request with URI라고 뜨는... 404 에러 계속 나고 여기 댓글에 있는 해결 팁으로 아무리 해도 안된다 하시는 분들은.. 그냥 아예 폴더 새로 만들고 이클립스 새로 깔고 다시 하시면 될 것 같아요. 저 하루종일 404 에러 고친다고 삽질하다가 그냥 새로 깔고.. 에러나던 코드랑 똑같이 했는데.. 갑자기 에러 없고 너무 잘돼서 허무하네요. ㅠㅠ
Servlet은 클라이언트의 요청을 구분하기위해 @Webservlet을 class단위로 지정하고, service, doGet, doPost메서드를 오버라이드하여 요청을 처리하였습니다.
첫번째 과제, todoList를 만들 때 메인 페이지로 가기위해 service메서드를 오버라이드 후 forward메서드로 return 해주었고 update,insert,select 하기위한 servlet도 각각 정의하여 짧은 코드를 가진 servlet클래스들이 많아진다는 불편함이 있었습니다.
그에비해 Spring MVC는, 하나의 @Controller에 여러개의 @RequestMapping을 메서드단위로 지정할 수 있으며, view페이지의 이동시에도 String으로 반환해도 된다는 점이 편리하게 느껴졌습니다.
C 프로젝트를 진행하다가 헤맸었는데... 이 파트의 강의를 다시 들으니 큰 도움이 되었습니다. 감사합니다~
path 를 HttpRequestServlet 를 이용하지 않고 spring mvc 메소드 인자 애노테이션을 이용해서 가져오는 방법도 있나요?
WebMvcConfigurerAdaption을 상속받기 위해서는
pom.xml에 추가한 Spring Version이 5 이하여야 하는 거 같습니다.
근데 수정하려면 프로젝트를 지우고 다시 만들어야 했습니다 ㅠ
댓글 초기에 한유덕 님께서 쓰신 방법 덕분에 많이 해결했습니다. ㅠㅠ
감사합니다. 꼭 server에서 해당 프로젝트 삭제하고 다시 시작하시기 바랍니다.
마지막으로 jsp이름이 잘못된 경우 rename하면 오류가 났습니다.
jsp 파일을 새로 작성해야 했습니다.
(+ pom.xml, web.xml은 ctrl + a -> ctrl + shift + f로 자동정렬을 항상 해줬습니다.)
아주 많은걸 배웠어요!! 감사드립니당
* 404 에러 해결법 *
* 개발 환경 *
윈도우 10
이클립스 버전 2019-12
기본 자바 버전 1.7
아파치 메이븐 웹앱 프로젝트 생성시 기본버전 1.4입니다.
우선 해당 프로젝트(mvcexam) 아이콘 좌측에 빨간박스에 흰색 x 표시가 있는지 확인합니다.
빨간 박스에 흰색x표시가 있는경우의 해결법 입니다.
web.xml을 열어보시면 상단에 다음과 같이 되어있을겁니다.
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
이것을 다음과 같이 바꿔줍니다.
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
그런 다음 메이븐 프로젝트 클린 해주시고 껏다가 다시 킵니다.
실행 시켜보면 해결된 것을 볼 수 있습니다.
서블릿 버전에 따라서 web.xml 상단에 기재되어야하는 문구 (DTD라고하더라구요) 가 다릅니다.
저희는 3.1이기 때문에 위에 적은것과 같이 적어주시면 됩니다.
4시간 뻘짓했네요 ㅠㅠ
spring mvc 프로젝트 생성 시 maven project, spring legacy project, spring mvc project로 생성하는 것들의 차이와 무엇이 어떤 점에서 선호되는지 알려주실 수 있나요?
PAGE404 머가 잘못됐는지를 모르겠다!!!! 아!!!
404에러 뜨시는 분들 중에, 저도 다 똑같이 했는데 계속 떠서 뭐가 문제인지 한동안 절망에 빠졌었는데요.
pom.xml에서 dependency 아래 추가해주는 부분 정렬을 잘했더니 작동이 잘 되더라고요. pom.xml 내용을 붙여넣기 하는 과정에서 흩으러진게 없는지 확인해보세요.
혹시 WEB-INF/views 폴더 내에 jsp 파일 생성할 때 파일명에 오타가 나서, 이클립스에서 이름 변경 후 계속 404에러가 뜨시는 분들은... 오타난 경우, 이름 변경하지 마시고, 삭제 후 프로젝트 -> New -> JSP File을 통해 정확한 이름으로 다시 만들어주시면 됩니다. 이클립스 버그인것 같네요
SpringMVC는 정해진 틀에 맞춰 개발하는 만큼 초기 설정이 복잡하고 어렵지만, 유지보수할 때나 협업 시 다른 사람의 코드를 보기가 편할 것 같습니다.
서블릿은 반대로 개발할 땐 편하고 빠르지만, 나중에 유지보수할 때 어렵지 않을까 생각합니다.
제가 생각한 둘의 장단점이 맞나요?
컨트롤러 작성실습 1/3 에서 plusForm으로 url 요청하면 이 요청이 get방식으로 들어간다는것을 어떻게 알수 있나요??
PostMapping으로 바꿔서 실행시켜보니까 404가 뜨네요.
--> 따로 action을 지정해 주지 않으면 default로 get방식이 적용이 되어있어서 그런건가요??
web.xml에서 WebMvcContextConfiguration을 WebMvcControllerConfiguartion으로 바꾸시면 404 안뜹니다
<param-value>kr.or.connect.mvcexam.config.WebMvcControllerConfiguration</param-value>
Console에 maaping 된거 보이는데도 404 에러 뜨시는 분들은, 혹시 예제 코드 jsp에
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
이거
<!DOCTYPE html> 로
바꾸시고 해보세요 !
form 으로 submit 할때,
내용을 입력하지 않았거나 또는 잘못된 타입으로 입력을 했을때 미리 check 하여 적절한 조치를 취하는 방법에 대해 알려주세요.
고맙습니다.
No mapping found for HTTP request with URI [/mvcexam/] in DispatcherServlet with name 'mvc' 404 오류 관해서 아래에 많은 분들이 해결법 올려주셨는데 저는 kr.or.connect.mvcexam.config 패키지를 src/main안에 만들었던 java 폴더가 아니라 source 폴더 안에서 만들어줘서 오류가 발생했네요ㅠ 오류나시는 분들 한번 확인해 보세요!