티스토리 뷰
[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
- 12100
- 2048 game
- 약수
- lottie
- Java
- 1085
- 조합 알고리즘
- 이진 탐색
- 자료구조
- ACM Craft
- 알파벳 찾기
- 10809
- combination
- 알고리즘
- 1157
- mybatis
- acmpicpc
- acmicpc
- 째로탈출2
- 7569
- 7576
- spring
- 1037
- 파라메트릭
- 13460
- 이진 검색
- 단어 공부
- BOJ
- parametric search
- 위상정렬
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |