도서명: 쉽게 따라하는 자바웹개발
출판사: 인사이트
지은이: 백기선
출판일: 2012년 11월 30일
1.3.2 프로젝트 다운로드 (10 page)
http://whiteship.me/book/legacy-sample.zip (파일 다운로드)
https://github.com/keesun/legacy-sample ( STS 에서 Import > Git )
개발툴: STS(Spring Tool Suite) Version: 3.4.0.RELEASE Build Id: 201310051818
나는 STS 의 Import 메뉴를 이용해 github 에서 import 했다.
프로젝트를 빌드하면서 나는 대부분의 에러는 Maven 관련 에러였다.
인터넷을 통해 라이브러리(jar파일)을 가져오면서 완전히 다 못 가져온다던지, 파일 크기는 맞아도 jar 파일의 압축을 풀어보면 헤더가 손상되었다는 메시지가 출력되는 경우 등. - SHA-1 의 checksum 을 계산해서 ~.sha1 파일과 비교해보면 jar 파일이 온전한지를 확인할 수 있다.
이클립스(혹은 STS)에서 Problems View 에서 jar 파일명이 나오는 경우는 어느 jar 파일이 문제인지 쉽게 알 수 있지만, class 파일이 없다고 나오는 경우도 있고, - 이런 경우는 인터넷에서 검색해서 그 class 파일이 어느 jar 에 속해 있는지 알아야 한다.
어떤 경우는 Problems View 에는 error 가 없어도 실행해보면 에러가 나는 경우도 있다. 그러면 로그 파일을 보고 인터넷 검색을 해봐서 어느 클래스에서 문제가 있는지 확인해보고, 그 클래스가 속한 jar 파일이 온전한지를 체크해봐야 한다.
jar 파일의 checksum 이 맞지 않는다면 그 jar 가 속한 폴더를 통째로 지우고, 이클립스에서 clean 하고 다시 빌드를 한다.
나는 우리집 인터넷이 네트워크가 불안하다고는 생각하지 않고 있었는데, - 파일을 다운로드 받으면서 깨지거나 그런 경우는 없었다. - maven 을 통해 라이브러리를 가져오는 것이 왜 이렇게 불안한 것일까? maven 에서 다운로드 받는 로직을 개선해서 다운로드 받은 파일의 유효성을 체크해야 되는 것이 아닐까?
내 컴퓨터 내의 maven repository 내의 모든 jar 파일의 checksum 을 계산해서 맞지 않는 폴더를 출력해주는 스크립트라도 만들어 놔야 할 듯하다.
Spring 이나 Maven 을 처음 접해보는 사람이라면 책의 처음 예제에서 이런 많은 에러가 난다면 아마 4분의 3 은 포기하지 않을까? 좋은 책인데, Maven 관련해서 이렇게 많은 문제가 있는지 나도 실제로 돌려보고야 알았다.
봄싹 Google Groups 에 올라온, 이 책과 관련된 수많은 질문은 대부분 Maven 때문이었다.
저자인 백기선 님도 다음에는 자신의 컴퓨터의 maven repository 를 통째로 압축해서 CD 에 담아서 배포하겠다고 할 정도였다.
Error - Can not find the tag library descriptor for "http://www.springframework.org/tags/form"
Can not find the tag library descriptor for "http://www.springframework.org/tags/form"
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
이 에러는 치명적인 것처럼 보이지만, 실행에는 문제가 없다.
이 에러는 소스의 문제가 아니라 이클립스의 버그인 것 같다.
왜냐하면 spring의 tag library 가 spring-webmvc-3.0.5.RELEASE.jar 파일에 있는데, 이 파일을 project 의 WEB-INF/lib 폴더에 넣으면 에러가 사라지기 때문이다.
이 jar 파일은 Java Build Path 에서 Libraries 탭에 보면 Maven Dependencies 에 속해 있다.
그러면 이클립스에서 자동으로 인식해서 tag library를 찾아야 하는데, 꼭 WEB-INF/lib 에 있어야지만 된다니...
P.S.
모든 에러를 해결하고 나서 Tomcat 7 서버를 실행도 시켜본 후, /WEB-INF/lib 에서 spring-webmvc-3.0.5.RELEASE.jar 파일을 삭제하고 나서 clean 하고 다시 빌드해도
Can not find the tag library descriptor for "http://www.springframework.org/tags/form"
라는 에러가 발생하지 않는다.
웹 서버가 실행되면서 Maven의 라이브러리가 /WEB/lib 폴더로 export 된 것으로 이클립스에서 인식한 것일까?
Error - Referenced file contains errors (http://java.sun.com/xml/ns/j2ee/web-app_2_5.xsd)
이 에러는 저자가 약간의 실수를 한듯 하다.
web.xml 파일에서 xml schema 정의한 부분이 좀 잘못 되었다.
그러나 web.xml 의 이런 XML 정의와 관련된 에러는 실행에는 문제가 없다.
이 에러의 해결책은 2가지다.
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
version="2.5"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_5.xsd">
이렇게 되어 있는 부분을 다음과 같이 수정한다.
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
version="2.4"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
아니면 다음과 같이 수정한다.
<web-app version="2.5"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
version 을 2.5 로 하려면 j2ee 로 되어 있는 부분을 javaee 로 수정하면 된다.
[출처] http://stackoverflow.com/questions/13437569/what-does-this-web-xml-error-mean
web-app_2_5.xsd 파일을 다운로드 받아보면 상단에
<xsd:schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://java.sun.com/xml/ns/javaee"
xmlns:javaee="http://java.sun.com/xml/ns/javaee"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
attributeFormDefault="unqualified"
version="2.5">
이렇게 되어 있다.
참고로 Tomcat 7 은 Servlet 3.0 까지 지원하고, Tomcat 6 는 Servlet 2.5 까지 지원, Tomcat 5.5 는 Servlet 2.4 버전까지 지원한다고 한다. [출처] http://stackoverflow.com/questions/8400301/cout-unknown-tag
[참고] 서블릿 버전별 DTD - http://antop.tistory.com/145
Warning - Unknown tag (Spring Custom Tag 를 인식못하고 warning 이 나는 경우)
별로 대단한 것은 아니다. 단순히 무시해도 되는 Warning 이지만, 이 warning 을 없애려면
web.xml 에서 <welcome-file-list> 태그 뒤에
<jsp-config>
<taglib>
<taglib-uri>http://www.springframework.org/tags/form</taglib-uri>
<taglib-location>/WEB-INF/tlds/spring-form.tld</taglib-location>
</taglib>
</jsp-config>
를 갖다붙인다.
spring-form.tld 파일은
C:\Users\{사용자명}\.m2\repository\org\springframework\spring-webmvc\3.0.5.RELEASE\spring-webmvc-3.0.5.RELEASE.jar 파일의 압축을 풀어보면 META-INF 폴더 안에 들어있다.
spring-form.tld 파일을 복사해서 내 프로젝트의 WEB-INF 밑에 web.xml 에서 정의된 경로에 갖다 놓지 않으면 warning 은 없어지지만 실행 시 에러가 나서 해당 페이지가 뜨지 않는다.
에러메시지:
org.apache.jasper.JasperException: /WEB-INF/views/member/form.jsp (line: 3, column: 71) File "/WEB-INF/tlds/spring-form.tld" not found
[참고] No tag library could be found with this URI ( http://antop.tistory.com/146 )
Tomcat 7 서버에서는 web.xml 에 <taglib> 를 정의하지 않아도 별 문제가 없지만, 웹로직 서버에서는 에러가 난다는 내용이다.
실행 시 Error - javax.validation.ValidationException: Unable to find a default provider
Build Error 를 다 해결하고 나서 웹 브라우저로 접속 시 첫화면은 잘 뜬다.
그런데, 웹 브라우저에서 http://localhost:8080/app/member/form 로 접속 시 500번 에러가 나는 경우이다.
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.validation.beanvalidation.LocalValidatorFactoryBean#0': Invocation of init method failed; nested exception is javax.validation.ValidationException: Unable to find a default provider
Error log 를 봐도 소스의 어디에서 이상이 있는지를 알 수 없다.
javax.validation.ValidationException: Unable to find a default provider 를 Google 에서 검색해보면
이 에러는 hibernate-validator 라는 jar 파일과 관련이 있다는 것을 알 수 있다.
[출처] http://blog.naver.com/muchine98/140161045048
위 블로그의 내용을 발췌해 보자면,
Spring MVC 에서 JSR 303 @Valid Annotation 을 사용하기 위해서는 아래와 같이 hibernate-validator 라이브러리를 포함시켜야 한다.
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.2.0.Final</version>
</dependency>
이름은 Hibernate이지만 실제로 하는 역할은 Validation과 관련된 것 뿐이다. 만약 다른 javax.validation 패키지를 지원하는 라이브러리를 등록한다면, WAS 서버 기동 시javax.validation.ValidationException: Unable to find a default provider라는 에러가 발생한다.
이후 세팅은 아래 링크를 참조한다.
http://www.mkyong.com/spring-mvc/spring-3-mvc-and-jsr303-valid-example/
legacy-sample 프로젝트의 pom.xml 에서 hibernate-validator 으로 검색해 보면
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>4.0.0.GA</version>
</dependency>
이제 C:\Users\{사용자명}\.m2\repository\org\hibernate\hibernate-validator\4.0.0.GA 폴더로 가서
hibernate-validator-4.0.0.GA.jar 를 검사해보자.
SHA-1 로 checksum 을 구해봐도 hibernate-validator-4.0.0.GA.jar.sha1 의 내용과 같지 않고, 압축을 풀어보면 에러가 나면서 압축이 풀리지 않는 것을 알 수 있다.
이제 C:\Users\{사용자명}\.m2\repository\org\hibernate\hibernate-validator\4.0.0.GA 폴더를 지우고, 프로젝트를 clean 하고 다시 빌드해보자. 그러면 eclipse 에서 pom.xml 에 정의된 라이브러리가 없는 경우 자동으로 다시 다운로드 받는다.
이런 경우가 Maven 의 잘못된 라이브러리 다운로드 때문에 실행 시 알수 없는 에러가 나는 경우이다.