ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링(Spring) 개발 - (8) 로그 (Log4j) 및 인터셉터 (Interceptor) 설정
    Spring 2015. 2. 12. 12:08

    이번글에서는 앞으로 개발을 하는데 필요한 정보를 보여줄 수 있는 로그와 관련된 내용을 이야기합니다.


    지금 당장은 크게 눈에 보이는게 없을수도 있겠지만, 한번 하고나면 개발하는데 굉장히 도움이 됩니다.


    2015.3.25 추가) 인터셉터를 설정하는 방법이 약간 바뀌었습니다. 기존에 제 글을 보신 분들과, 에러가 났었던 분들은 다시 한번 확인을 부탁드립니다.


    ------------------------------------------------------------------------------------


    1. Log4j 설정


    Log4j는 자바기반의 로깅 유틸리티로, Apache에서 만든 오픈소스 라이브러리다. 

    갑자기 로그라고 하면 이게 무엇인가, 그걸 대체 어따 써먹는것인가!!!! 라고 생각할 수 있지만, 로그는 우리가 굉장히 많이 쓰고 있다. 예를 들어서, 개발을 하다가 어떤 변수의 값을 확인하고 싶으면 자연스럽게

    System.out.println()으로 출력을 하는데, 이런것들이 모두 로그의 한 종류라고 생각할 수 있다. 그러면 그냥 System.out.println()으로 출력하면 되는데 왜 귀찮게 다른걸 사용하냐는 의문이 들 수 있다.

    사실 우리가 혼자서 그냥 연습삼아 프로젝트를 만들거나 하면 System.out.println()은 큰 문제가 없지만, 실제 프로젝트는 혼자서 하는것도 아니고, 또 시스템 운영시에는 큰 문제를 야기한다.


    간단하게 살펴보면

    1) 운영시에 불필요한 로그가 계속 출력된다. - 시스템을 개발하고 운영할 때, System.out.println()을 모두 찾아    서 지워준다면 몰라도, 거의 대부분은 그냥 한다....ㅡ_ㅡ; 그러면 쓸모없는 로그로 아까운 리소스가 낭비된      다.


    2) 모든 로그를 지워버리면, 에러가 났을경우, 그 에러 원인을 찾기가 어려울 수도 있다. - 예를 들어, 시스템에 

       중대한 에러가 날 경우, 로그를 출력해놓도록 해놨는데, 위에서 System.out.println을 모두 지워버렸다면, 로

       그가 안남을 수도 있다.


    3) 성능에 큰 영향을 미친다. - 사실 가장 중요한 문제다. 우리가 프로그램을 실행하다가 System.out.println()

       을 굉장히 많이 호출하면 프로그램의 전체적인 성능이 떨어지는것을 확인할 수 있다. 예를 들어 1부터 100까

       지를 모두 더하는 프로그램을 만들었을때, 로그를 하나도 안찍으면 정말 0.01초도 안걸려서 끝나지만, 그 계

       산과정을 모두 System.out.println()으로 화면에 찍어보면....한참 걸린다... 특히 다중사용자를 처리해야 하

       는 웹에서 System.out.println()은 정말 큰 문제를 만들어버린다. 


    Log4j는 위에서 간단히 이야기 한 문제점을들 손쉽게 해결할 수 있다. 

    Logj4는 시스템의 성능에 큰 영향을 미치지 않으면서도, 옵션 설정을 통해서 다양한 로깅 방법을 제공한다.

    환경설정을 통해서 선택적인 로그를 남긴다거나, 특정 파일등에 로그를 생성하는 등 다양한 이점을 가지고 있다. 


    Log4j의 구조는 다음과 같다.  


     요소

     설명

    Logger

     출력할 메시지를 Appender에 전달한다.

    Appender

     전달된 로그를 어디에 출력할 지 결정한다. (콘솔 출력, 파일 기록, DB 저장 등)

    Layout

     로그를 어떤 형식으로 출력할 지 결정한다.


    Log4j는 다음과 같은 로그 레벨을 가진다.


    로그 레벨

    설명 

    FATAL

     아주 심각한 에러가 발생한 상태를 나타낸다. 

    ERROR

     어떠한 요청을 처리하는 중 문제가 발생한 상태를 나타낸다. 

     WARN

     프로그램의 실행에는 문제가 없지만, 향후 시스템 에러의 원인이 될수 있는 경고성 메시  지를 나타낸다.

     INFO

     어떠한 상태변경과 같은 정보성 메시지를 나타낸다. 

     DEBUG

     개발시 디버그 용도로 사용하는 메시지를 나타낸다. 

     TRACE

     디버그 레벨이 너무 광범위한것을 해결하기 위해서 좀 더 상세한 이벤트를 나타낸다.


    Log4j에 대한 간단한 설명은 이정도로만 하고, 자세한 내용은 추후 이야기 하겠다. 


    일단 여기서는 Log4j의 간단한 설정만 이야기 하겠다. 


    1. pom.xml에 Log4j를 추가한다. 

    우리가 생성한 프로젝트에는 기본적으로 Log4j 라이브러리가 추가되어있고 기본설정도 되어있기 때문에, 넘어가도록 한다. 


    2. Log4j 설정

    인터넷에서 Log4j에 대해서 찾아보면 여러가지 글이 나오는데, 상당히 많은 글들이 .properties 파일을 이용한 설정방법이다.

    Log4j에 .properties를 사용하는 건 최악이다. 절대로 하지말자. (진지한 궁서체다.)

    이제 .properties는 굉장히 옛날 방식이고 절대로 사용해서는 안되는 방식인데, 최근에 작성된 글들도 .properties를 가지고 이야기하고 있다. (특히 네E년 - 자체심의) 

    최신 Log4j에서는 xml과 json을 이용한 설정만 지원하고 있다. 


    src/main/resources 폴더 밑에 있는 log4j.xml 파일을 열자. 

    log4j.xml이 Log4j의 설정파일로, 여기서 로그 출력 형식과 레벨 등을 모두 지정할 수 있다.

    기존에 http://addio3305.tistory.com/36 에서 프로젝트를 생성하고 실행시켰을 때, 콘솔에서 이것저것 출력되었던 것도 여기서 설정된 것을 이용해서 출력이 된것이다.



    당시 사용했던 이미지를 다시 가져왔는데, 빨간색 점선으로 표시된 부분이 Log4j를 통해서 출력된 로그들이다. " INFO : " 라고 되어있는게 위에서 설명한 INFO 레벨의 로그이다. 


    우리는 앞으로 여러가지 로그를 찍고, 각 로그 종류에 따라서 화면에 보이는게 다르게 하기 위해서 다음과 같이 log4j.xml을 변경한다. 


    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
    <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    
    	<!-- Appenders -->
    	<appender name="console" class="org.apache.log4j.ConsoleAppender">
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="%d %5p [%c] %m%n" />
            </layout>   
        </appender>
        
        <appender name="console-infolog" class="org.apache.log4j.ConsoleAppender">
            <layout class="org.apache.log4j.PatternLayout">
                <param name="ConversionPattern" value="%d %5p %m%n" />
            </layout>   
        </appender>
    	
    	<!-- Application Loggers -->
    	<logger name="first" additivity="false">
    		<level value="debug" />
    		<appender-ref ref="console"/>
    	</logger>
    	
    	<!-- Query Loggers -->
    	<logger name="jdbc.sqlonly" additivity="false">  
        	<level value="INFO"/>  
            <appender-ref ref="console-infolog"/>  
        </logger>
        
        <logger name="jdbc.resultsettable" additivity="false">  
        	<level value="INFO"/>  
            <appender-ref ref="console"/>  
        </logger>  
    
    	<!-- Root Logger -->
    	<root>
    		<priority value="off"/>
    		<appender-ref ref="console" />
    	</root>
    	
    </log4j:configuration>
    

    여기서 2개의 appender와 3개의 logger를 볼 수 있다. 

    일반적인 debug 레벨은 기존의 appender를 이용하고, 그 외 필요한 여러가지 정보는 info 레벨로 약간 다른형식으로 출력하려고 한다. 이건 추후 소스에서 그 결과를 확인할 수 있다. 


    2. 인터셉터 (Interceptor) 설정

    인터셉터는 중간에 무엇인가를 가로챈다는 의미이다. 스프링에서도 말 그대로 중간에 요청을 가로채서 어떠한 일을 하는것을 의미한다. 서블릿(Servlet)을 사용해본 사람이라면 필터(Filter)를 들어봤을텐데, 비슷한 의미로 사용된다. 그럼 어느 중간에서 요청을 가로채서 무엇을 하는지를 간단히 살펴보자.


    사진 출처 : http://blog.daum.net/gunsu0j/165


    인터셉터는 위 이미지의 빨간색 박스 부분에서 동작한다. 인터셉터의 정확한 명칭은 핸들러 인터셉터 (Handler Interceptor)이다. 인터셉터는 DispatcherServlet이 컨트롤러를 호출하기 전,후에 요청과 응답을 가로채서 가공할 수 있도록 해준다. 

    예를 들어, 로그인 기능을 구현한다고 했을때, 어떠한 페이지를 접속하려고 할때, 로그인된 사용자만 보여주고, 로그인이 되어있지 않다면 메인화면으로 이동시키려고 해보자. 기존에는 로그인 체크 로직을 만들어서 각 화면마다 일일이 Ctrl + C,V로 만들기도 했다. 아마 누가 그렇게 하겠어~? 라고 생각할 수도 있겠지만 실제로 필자는 학생때 웹 프로젝트를 할때 그렇게 만들었었다.


    스프링에서는 인터셉터를 사용하여 위의 기능을 간단히 만들 수 있다. 

    인터셉터에서 어떠한 요청이 들어올 때, 그 사람의 로그인 여부를 판단해서 로그인이 되어있으면 요청한 페이지로 이동시키고, 로그인이 되어있지 않을경우 바로 메인 페이지로 이동시키면 끝이다. 

    즉, 단 하나의 인터셉터로 프로젝트내의 모든 요청에서 로그인여부를 관리할 수 있는것이다. 


    설명은 간단히 하고, 실제로 어떻게 만들고, 동작하는지를 소스를 통해서 살펴보자.


    1. 먼저 src/main/java/first 패키지 내에 common 패키지를 생성하고 그 밑에 logger 패키지를 생성한다. 

    기존에 작성되어있던 com.company.first 패키지를 삭제하고, first.common.logger 패키지를 생성한다.

    마찬가지로 HomeController.java도 삭제한다.




    2. logger 패키지 밑에 LoggerInterceptor.java를 생성한다.

    이제 위에서 설명한 인터셉터를 만들 차례다. 인터셉터는 HandlerInterceptorAdapter 클래스를 상속받아서 만든다. 

    HandlerInterceptorAdapter에서는 사용할 수 있는 몇가지 메서드들이 있는데 우리는 일단 두가지만 구현하려고 한다. 전처리기와 후처리기가 바로 그것인데, 위에서 client -> controller 로 요청할 때, 그 요청을 처리할 메서드 하나(전처리기)와 controller -> client 로 응답할 때, 그 요청을 처리할 메서드 하나(후처리기)를 만들 예정이다. 

    public class LoggerInterceptor extends HandlerInterceptorAdapter {
    	protected Log log = LogFactory.getLog(LoggerInterceptor.class);
    	
    	@Override
    	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    		if (log.isDebugEnabled()) {
    			log.debug("======================================          START         ======================================");
    			log.debug(" Request URI \t:  " + request.getRequestURI());
    		}
    		return super.preHandle(request, response, handler);
    	}
    	
    	@Override
    	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    		if (log.isDebugEnabled()) {
    			log.debug("======================================           END          ======================================\n");
    		}
    	}
    }
    

    이 소스에서 우리가 살펴봐야 할게 몇가지 있다. 

    1) 위에서 우리는 Log4j 를 사용해서 로그를 출력하기로 했었다. 이제 화면에 무엇인가를 출력할때는 모두 Log4j를 사용하는데 이는 다음과 같이 사용한다.

    protected Log log = LogFactory.getLog(LoggerInterceptor.class); 는 Log4j의 Log 객체를 log라는 이름으로 생성한다. 

    Log 객체를 생성할때는 몇가지 방법이 있는데 여기서는 생성자에 현재 클래스를 입력하였다.


    2) 전처리기와 후처리기의 메서드를 등록한다. 

    preHandler()과 postHandle() 메서드가 전처리기와 후처리기에 해당된다. preHandler()은 컨트롤러가 호출되기 전에 실행되고, postHandle()은 컨트롤러가 실행되고 난 후에 호출된다. 

    여기서는 단순히 START와 END의 로그를 출력함으로써, 하나의 요청을 쉽게 볼 수 있도록 경계선을 그어주는 역할을 한다.


    3) preHandle()에서 현재 호출된 URI가 무엇인지 보여주도록 한다.


    3. 방금 만든 인터셉터를 등록한다.

    1) src/main/resources 폴더 밑에 first/spring 폴더를 생성한다.

    폴더를 생성하면 다음과 같이 패키지로 보이는 경우가 있을수 있다.



    이렇게 나오는 경우, 보기좋지 않기때문에 http://addio3305.tistory.com/44 포스팅을 따라하도록 한다.


    2) action-servlet.xml을 다음과 같이 수정한다.

    다음의 소스를 붙여넣자.

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns:context="http://www.springframework.org/schema/context"
        xmlns:p="http://www.springframework.org/schema/p"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://www.springframework.org/schema/beans"
        xmlns:mvc="http://www.springframework.org/schema/mvc"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
           http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    
    	<context:component-scan base-package="first"></context:component-scan>
    	
    	<mvc:interceptors>
    		<mvc:interceptor>
    			<mvc:mapping path="/**"/>
    			<bean id="loggerInterceptor" class="first.common.logger.LoggerInterceptor"></bean>
    		</mvc:interceptor>
    	</mvc:interceptors>
    	
        <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
        
        <bean class="org.springframework.web.servlet.view.BeanNameViewResolver" p:order="0" />
        <bean id="jsonView" class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />    
        
        <bean
        	class="org.springframework.web.servlet.view.UrlBasedViewResolver" p:order="1" 
        	p:viewClass="org.springframework.web.servlet.view.JstlView" 
        	p:prefix="/WEB-INF/jsp/" p:suffix=".jsp">
       	</bean>
    </beans>

    이 소스를 간단히 살펴보자. 

    스프링 3.2 이상에서는 mvc를 설정하는게 많이 바뀌었다. 

    <mvc:mapping path/>를 통해서 인터셉터가 동작할 URL을 지정할 수 있다. 지금 작성하는 로거는 모든 요청에서 동작을 하기때문에 전체 패스를 의미하는 "/**" 로 설정하였다.

    그 후, bean을 수동으로 등록한다.


    중요!!! 위에서 이야기 했듯이, Interceptor는 Controller가 요청되기 전에 수행된다. 즉, Interceptor는 DispatcherServlet과 같은 위치에 등록이 되어있어야지 정상적으로 수행이 된다. 


    사진출처 : http://egloos.zum.com/springmvc/v/504151


    DispatcherServlet은 사용자(클라이언트)의 요청을 받아서 해당 요청에 매핑되는 컨트롤러와 연결한 후, 컨트롤러에서 정의된 view를 사용자의 브라우저에 출력하는 역할을 수행한다. DispatcherServlet에 관련된 내용은 위 사진 출처인 http://egloos.zum.com/springmvc/v/504151 에서 잘 설명이 되어있기 때문에 참고하길 바란다.


    web.xml을 다시한번 살펴보자.

    <servlet>
    	<servlet-name>action</servlet-name>
    	<servlet-class>
    		org.springframework.web.servlet.DispatcherServlet
    	</servlet-class>
    	<init-param>
    		<param-name>contextConfigLocation</param-name>
    		<param-value>
    			/WEB-INF/config/*-servlet.xml
    		</param-value>
    	</init-param>
    	<load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
    	<servlet-name>action</servlet-name>
    	<url-pattern>*.do</url-pattern>
    </servlet-mapping>
    

    우리는 여기서 이미 DispatcherServlet을 정의하였다. 그리고 그 DispatcherServlet의 설정파일의 위치는 /WEB-INF/config/ 폴더 밑의 -servlet.xml 로 끝나는 모든 xml 파일이라고 명시한 것이다.

    즉, action-servlet.xml에 interceptor를 설정함으로써, 우리는 DispatcherServlet과 Interceptor를 같은 위치에 등록을 한것이다. 
    만약, action-servlet에서 Interceptor의 설정을 분리하여 다른 파일로 만들고싶으면, action-servlet.xml이 있는 폴더에 *-servlet.xml의 이름 형식 (예를 들어 interceptor-servlet.xml )으로 만들면 된다. 

    4. 이제 인터셉터가 제대로 동작하는지 확인하자.

    앞에서 이야기한것을 잘 기억하고 있다면, 인터셉터는 컨트롤러의 요청과 응답 시에 호출된다. 현재 우리는 컨트롤러가 아무것도 없으니, 당연히 아무것도 보이지 않는다. 

    따라서 간단한 컨트롤러를 하나 만들고 테스트를 해보자.


    1) src/main/java/first 밑에 sample.controller 패키지를 만든다.

    2) controller 패키지에 SampleController 클래스를 생성한다.

    여기서 대소문자에 꼭 주의하도록 한다. 자바에서는 대소문자가 다른 문자이기때문에, 대소문자를 필히 확인하고 맞춰야한다.


    3) 다음의 소스를 붙여넣자.

    @Controller
    public class SampleController {
    	Logger log = Logger.getLogger(this.getClass());
    	
    	@RequestMapping(value="/sample/openSampleList.do")
        public ModelAndView openSampleList(Map<String,Object> commandMap) throws Exception{
        	ModelAndView mv = new ModelAndView("");
        	log.debug("인터셉터 테스트");
        	
        	return mv;
        }
    }
    

    위 소스를 간단히 설명하면, 

    1번째 줄의 @Controller 는 어노테이션(Annotation)으로, 스프링 프레임워크에 현재 클래스가 컨트롤러 라는것을 명시해준다. 어노테이션은 앞으로 이것저것 나올테니, 그때 다시 설명하도록 한다.


    3번째 줄에서 우리가 사용할 Log4j 로그를 선언해놨다. 


    5번째 줄에서 @Requestmapping 역시 어노테이션으로, DisptacherServlet은 이 어노테이션을 기준으로 어떤 컨트롤러의 메서드가 호출되어야 할지를 결정한다. 

    그 뒤의 (value="/sample/openSampleList.do")는 프로젝트가 실행될 주소를 의미한다. 


    7번째 줄에서 ModelAndView 클래스형식의 mv 인스턴스를 생성하였다. 

    여기서 new ModelAndView("")를 할때 생성자 부분에는 이 컨트롤러가 실행되고 나서 보여줄 view (사용자에게 보여줄 화면)를 설정할 수 있다. 

    여기서는 인터셉터가 동작하는지 확인하기 테스트이기 때문에 따로 view를 설정하지 않겠다. 

    8번째 줄의 log.debug("인터셉터 테스트"); 를 통해서 컨트롤러가 실행되고 log4j의 로거도 동작하는것을 보려고 한다. 


    4) 위에서 선언한 컨트롤러를 호출하자. 

    우리는 그동안 프로젝트가 실행되면 자동으로 index.jsp가 실행되도록 했었다. index.jsp를 이용해서 프로젝트가 실행되면 바로 방금 만든 /sample/openSampleList.do를 호출하도록 변경하자. 

    index.jsp를 열고 모든 내용을 삭제하고, 다음의 코드를 붙여넣는다.

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
    <jsp:forward page="/sample/openSampleList.do"/>
    

    index.jsp가 호출되면 자동으로 /sample/openSampleList.do 의 URL로 forward 시키도록 하였다. 

    다시말해서, 프로젝트를 시작하면 index.jsp를 호출하게 되고, index.jsp에서는 다시 방금 위에서 작성한 /sample/openSampleList.do 라는 주소를 호출한다. 


    그럼 실행시켜 보자. 이클립스에서 first 서버를 실행시킨다.

    그럼 위와 같이 에러가 없이 서버가 정상적으로 실행된다. 


    그 다음에는 인터넷을 켜고 주소창에 localhost:8080/first를 입력하자. 





    뭔가 잘못되었다!!!!!!!




    는 아니고, 위에서 ModelAndView에서 사용자에게 보여줄 화면 (view)를 지정하지 않았다는 것을 기억해보자.

    주소는 정확히 호출되었지만, 사용자에게 보여줄 화면이 없기때문에 404에러가 발생한것이다.

    우리가 인터넷을 하다보면 가끔 404 Page Not Found와 같은 에러를 볼 수 있는데, 지금과 비슷한 상황이라고 생각하자. 


    우리가 정말로 확인해야 하는것은 이클립스의 콘솔창이다.


    위와 같은 화면이 보이면 정상적으로 인터셉터와 Log4j가 설정된 것이다.


    로그를 살펴보자.

    우리는 아까 LoggerInterceptor를 생성해서 전처리기와 후처리기인 preHandle()과 postHandle()을 만들고, 거기에 로그를 작성했다. 

    하나의 요청의 시작과 끝을 구분짓는다고 했는데 START는 요청의 시작, END는 모든 로직이 완료된 것을 의미한다. 

    START 밑에는 Request URI : /first/sample/openSampleList.do 라는 로그가 찍혀있다. 

    이것은 현재 어떤 주소를 호출했는지를 보여준다. 

    index.jsp에서 /sample/openSampleList.do 라는 주소를 호출하였고, 그 주소가 실행되었음을 알 수 있다.

    마지막으로 log.debug("인터셉터 테스트");라는 것을 통해서 사용자의 로그를 출력하도록 했는데, 그 로그 역시 정상적으로 출력된 것을 확인할 수 있다.


    여기서, 로그를 자세히 살펴보자. 

    로그를 자세히 살펴보면 약간 다른것을 발견할 수 있다.

    DEBUG [first.common.logger.LoggerInterceptor] 와

    DEBUG [first.sample.controller.SampleController] 의 두종류의 로그가 있는것을 확인해보자. 

    어디서 많이 본 이름인것 같은데??????? 라고 생각하면 그 생각이 맞다 ㅇㅇ;


    우리는 Logger 객체를 생성할 때, 우리는 해당 클래스를 Logger 클래스의 생성자에 변수로 넣어주었다. 

    이를 이용하여 Log4j가 알아서 어떤 클래스에서 로그가 출력된 것인지를 보여주는 것이다. 

    만약 우리가 System.out.println()을 사용했으면 어떤 클래스에서 출력된 로그인지를 알기가 쉽지 않은데, Log4j를 사용해서 어디서 출력된 로그인지를 알수 있도록 하였다. 

    ------------------------------------------------------------------------------------


    최근 몇개의 포스팅은 지금까지와는 다르게 복잡하게 느껴졌을 것입니다.


    파일을 이것저것 건드리고 이름도 바꾸고 하다보니 더욱 그렇게 느끼셨을텐데, 처음에는 복잡하게 느껴질 수 있


    습니다.


    여태까지 한것은 우리가 앞으로 프로젝트를 개발하는데 필요한 기본설정 몇가지를 한 것입니다.


    이를 통해서 우리는 개발에 필요한 다양한 정보를 좀 더 쉽고 보기 편하게 알수 있습니다.


    앞으로는 여태까지 설정해놓은것을 바탕으로 게시판을 만들어 보려고 합니다.


    갑자기 무슨 게시판???? 이라고 생각하실 수도 있을텐데요. 


    간단한 게시판을 하나 만들면서 스프링의 MVC 구조와 DB, 트랜잭션, 파일 업로드, jQuery등 다양한 이야기를 


    하려고 합니다. 


    댓글 283

    • 이전 댓글 더보기
    • 파비코 2018.11.15 16:53

      요근래 spring 공부하다가 발견하고 쭉 따라오는 중입니다!
      저는 log.debug 부분이 아무리 해도 안나와서 별짓 다하다가..
      다른 브라우저로 들어가보니까 바로 뜨더라구요 ㅠㅠㅋㅋㅋㅋ
      캐시가 쌓인건지 뭔지.. 참 하루 날렸어요.. 프로젝트도 새로 만들고..
      혹시라도 안나오는 분들은 캐시나 쿠키 싹싹 비우고 해보시구..
      아 저는 SampleController 에 Logger 어떤거 import 해야되는지도 헷갈렸어요
      댓글 다 뒤지다가 발견했는데
      import org.apache.log4j.Logger; 를 해야 한다고 하더라구요
      도움이 되었으면 합니다 !! 저는 다음 단계로 ..

    • loger 2018.12.10 13:05

      protected Log log = LogFactory.getLong(LoggerInterceptor.class); 이 부분에서 Log와 LogFactory에 빨간줄이 뜹니다. 확인해보니 cannot be resolved라고 에러 뜨는데 해결하시는 방법아시는분?? 하아

    • 개린이 2018.12.10 15:11

      여기서만 거의 이틀을 헤맸네요. 제가 헤맨 부분 정리해보겠습니다.

      1. 패키지명 확인

      우선 블로거님은 first를 최상위 패키지명으로 하는 first.xxx.xxx를 사용하셨으니

      1-1)
      action-servlet.xml 을 여시고

      <context:component-scan base-package="first"></context:component-scan>
      "" 안에 이름을 상위 패키지에 맞게 바꿔주시면 되겠습니다.
      <context:component-scan base-package="first"/> 로 축약 가능합니다.


      1-1_1) (이것은 필수 아니고 선택 넘어가도 무방합니다.)

      action-servlet.xml 에 보면
      <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
      DefaultAnnotationHandlerMapping이 deprecated(비권장) 되었다는 노란줄이 그어지며 경고가 뜹니다.
      해결방법은 <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
      이것을 전부 지워주고
      <mvc:annotation-driven/> 이것만 선언해주면 깔끔하게 해결됩니다.
      자세한 내용은 http://leeyongjin.tistory.com/entry/Spring-MVC-%EC%A0%95%EB%A6%AC
      이곳에서 확인하세요

      1-2)
      log4j.xml 도 여셔서

      <logger name="first" additivity="false">
      <level value="debug" />
      <appender-ref ref="console"/>
      </logger>

      logger name 부분을 최상위 패키지 명으로 변경해주시면 됩니다.

      2. UTF-8을 기본 인코딩으로 설정

      https://blog.naver.com/sungbumvv/221233198455
      이 블로그에 자세하게 나와 있으니 보시고 설정하세요.

      3. .java 소스 오류 문제

      3-1)
      아마 최근에 이글을 보며 공부하시는 분들은 가장 많이 막히는 부분이 아닐까 싶습니다.
      저도 구글링을 통해 알아봤는데 처음에 STS툴 설치할 때 가장 최신 버전일 겁니다.
      그렇다면.. log4j는 slf4j를 통해 사용해야만 합니다.
      쉽게 말하자면 slf4j는 규격이고 그 규격에 맞춰 log4j, log4j2, logback 이런 라이브러리를 추가해서 사용해야 한단 말입니다. pom.xml 열어보시면 slf4j부분에 slf4j와 log4j 라이브러리가 추가되어 있는지 확인해야합니다.
      자세한 내용은 http://tomining.tistory.com/102 여기서 확인하시면 이해가 되실 겁니다.

      3-2)
      protected Logger log = Logger.getLogger(this.getClass());
      이 부분이 오류가 날 건데 Logger 부분에 빨간줄이 그어져 있는 걸 볼 수 있습니다.
      ctrl + Shift + O를 눌러서 org.slf4j 를 추가해줍니다.
      그러면 getLogger에서도 오류가 날 건데 이것은 org.slf4j에 들어있는 클래스나 메소드로 변경해주어야 합니다. 따라서 저 위에 코드를 수정해보면
      protected Logger log = LoggerFactory.getLogger(this.getClass());
      이렇게 변경할 수 있는데 LoggerFactory 역시 org.slf4j로 추가해주면 간단히 해결됩니다.

      진짜 이거 때문에 머리털 다 빠질 뻔했는데 해결하니 기분 좋네요!!!
      계속 정진해 나가겠습니다!!!

      • 개린이 2019.12.02 10:17

        감사합니다 복받으세요 3-2)

      • 이제시작이지 2020.01.06 10:13

        제 환경
        JDK : 1.8
        IDE : Eclipse 2019-06
        Spring Version : 최근
        톰캣 : ApachTomcat 7.0


        logger 패키지 밑에 LoggerInterceptor.java

        import org.apache.commons.logging.Log;
        import org.apache.commons.logging.LogFactory;

        이게 빨간 줄이 그어져서 헤맸습니다.
        슨상님 말씀듣고
        이부분을
        import org.apache.commons.logging.Log;
        import org.apache.commons.logging.LogFactory;

        protected Logger log = LoggerFactory.getLogger(LoggerInterceptor.class);

        이렇게 바꿨더니 빨간줄이 안생겨지더군요
        슨상님 감사합니다.

    • 애니조아 2019.02.10 23:20

      지금 몇시간을 하고 있는데 잘안되네여 소스코드 좀 해석해주세요

      org.apache.jasper.JasperException: 행 [2]에서 [index.jsp]을(를) 처리하는 중 예외 발생

      1: <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
      2: <jsp:forward page="/sample/openSampleList.do"/>


      Stacktrace:
      org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:625)
      org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:499)
      org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385)
      org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329)
      javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
      org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)


      근본 원인 (root cause)
      javax.servlet.ServletException: 서블릿 [action]을(를) 위한 Servlet.init() 호출이 예외를 발생시켰습니다.
      org.apache.jasper.runtime.PageContextImpl.forward(PageContextImpl.java:530)
      org.apache.jsp.index_jsp._jspService(index_jsp.java:119)
      org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
      javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
      org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:476)
      org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385)
      org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329)
      javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
      org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)


      근본 원인 (root cause)
      org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: file [E:\jee-2018-12\wjdgus\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\first\WEB-INF\classes\first\common\dao\AbstractDAO.class]; nested exception is org.springframework.core.NestedIOException: ASM ClassReader failed to parse class file - probably due to a new Java class file version that isn't supported yet: file [E:\jee-2018-12\wjdgus\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\first\WEB-INF\classes\first\common\dao\AbstractDAO.class]; nested exception is java.lang.IllegalArgumentException
      org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:290)
      org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:242)
      org.springframework.context.annotation.ComponentScanBeanDefinitionParser.parse(ComponentScanBeanDefinitionParser.java:84)
      org.springframework.beans.factory.xml.NamespaceHandlerSupport.parse(NamespaceHandlerSupport.java:73)
      org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1438)
      org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1428)
      org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:185)
      org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:139)
      org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:108)
      org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:493)
      org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:390)
      org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334)
      org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)
      org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:174)
      org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:209)
      org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:180)
      org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:125)
      org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:94)
      org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:130)
      org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:537)
      org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:451)
      org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:651)
      org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:599)
      org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:665)
      org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:518)
      org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:459)
      org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
      javax.servlet.GenericServlet.init(GenericServlet.java:158)
      org.apache.jasper.runtime.PageContextImpl.forward(PageContextImpl.java:530)
      org.apache.jsp.index_jsp._jspService(index_jsp.java:119)
      org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
      javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
      org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:476)
      org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385)
      org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329)
      javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
      org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)


      근본 원인 (root cause)
      org.springframework.core.NestedIOException: ASM ClassReader failed to parse class file - probably due to a new Java class file version that isn't supported yet: file [E:\jee-2018-12\wjdgus\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\first\WEB-INF\classes\first\common\dao\AbstractDAO.class]; nested exception is java.lang.IllegalArgumentException
      org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:56)
      org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:80)
      org.springframework.core.type.classreading.CachingMetadataReaderFactory.getMetadataReader(CachingMetadataReaderFactory.java:102)
      org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:266)
      org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:242)
      org.springframework.context.annotation.ComponentScanBeanDefinitionParser.parse(ComponentScanBeanDefinitionParser.java:84)
      org.springframework.beans.factory.xml.NamespaceHandlerSupport.parse(NamespaceHandlerSupport.java:73)
      org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1438)
      org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1428)
      org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:185)
      org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:139)
      org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:108)
      org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:493)
      org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:390)
      org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334)
      org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)
      org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:174)
      org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:209)
      org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:180)
      org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:125)
      org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:94)
      org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:130)
      org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:537)
      org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:451)
      org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:651)
      org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:599)
      org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:665)
      org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:518)
      org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:459)
      org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
      javax.servlet.GenericServlet.init(GenericServlet.java:158)
      org.apache.jasper.runtime.PageContextImpl.forward(PageContextImpl.java:530)
      org.apache.jsp.index_jsp._jspService(index_jsp.java:119)
      org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
      javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
      org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:476)
      org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385)
      org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329)
      javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
      org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)


      근본 원인 (root cause)
      java.lang.IllegalArgumentException
      org.springframework.asm.ClassReader.<init>(Unknown Source)
      org.springframework.asm.ClassReader.<init>(Unknown Source)
      org.springframework.asm.ClassReader.<init>(Unknown Source)
      org.springframework.core.type.classreading.SimpleMetadataReader.<init>(SimpleMetadataReader.java:53)
      org.springframework.core.type.classreading.SimpleMetadataReaderFactory.getMetadataReader(SimpleMetadataReaderFactory.java:80)
      org.springframework.core.type.classreading.CachingMetadataReaderFactory.getMetadataReader(CachingMetadataReaderFactory.java:102)
      org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider.findCandidateComponents(ClassPathScanningCandidateComponentProvider.java:266)
      org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:242)
      org.springframework.context.annotation.ComponentScanBeanDefinitionParser.parse(ComponentScanBeanDefinitionParser.java:84)
      org.springframework.beans.factory.xml.NamespaceHandlerSupport.parse(NamespaceHandlerSupport.java:73)
      org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1438)
      org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1428)
      org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:185)
      org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:139)
      org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:108)
      org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:493)
      org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:390)
      org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334)
      org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)
      org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:174)
      org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:209)
      org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:180)
      org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:125)
      org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:94)
      org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:130)
      org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:537)
      org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:451)
      org.springframework.web.servlet.FrameworkServlet.configureAndRefreshWebApplicationContext(FrameworkServlet.java:651)
      org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:599)
      org.springframework.web.servlet.FrameworkServlet.createWebApplicationContext(FrameworkServlet.java:665)
      org.springframework.web.servlet.FrameworkServlet.initWebApplicationContext(FrameworkServlet.java:518)
      org.springframework.web.servlet.FrameworkServlet.initServletBean(FrameworkServlet.java:459)
      org.springframework.web.servlet.HttpServletBean.init(HttpServletBean.java:136)
      javax.servlet.GenericServlet.init(GenericServlet.java:158)
      org.apache.jasper.runtime.PageContextImpl.forward(PageContextImpl.java:530)
      org.apache.jsp.index_jsp._jspService(index_jsp.java:119)
      org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
      javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
      org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:476)
      org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385)
      org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329)
      javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
      org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)


    • Favicon of https://blog.naver.com/starmekey BlogIcon TakeKnowledge 2019.02.24 17:34

      org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet.handler.MappedInterceptor#0': Cannot create inner bean 'loggerInterceptor' of type [first.common.logger.LoggerInterceptor] while setting con
      structor argument; nested exception is org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [first.common.logger.LoggerInterceptor] for bean with name 'loggerInterceptor' defined in ServletContext resource [/WEB-INF/config/action-s
      ervlet.xml]; nested exception is java.lang.ClassNotFoundException: first.common.logger.LoggerInterceptor

      에러가 계속 발생했는데 위에 적히지 않은 방법으로 해결해서 기록을 남깁니다.
      사실 이것 때문에 해결된건지도 긴가 민가한데 아무튼 해당 조치 후 위 에러가 나오지 않았으니 적어봅니다

      저같은 경우 위 에러가 나고 보니 스프링 프로젝트에 빨간 느낌표가 있었습니다.
      그걸 보고 build path 문제가 뭐가 있구나 했는데 java build path 창 띄워서 보면 눈에 보이는 에러는 없었습니다.

      그래서 window -> show view -> problems 창을 띄워 보니 ojdbc 문제가 있다고 하더군요.
      근데 repository 경로를 가서 봐도 해당 위치에 해당 폴더가 다 있었는데..
      이상하게 모든 파일 용량이 1kb였습니다. 찾아보니 오라클과 무슨 저작권 문제로 jar 파일 자동 제공이 안되는 거 같더군요. 그래서

      일단 이클립스 종료하고 repository 싹 비우고 다시 이클립스 띄워서 maven clean- maven update를 진행한 후
      https://mvnrepository.com/artifact/com.oracle/ojdbc6/11.2.0.4.0-atlassian-hosted

      여기서 jar 파일 다운 받아 ojdbc 세팅된 경로에 집어넣고 서버 올리니 interceptor bean 생성이 안된다는 에러도 나오지 않더군요. 대체 ojdbc 문제인데 왜 interceptor bean 생성이 안된다는 에러가 난건지는 모르겠지만 분명 비슷한 문제를 겪는 분이 계실 것 같아 일단 제 방법 공유합니다

    • Favicon of https://jjunii486.tistory.com BlogIcon 쥬니준 2019.03.19 20:09 신고

      와 개린이님 감사합니다. 3-2)방법으로 하니깐 해결됐습니다. 위에와 동일하게 하려고 log4j 1.2.17 로도 변경해보고 별짓을 다 하다가 원글처럼 되긴 했는데 자꾸 log4j:ERROR Could not create the Layout. Reported error follows.
      java.lang.ClassNotFoundException: org.apache.log4j.PatternLayout 이 에러 떠서 결국 개린이님 방법으로 했는데 됐네요 -_ㅠ 휴

    • 5 2019.04.10 19:07

      댓글보고 해결했습니다

    • 자린이 2019.05.06 18:58

      쭉 작성하신데로 따라하고 있었는데 log4j 수정하고 SampleController 만든 다음 시범 구동 하려고 하면 톰캣에서 오류가 나요 ㅠㅠ

      java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]

      이렇게 나오면서 안 나오고 톰캣 버전은 9.0입니다. 왜 이런거죠...? ㅠㅠ

    • 자린이 2019.05.06 19:06

      5월 06, 2019 7:05:00 오후 org.apache.catalina.startup.VersionLoggerListener log
      정보: 서버 버전: Apache Tomcat/9.0.14
      5월 06, 2019 7:05:00 오후 org.apache.catalina.startup.VersionLoggerListener log
      정보: Server 빌드 시각: Dec 6 2018 21:13:53 UTC
      5월 06, 2019 7:05:00 오후 org.apache.catalina.startup.VersionLoggerListener log
      정보: Server 버전 번호: 9.0.14.0
      5월 06, 2019 7:05:00 오후 org.apache.catalina.startup.VersionLoggerListener log
      정보: OS Name: Windows 10
      5월 06, 2019 7:05:00 오후 org.apache.catalina.startup.VersionLoggerListener log
      정보: 운영체제 버전: 10.0
      5월 06, 2019 7:05:00 오후 org.apache.catalina.startup.VersionLoggerListener log
      정보: 아키텍처: amd64
      5월 06, 2019 7:05:00 오후 org.apache.catalina.startup.VersionLoggerListener log
      정보: Java Home: C:\eGovFrameDev-3.7.0-64bit\Java\jre1.8.0_201
      5월 06, 2019 7:05:00 오후 org.apache.catalina.startup.VersionLoggerListener log
      정보: JVM Version: 1.8.0_201-b09
      5월 06, 2019 7:05:00 오후 org.apache.catalina.startup.VersionLoggerListener log
      정보: JVM 벤더: Oracle Corporation
      5월 06, 2019 7:05:00 오후 org.apache.catalina.startup.VersionLoggerListener log
      정보: CATALINA_BASE: C:\pdev\.metadata\.plugins\org.eclipse.wst.server.core\tmp0
      5월 06, 2019 7:05:00 오후 org.apache.catalina.startup.VersionLoggerListener log
      정보: CATALINA_HOME: C:\sts-bundle\apache-tomcat-9.0.14
      5월 06, 2019 7:05:00 오후 org.apache.catalina.startup.VersionLoggerListener log
      정보: Command line argument: -Dcatalina.base=C:\pdev\.metadata\.plugins\org.eclipse.wst.server.core\tmp0
      5월 06, 2019 7:05:00 오후 org.apache.catalina.startup.VersionLoggerListener log
      정보: Command line argument: -Dcatalina.home=C:\sts-bundle\apache-tomcat-9.0.14
      5월 06, 2019 7:05:00 오후 org.apache.catalina.startup.VersionLoggerListener log
      정보: Command line argument: -Dwtp.deploy=C:\pdev\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps
      5월 06, 2019 7:05:00 오후 org.apache.catalina.startup.VersionLoggerListener log
      정보: Command line argument: -Djava.endorsed.dirs=C:\sts-bundle\apache-tomcat-9.0.14\endorsed
      5월 06, 2019 7:05:00 오후 org.apache.catalina.startup.VersionLoggerListener log
      정보: Command line argument: -Dfile.encoding=MS949
      5월 06, 2019 7:05:00 오후 org.apache.catalina.core.AprLifecycleListener lifecycleEvent
      정보: Loaded APR based Apache Tomcat Native library [1.2.19] using APR version [1.6.5].
      5월 06, 2019 7:05:00 오후 org.apache.catalina.core.AprLifecycleListener lifecycleEvent
      정보: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
      5월 06, 2019 7:05:00 오후 org.apache.catalina.core.AprLifecycleListener lifecycleEvent
      정보: APR/OpenSSL configuration: useAprConnector [false], useOpenSSL [true]
      5월 06, 2019 7:05:00 오후 org.apache.catalina.core.AprLifecycleListener initializeSSL
      정보: OpenSSL successfully initialized [OpenSSL 1.1.1a 20 Nov 2018]
      5월 06, 2019 7:05:00 오후 org.apache.coyote.AbstractProtocol init
      정보: ProtocolHandler ["http-nio-7070"]을(를) 초기화합니다.
      5월 06, 2019 7:05:00 오후 org.apache.coyote.AbstractProtocol init
      정보: ProtocolHandler ["ajp-nio-8009"]을(를) 초기화합니다.
      5월 06, 2019 7:05:00 오후 org.apache.catalina.startup.Catalina load
      정보: Server initialization in [890] milliseconds
      5월 06, 2019 7:05:00 오후 org.apache.catalina.core.StandardService startInternal
      정보: Starting service [Catalina]
      5월 06, 2019 7:05:00 오후 org.apache.catalina.core.StandardEngine startInternal
      정보: Starting Servlet engine: [Apache Tomcat/9.0.14]
      5월 06, 2019 7:05:02 오후 org.apache.catalina.core.ContainerBase startInternal
      심각: A child container failed during start
      java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]
      at java.util.concurrent.FutureTask.report(Unknown Source)
      at java.util.concurrent.FutureTask.get(Unknown Source)
      at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:914)
      at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:831)
      at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
      at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1382)
      at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1372)
      at java.util.concurrent.FutureTask.run(Unknown Source)
      at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
      at java.util.concurrent.AbstractExecutorService.submit(Unknown Source)
      at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:907)
      at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262)
      at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
      at org.apache.catalina.core.StandardService.startInternal(StandardService.java:423)
      at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
      at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:933)
      at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
      at org.apache.catalina.startup.Catalina.start(Catalina.java:637)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
      at java.lang.reflect.Method.invoke(Unknown Source)
      at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:350)
      at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:492)
      Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]
      at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:441)
      at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:198)
      at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1382)
      at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1372)
      at java.util.concurrent.FutureTask.run(Unknown Source)
      at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
      at java.util.concurrent.AbstractExecutorService.submit(Unknown Source)
      at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:907)
      ... 21 more
      Caused by: java.lang.IllegalArgumentException: Both parameter name and parameter value are required
      at org.apache.catalina.core.StandardContext.addParameter(StandardContext.java:3084)
      at org.apache.catalina.startup.ContextConfig.configureContext(ContextConfig.java:1257)
      at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1162)
      at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:768)
      at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:301)
      at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123)
      at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5029)
      at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
      ... 27 more

      5월 06, 2019 7:05:02 오후 org.apache.catalina.core.ContainerBase startInternal
      심각: A child container failed during start
      java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: A child container failed during start
      at java.util.concurrent.FutureTask.report(Unknown Source)
      at java.util.concurrent.FutureTask.get(Unknown Source)
      at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:914)
      at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262)
      at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
      at org.apache.catalina.core.StandardService.startInternal(StandardService.java:423)
      at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
      at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:933)
      at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
      at org.apache.catalina.startup.Catalina.start(Catalina.java:637)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
      at java.lang.reflect.Method.invoke(Unknown Source)
      at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:350)
      at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:492)
      Caused by: org.apache.catalina.LifecycleException: A child container failed during start
      at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:926)
      at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:831)
      at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
      at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1382)
      at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1372)
      at java.util.concurrent.FutureTask.run(Unknown Source)
      at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
      at java.util.concurrent.AbstractExecutorService.submit(Unknown Source)
      at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:907)
      ... 13 more
      Caused by: java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]
      at java.util.concurrent.FutureTask.report(Unknown Source)
      at java.util.concurrent.FutureTask.get(Unknown Source)
      at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:914)
      ... 21 more
      Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]
      at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:441)
      at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:198)
      at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1382)
      at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1372)
      at java.util.concurrent.FutureTask.run(Unknown Source)
      at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
      at java.util.concurrent.AbstractExecutorService.submit(Unknown Source)
      at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:907)
      ... 21 more
      Caused by: java.lang.IllegalArgumentException: Both parameter name and parameter value are required
      at org.apache.catalina.core.StandardContext.addParameter(StandardContext.java:3084)
      at org.apache.catalina.startup.ContextConfig.configureContext(ContextConfig.java:1257)
      at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1162)
      at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:768)
      at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:301)
      at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123)
      at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5029)
      at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
      ... 27 more

      5월 06, 2019 7:05:02 오후 org.apache.catalina.startup.Catalina start
      심각: 필수 항목인 Server 구성요소가 제대로 시작되지 못하여 Tomcat이 시작될 수 없습니다.
      org.apache.catalina.LifecycleException: A child container failed during start
      at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:926)
      at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262)
      at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
      at org.apache.catalina.core.StandardService.startInternal(StandardService.java:423)
      at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
      at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:933)
      at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
      at org.apache.catalina.startup.Catalina.start(Catalina.java:637)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
      at java.lang.reflect.Method.invoke(Unknown Source)
      at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:350)
      at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:492)
      Caused by: java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: A child container failed during start
      at java.util.concurrent.FutureTask.report(Unknown Source)
      at java.util.concurrent.FutureTask.get(Unknown Source)
      at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:914)
      ... 13 more
      Caused by: org.apache.catalina.LifecycleException: A child container failed during start
      at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:926)
      at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:831)
      at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
      at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1382)
      at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1372)
      at java.util.concurrent.FutureTask.run(Unknown Source)
      at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
      at java.util.concurrent.AbstractExecutorService.submit(Unknown Source)
      at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:907)
      ... 13 more
      Caused by: java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]
      at java.util.concurrent.FutureTask.report(Unknown Source)
      at java.util.concurrent.FutureTask.get(Unknown Source)
      at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:914)
      ... 21 more
      Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]
      at org.apache.catalina.util.LifecycleBase.handleSubClassException(LifecycleBase.java:441)
      at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:198)
      at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1382)
      at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1372)
      at java.util.concurrent.FutureTask.run(Unknown Source)
      at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
      at java.util.concurrent.AbstractExecutorService.submit(Unknown Source)
      at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:907)
      ... 21 more
      Caused by: java.lang.IllegalArgumentException: Both parameter name and parameter value are required
      at org.apache.catalina.core.StandardContext.addParameter(StandardContext.java:3084)
      at org.apache.catalina.startup.ContextConfig.configureContext(ContextConfig.java:1257)
      at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1162)
      at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:768)
      at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:301)
      at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123)
      at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5029)
      at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
      ... 27 more

      5월 06, 2019 7:05:02 오후 org.apache.coyote.AbstractProtocol pause
      정보: Pausing ProtocolHandler ["http-nio-7070"]
      5월 06, 2019 7:05:02 오후 org.apache.coyote.AbstractProtocol pause
      정보: Pausing ProtocolHandler ["ajp-nio-8009"]
      5월 06, 2019 7:05:02 오후 org.apache.catalina.core.StandardService stopInternal
      정보: 서비스 [Catalina]을(를) 중지시킵니다.
      5월 06, 2019 7:05:02 오후 org.apache.coyote.AbstractProtocol destroy
      정보: Destroying ProtocolHandler ["http-nio-7070"]
      5월 06, 2019 7:05:02 오후 org.apache.coyote.AbstractProtocol destroy
      정보: Destroying ProtocolHandler ["ajp-nio-8009"]

      이렇게 나오면서 톰캣 구동이 안 되네요 ㅠㅠ

    • 장수궁뎅이 2019.05.08 10:18

      개발환경
      eclipse 2019-03 x64
      java jdk 1.8.0_211 ( jre 사용하면 안됨 )
      tomcat 8.5

      지금까지의 에러정리 해보겠습니다.
      1) first.common.logger가 아닌 다른 이름으로 사용하시는 경우.

      log4j.xml의 name 변경
      <logger name="xxxx" additivity="false">
      <level value="debug" />
      <appender-ref ref="console" />
      </logger>

      -action-servlet mvc:에서 경로 수정


      2. pom.xml에서의 오류 ( release 4.x 사용하시는 경우 )
      -json view classNotFound 오류
      -json view 변경
      <!-- MappingJacksonJsonView -->
      <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.5.1</version>
      </dependency>
      <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-annotations</artifactId>
      <version>2.5.1</version>
      </dependency>
      <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.5.1</version>
      </dependency>

      -action-servlet변경 id=jsonView인 bean
      <bean id="jsonView" class="org.springframework.web.servlet.view.json.MappingJackson2JsonView" />


      -ojdbc 오류
      -ojdbc 주석처리 -- 향후 jar파일을 다운받아 사용하기를 권장.
      <!-- Oracle -->
      <!-- <dependency>
      <groupId>com.oracle</groupId>
      <artifactId>ojdbc14</artifactId>
      <version>10.2.0.4.0</version>
      </dependency> -->

      3. Loggerinterceptor log import

      import org.apache.commons.logging.Log;
      import org.apache.commons.logging.LogFactory;
      2개 사용

      -Controller에서의 import
      import org.apache.log4j.Logger;

      4. jsp 폴더 경로 바꿨을 때
      action-servlet UrlBasedViewResolver prefix: 확인

      / : webapp이 루트경로

      5. jstl 1.2 오류
      -taglibs - standard추가
      <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
      </dependency>
      <dependency>
      <groupId>taglibs</groupId>
      <artifactId>standard</artifactId>
      <version>1.1.2</version>
      </dependency>

      -maven repository에서 jstl-1.2.jar파일을 WEB-INF/lib/ 경로에 넣어준다.

    • TED OH 2019.06.07 13:47

      자바 Spring 초보에요 코드 따라하면서 삽질끝에 LoggerInterceptor.java 까지 오류없이 완료했습니다.
      테스트해보려고 Tomcat 실행시키니...
      이런 오류가 뜨네요...
      Caused by: java.io.FileNotFoundException: Could not open ServletContext resource [/]

      아래는 콘솔의 오류 부분입니다..
      제발 도와주세요

      ========= 아 래 ============

      at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5236)
      at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
      at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1423)
      at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1413)
      at java.util.concurrent.FutureTask.run(FutureTask.java:266)
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
      at java.lang.Thread.run(Thread.java:748)
      Caused by: java.io.FileNotFoundException: Could not open ServletContext resource [/]
      at org.springframework.web.context.support.ServletContextResource.getInputStream(ServletContextResource.java:140)
      at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:328)
      ... 21 more

      Jun 07, 2019 1:39:49 PM org.apache.catalina.core.StandardContext startInternal
      심각: One or more listeners failed to start. Full details will be found in the appropriate container log file
      Jun 07, 2019 1:39:49 PM org.apache.catalina.core.StandardContext startInternal
      심각: Context [/first] startup failed due to previous errors
      Jun 07, 2019 1:39:49 PM org.apache.catalina.core.ApplicationContext log
      정보: Closing Spring root WebApplicationContext
      2019-06-07 13:39:49,259 5p [org.springframework.web.context.support.XmlWebApplicationContext] Closing Root WebApplicationContext: startup date [Fri Jun 07 13:39:49 KST 2019]; root of context hierarchy
      2019-06-07 13:39:49,269 5p [org.springframework.web.context.support.XmlWebApplicationContext] Exception thrown from ApplicationListener handling ContextClosedEvent
      java.lang.IllegalStateException: ApplicationEventMulticaster not initialized - call 'refresh' before multicasting events via the context: Root WebApplicationContext: startup date [Fri Jun 07 13:39:49 KST 2019]; root of context hierarchy
      at org.springframework.context.support.AbstractApplicationContext.getApplicationEventMulticaster(AbstractApplicationContext.java:347)
      at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:334)
      at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:1049)
      at org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:1010)
      at org.springframework.web.context.ContextLoader.closeWebApplicationContext(ContextLoader.java:559)
      at org.springframework.web.context.ContextLoaderListener.contextDestroyed(ContextLoaderListener.java:143)
      at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:4817)
      at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5474)
      at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:226)
      at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
      at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1423)
      at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1413)
      at java.util.concurrent.FutureTask.run(FutureTask.java:266)
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
      at java.lang.Thread.run(Thread.java:748)
      2019-06-07 13:39:49,270 5p [org.springframework.web.context.support.XmlWebApplicationContext] Exception thrown from LifecycleProcessor on context close
      java.lang.IllegalStateException: LifecycleProcessor not initialized - call 'refresh' before invoking lifecycle methods via the context: Root WebApplicationContext: startup date [Fri Jun 07 13:39:49 KST 2019]; root of context hierarchy
      at org.springframework.context.support.AbstractApplicationContext.getLifecycleProcessor(AbstractApplicationContext.java:360)
      at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:1057)
      at org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:1010)
      at org.springframework.web.context.ContextLoader.closeWebApplicationContext(ContextLoader.java:559)
      at org.springframework.web.context.ContextLoaderListener.contextDestroyed(ContextLoaderListener.java:143)
      at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:4817)
      at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5474)
      at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:226)
      at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
      at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1423)
      at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1413)
      at java.util.concurrent.FutureTask.run(FutureTask.java:266)
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
      at java.lang.Thread.run(Thread.java:748)
      Jun 07, 2019 1:39:49 PM org.apache.catalina.core.StandardContext listenerStop
      심각: Exception sending context destroyed event to listener instance of class [org.springframework.web.context.ContextLoaderListener]
      java.lang.IllegalStateException: BeanFactory not initialized or already closed - call 'refresh' before accessing beans via the ApplicationContext
      at org.springframework.context.support.AbstractRefreshableApplicationContext.getBeanFactory(AbstractRefreshableApplicationContext.java:171)
      at org.springframework.context.support.AbstractApplicationContext.destroyBeans(AbstractApplicationContext.java:1090)
      at org.springframework.context.support.AbstractApplicationContext.doClose(AbstractApplicationContext.java:1064)
      at org.springframework.context.support.AbstractApplicationContext.close(AbstractApplicationContext.java:1010)
      at org.springframework.web.context.ContextLoader.closeWebApplicationContext(ContextLoader.java:559)
      at org.springframework.web.context.ContextLoaderListener.contextDestroyed(ContextLoaderListener.java:143)
      at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:4817)
      at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5474
      ...
      ...

      • 시작인게야 2020.01.06 12:50

        fileNotfound /WEB-INF/spring/root-context.xml 이면
        web.xml 파일에 <context-param>,<listener> 없애주세요.

        <!-- The definition of the Root Spring Container shared by all Servlets and Filters
        <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/spring/root-context.xml</param-value>
        </context-param>
        -->
        <!-- Creates the Spring Container shared by all Servlets and Filters
        <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
        -->

    • 찬양도리 2019.08.06 11:29

      자바 인강으로만 배우는 중입니다 사실 저는 학원가본 적도 없고 책을 사보는 것도 시력이 나빠 컴퓨터로만 편한데요 좋은 강의 감사하고, 위 에러들에 혹시 도움될까 싶어 적습니다.

      스프링 3.2.X는 자바 1.8과 호환되지 않기 때문에 톰캣실행 시 문제가 발생합니다.(제가 여기저기 공부한 바). 따라서 강의대로 하려면, 자바 1.7에 맞는 이클립스 luna나 mars가 맞는데 이게 또 스프링 설치하기가 숩지 않지요. sts-3.7.3 정도를 쓰려다가
      Oxygen으로 하고 있습니다. 자바는 1.8인데 Configure Build Path에서 Alternative JRE: JDK1.8.0_211로 했더니 모든 게 잘 됩니다.

      조만간 제가 나름 정리한 글(강의?) 연제할 생각입니다.^^
      즐거운 프로그래머들이여 화이팅 합시다!!

    • Following 2019.09.23 19:32

      안녕하세요.
      올려주신 강좌를 보면서 따라하며 익히는 중인데요...
      한가지 오류가 해결되지 않아 댓글 남겨봅니다.

      =================================================================
      SEVERE: 서블릿 [action]을(를) 위한 Servlet.init() 호출이 예외를 발생시켰습니다.
      org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jsonView' defined in ServletContext resource [/WEB-INF/config/action-servlet.xml]: Instantiation of bean failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.web.servlet.view.json.MappingJacksonJsonView]: Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: org/codehaus/jackson/map/ObjectMapper
      ...
      Caused by: org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [org.springframework.web.servlet.view.json.MappingJacksonJsonView]: Constructor threw exception; nested exception is java.lang.NoClassDefFoundError: org/codehaus/jackson/map/ObjectMapper
      ...

      그리고 페이지를 확인하면 500오류가 발생하면서 로깅이 안됩니다.

      org.apache.jasper.JasperException: 행 [3]에서 [index.jsp]을(를) 처리하는 중 예외 발생
      1: <%@ page language="java" contentType="text/html; charset=utf-8"
      2: pageEncoding="utf-8"%>
      3: <jsp:forward page="/sample/openSampleList.do"/>

      해결하신 분 도움 좀 부탁드리겠습니다.

    • Following 2019.09.24 09:38

      Self 답변답니다.
      위와 같이 오류가 뜨면 json mapping을 아래처럼 바꿔주니 되네용

      <!-- MappingJacksonJsonView -->
      <dependency>
      <groupId>org.codehaus.jackson</groupId>
      <artifactId>jackson-mapper-asl</artifactId>
      <version>1.9.13</version>
      </dependency>

      <dependency>
      <groupId>org.codehaus.jackson</groupId>
      <artifactId>jackson-core-asl</artifactId>
      <version>1.9.13</version>
      </dependency>
      <!-- -->

      • Following 2019.11.27 14:11

        첨언드리자면
        저같은 경우 해당 mapping이 존재하지 않았습니다. 찾아보시고 만약 없으시면 위에 글 복사하셔서 pom.xml에 추가로 넣으시면 됩니다.

      • 시작 2020.01.06 12:57

        덕분에 잘 해결되었습니다.
        감사합니다.

    • bufferoverflow 2019.10.22 10:24



      로그 안찍히시는 분들 아래 logger name에 프로젝트 네임 넣으신 분들 계신거 같은데 (저같은 경우;;)
      여기에 자바 패키지 네임 넣으세요 글쓴이분은 패키지명과 프로젝트 네임이 동일하여 상관없으셨는데
      저는 패키지명하고 프로젝트명 달리해서 프로젝트명으로 넣었더니 안나왔네요
      자바 프로젝트 패키지명 넣으시면 됩니다.
      예를들어 java 폴더 바로 하위에 있는 패키지 시작명 넣으시면 돼요
      글 작성자분은 src/main/java 하위에 first네임이여서 first로 설정하신겁니다~
      혹시나 저같은 실수 하신분들 참고하세요
      <logger name="first" additivity="false">
      <level value="debug" />
      <appender-ref ref="console"/>
      </logger>


    • ㅇㅇㅇ 2019.12.08 21:39

      작성자분의 패키지 구조 정확하게 따라하시고 action-servlet.xml의 jsonView와 관련된 코드 한줄만 삭제하면 정상 작동합니다.

    • ㄴㄴㄴ 2019.12.18 14:53

      first.common.logger 패키지가 왜 갑자기 first 안에 common.logger 패키지가 들어가 있는걸로 바뀐거져? ㅠ

    • 시작시작 2020.01.06 13:12

      작성자님 감사합니다.
      최근 버전으로 따라했는데 몇몇 부분에서 설정이 달라 애먹긴 햇어도
      console에 log 잘 찍혀나옵니다.

      JDK : 1.8
      IDE : Eclipse 2019-06
      Spring Version : 4.5.2
      톰캣 : ApachTomcat 7.0

      1) 개린이님이 작성해주신 3-1 부분

      package first.common.logger;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;

      import org.slf4j.Logger;
      import org.slf4j.LoggerFactory;

      import org.springframework.web.servlet.ModelAndView;
      import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

      public class LoggerInterceptor extends HandlerInterceptorAdapter
      {
      protected Logger log = LoggerFactory.getLogger(LoggerInterceptor.class);

      @Override
      public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception
      {
      if (log.isDebugEnabled())
      {
      log.debug("====================================== START ======================================";);
      log.debug(" Request URI \t: " + request.getRequestURI());
      }

      return super.preHandle(request, response, handler);
      }

      @Override
      public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception
      {
      if (log.isDebugEnabled())
      {
      log.debug("====================================== END ======================================\n";);
      }
      }
      }

      2) Following님처럼 pom.xml에 아래부분 추가해주시면 됩니다.
      <!-- MappingJacksonJsonView -->
      <dependency>
      <groupId>org.codehaus.jackson</groupId>
      <artifactId>jackson-mapper-asl</artifactId>
      <version>1.9.13</version>
      </dependency>

      <dependency>
      <groupId>org.codehaus.jackson</groupId>
      <artifactId>jackson-core-asl</artifactId>
      <version>1.9.13</version>
      </dependency>
      <!-- -->



    • 맥모닝 2020.02.23 16:19

      패키지명이 sample.controller가 아닌 first.sample.controller로 해주니까 잘 나오네요
      위의 방법들 다 안될 경우 패키지명 확인해보세요

    • 지구 2020.04.22 18:47

      안녕하세요! src/main/java의 패키지 안에 log4j.xml에서 application logging을 DEBUG레벨로 설정해도 적용이 되지 않아 한참 고민했네요ㅠㅠ 에러도 없었고요, 혹시 해서 src/test/java안의 log4j.xml도 수정해 주었습니다.
      실행되는 경로 따라가 보니 WEB-INF/classes안의 log4j.xml을 찾을 수 없다고 뜨길래 WEB-INF/classes안에 log4j.xml을 복사해다 넣어주었더니 정상적으로 DEBUG 로그가 뜨고 있어요. 이 상황 관련하여 아시는 분 있을까요? 코드는 올려주신 대로 적었고 패키지와 경로도 모두 확인했습니다. log4j.xml이 WEB-INF 안에서 호출되어도 괜찮은 건가요? 보안적 문제나 패키지 구조가 깔끔하지 않은 문제가 있는지 여쭈어요.

      *Interceptor는 sysout 찍었을 때 정상적으로 작동되었으며 logger.isEnabled()만 계속 false로 떠서 어플리케이션 로그가 DEBUG레벨로 가동되지 않는구나 하고 찾아낸 방법입니다.

Designed by Tistory.