본문 바로가기
Spring 프레임워크/메모

Spring 로그 분석 하기

by Hwanii_ 2023. 8. 6.
728x90

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

 

★ 로그 분석 하기 ★

1)

WebApplicationContext
XxxApplicationContext == "컨테이너를 구동 하겠다" 는 의미 이다.

컨테이너를 구동 하려면 ???

>> 무조건 .xml 이 필요 하다 !

 

 

 

2)

WEB-INF 하위에 DispatcherServlet-servlet.xml 을 만들어 놓지 않았으면,

톰캣 서버를 실행 할 때, 에러가 발생 하게 된다.

 

어쩌구저쩌구 ~~~ [/WEB-INF/DispatcherServlet-servlet.xml]

 
해당 에러는, DispatcherServlet-servlet 이라는 이름의 resource가 필요 하다는 의미 이다.

 

즉,

DispatcherServlet-servlet.xml 라는 설정 파일을,

"/WEB-INF 폴더 하위에 만들어" 라는 의미.

 

 /WEB-INF 폴더 하위에 DispatcherServlet-servlet.xml 파일을 만들어야할까 ?

 

이유는 다음과 같다.

 

 >>

/WEB-INF 폴더는 웹 애플리케이션의 보안과 구조상의 이유로,

클라이언트 (사용자) 으로부터, 직접 접근을 할 수 없는 위치 이다.

 

따라서, 설정 파일이  /WEB-INF 폴더 내부에 있으면, 외부에서 직접 접근이 불가능 하다.

이는, 보안상의 이점을 가져오며,

설정 파일의 위치를,

/WEB-INF 으로 통일 하면 스프링 컨테이너가 설정 파일을 쉽게 찾아서 사용 한다.

 

>>

뿐만아니라, 관례적으로 스프링 프레임워크는 설정 파일의 위치와 명칭에 관해서 정해두었다.

 

그래서, 이런 관례에 따르면 개발자가 설정 파일의 경로와 이름을 명시 하지 않아도,

스프링이 자동으로 해당 파일을 찾는다.

 

DispatcherServlet의 경우, 해당 서블릿의 이름을 기반으로,

[ 서블릿이름 ] -servlet.xml 형식의 파일 이름을 찾는 관례를 따른다.

 

이런 관례를 따르면, 스프링의 자동 설정 기능을 효율적으로 활용하고,

설정 파일의 위치와 이름을 미리 예측 할 수 있게 된다.

 

3)

DispatcherServlet-servlet.xml 가 있어야 하는 이유를 더 상세히 알아보자.

 

아래는 web.xml 내부에 작성된 설정 이다.

 

<?xml version="1.0" encoding="UTF-8"?>
<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 https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

<servlet>
    <servlet-name>DispatcherServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  </servlet>
  
  <servlet-mapping>
    <servlet-name>DispatcherServlet</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>

 

 

 

톰캣 서버가 실행 될 때,

서블릿 컨테이너의 설정 파일인 web.xml 파일 내부에 작성된 기능 설정을 읽게 된다.

 

DispatcherServlet 이라는 이름으로 <servlet> 태그를 사용했고,

 

스프링은 DispatcherServlet를 초기화 (생성 == 로딩) 한다.

 

이때, DispatcherServlet과 의존관계를 이루는 멤버 (멤버변수 + 메서드) 에 대한

설정을 하기 위한, 파일은 DispatcherServlet-servlet.xml 파일 이다.

 

★ 스프링 컨테이너가 DS 를 생성 (== 초기화) 하면서, init() 메서드를 호출 한다. ★

 

일반적으로 개발자가,

DispatcherServlet-servlet.xml 파일 내부에 직접적으로 init() 메서드에 대한

설정을 작성하는것은 불가능 한데,

 

그렇다 하더라도,

init() 메서드는, DispatcherServlet 내부의 메서드 이므로,

의존 관계 이고,

DispatcherServlet 이 내부적으로 init() 메서드를 호출하는 시점은,

위에 작성했듯이,

DispatcherServlet 의 초기화 과정이 이루어 질 때 이므로,

DispatcherServlet-servlet.xml 가 반드시 존재 해야 한다.

 

그래서, init() 메서드 관련한 에러가 발생 한다면, 발생 이유는 아래와 같다.

 

 

현재 DispatcherServlet-servlet.xml 파일이 없기 때문에,
DS를 초기화 할때, init() 메서드가 호출 될 수 없어서 발생 하는 에러 이다.

 

init() 메서드 >>

의존 관계에 놓인 멤버변수를 초기화 할 때 사용되는 메서드 이다.

(즉, 의존 주입 (DI) 할 때 사용 되는 메서드)

 

 

 

4)
로그 분석을 왜 해야 할까 ?

새로운 프레임워크를 만났을 때, 위와 같은 에러는 항상 보게 되는 에러 로그 일텐데,
해당하는 로그가,

어떤 의미를 가지는지를, 파악 할 수 있어야 에러 해결이 가능 하기 때문에

이러한 에러가 발생하는 개념에 대해 알아 둬야 한다고 생각 한다.

 

 

 

[참고]

WebApplicationContext

AbstractApplicationContext 추상클래스를 상속 받은 대표적인 웹 관련 클래스 이다.
(웹을 구동 하겠다는 의미를 가진 클래스)

 

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

반응형