티스토리 뷰

Framework/Spring

Spring Framework(4)

beecomci 2017. 2. 5. 11:26

[Log]


1. Log4j 설정

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

사실 이미 개발할 때 System.out.println()으로 출력해서 값을 확인해보는데, 이걸 로그의 한 종류라고 생각할 수 있지만 이건 그냥 출력일 뿐 로그가 아니다.

이렇게 찍으면 될것을 굳이 로그를 사용하는 이유는, System.out.println()이 시스템 운영시에 큰 문제를 야기하기 때문이다.


1) 운영시에 불필요한 로그가 계속 출력되어서 리소스가 낭비된다.

2) 모든 로그를 지워버리면, 에러가 났을경우 그 에러원인을 찾기 어려울 수 있다. 로그를 출력하도록 설정해놨는데 System.out.println()을 모두 지워버렸다면 로그가 안남을 수 있다.

3) 성능에 큰 영향을 미친다. 호출할수록 프로그램의 전체적인 성능이 떨어진다. 


그래서 Log4j는 이 문제점들을 해결할 수 있으며 시스템 성능에 큰 영향을 미치지 않을 수 있다.


[요소]

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

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

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


[로그 레벨]

- FATAL : 아주 심각한 에러 발생

- ERROR : 요청을 처리하는 중 문제 발생

- WARN : 프로그램 실행에는 문제가 없지만, 향후 에러의 원인이 될 수 있는 경고성 메시지

- INFO : 어떠한 상태 변경과 같은 정보성 메시지를 나타냄

- DEBUG : 개발시 디버그 용도로 사용하는 메시지

- TRACE : 디버그 레벨이 너무 광범위한 것을 해결하기 위해 좀 더 상세한 이벤트를 나타냄


Log4j를 .properties 파일을 이용한 설정방법은 절대 사용하지 말자!!!!!

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


2. log4j.xml 파일 설정하기


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

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

예를들어, 이클립스에서 출력되는 로그들 중에서 " INFO : "라고 되어 있는 부분이 INFO 레벨의 로그이다. 


3. 인터셉터(Interceptor) 설정


인터셉터는 중간에 무언가를 가로챈다는 의미이다. 

스프링에서 말 그대로 중간에 요청을 가로채서 어떠한 일을 하는 것을 의미한다.

빨간색 박스부분에서 인터셉터가 동작

인터셉터의 정확한 명칭은 핸들러 인터셉터(Handler Interceptor)이다. 인터셉터는 DispatcherServlet이 컨트롤러를 호출하기 전과 후에 요청과 응답을 가로채서 가공할 수 있도록 해준다. 


예들 들어, 로그인을 했을 때와 안했을 때의 화면을 다르게 보여주기 위해서 각각 로그인을 체크하는 로직을 복사 붙여넣기로 만들었었다. 

하지만 스프링에서는 인터셉터를 사용해서 이 기능을 간단하게 만들 수 있다. 인터셉터에서 어떠한 요청이 들어올 때, 그 사람의 로그인 여부를 판단해서 로그인이 되어있으면 요청한 페이지로 이동하고, 안되어있다면 바로 메인 페이지로 이동하도록 하면 끝이다. 

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


LoggerInterceptor를 src/main/java의 first.common.logger 패키지에 만든 뒤, 이것을 등록하기 위해 action-servelt.xml을 수정한다. 

Spring 3.2 이상에서는 <mvc:mapping path/>를 통해서 인터셉터가 동작할 url을 지정할 수 있다. 

지금 작성한 logger는 모든 요청에서 동작하기 때문에 전체 패스를 의미하도록 <mvc:mapping path="/**"/> 로 설정하였다. 그 후 bean을 수동으로 등록한다.


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



-> DispatcherServlet이 클라이언트의 요청을 받아서 해당 요청에 매핑되는 컨트롤러가 있는지 확인하고 있다면 컨트롤러에서 정의된 view를 사용자의 브라우저에 출력하는 역할을 수행한다. 


즉 우리는 action-servlet.xml에 interceptor를 설정함으로써, DispatcherServlet과 Interceptor를 같은 위치에 등록했다. 또한 web.xml을 확인하면 DispatcherServelt을 이미 정의했던 것을 확인할 수 있다. 


-> 여기까지 하고 톰캣 서버 실행하려하는데 계속

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

에러가 났다.

maven의 respository를 다 지우고 update하기도 하고 servlet-api.jar 파일을 이리저리 옮기기도 해봤는데 계속 안되서 그냥 블로그에 올리신 프로젝트 파일을 다운받아서 실행했더니 된다.... 다 나랑 같은 파일인데 ㅜㅜ


[참고]

http://addio3305.tistory.com/43#recentComments


'Framework > Spring' 카테고리의 다른 글

Spring Framework(6)  (0) 2017.02.05
Spring Framework(5)  (0) 2017.02.05
Spring Framework(3)  (0) 2017.02.05
Spring Framework(2)  (0) 2017.02.05
Spring Framework(1)  (0) 2017.02.05
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/02   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
글 보관함