간단한 Spring MVC설정(ControllerClassNameHandlerMapping)
==========================================================================================
http://everlikemorning.tistory.com/entry/간단한-Spring-MVC설정ControllerClassNameHandlerMapping
간단하게 SpringMVC프로젝트를 만드는 과정입니다.
내용에 문제가 있다거나 보충해야될 사항이 있으면, 꼭 댓글달아주세요.
그리고 들어가기에 앞서 여기서 SpringMVC를 모두 설명할순없습니다.
자세히 알고싶으신 분은 http://www.springsource.org/documentation 여기를 참고하세요^^
==========================================================================================
1. 이클립스에서 file > new >dynamic web poject를
하나
생성합니다.
2. web.xml 설정 (/WebContent/WEB_INF/web.xml)
<?xml version="1.0" encoding="UTF-8"?> load-on-setup속성을 가지고있는 Dispatcher로 넘어가게됩니다. Dispatcher가
여기서는
하나밖에
없으니
신경쓸
필요
없을거같습니다
ㅋ--> |
3. dispatcher-servlet.xml (/WebContent/WEB_INF/dispatcher-servlet.xml)
<?xml version="1.0" encoding="UTF-8"?> <!-- handler mapping --> <!-- controller --> |
<!-- handler mapping --> |
<!-- view resolver --> |
<!-- controller --> |
package com.lcy.controller; import java.util.Date; import javax.servlet.http.HttpServletRequest; import org.apache.log4j.Logger; public class HelloController extends MultiActionController{ } |
보시면
메서드가 hello와 now가
있습니다. 따라서 http://localhost:8090/Spring_MVC_Ex/hello/hello.do 또는,http://localhost:8090/Spring_MVC_Ex/hello/now.do 형식의
요청이
들어왔을때
각각
처리해서
hello/hello.jsp나 hello/now.jsp의
뷰를
넘겨줍니다. (앞에 "/"와
뒤의 ".jsp"는 view resolver에서
세팅되어있었죠?)
4. view파일
작성
이제 WebContent/hello/에 hello.jsp와 now.jsp를
작성해보겠습니다.
hello.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR" |
now.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR" |
자, 이제
뷰까지
완성하고
프로젝트
클릭 > 우클릭 > run as > run on server 해서
실행하면....
404에러가
뜰겁니다.(걍
예상한거라... 다른
에러가
뜨나... ㅡ_ㅡ;;;)
암튼
원인은 web.xml에 welcome파일을 index.jsp로
설정했기때문에
이
파일이
없어서
그런거죠.
/WebContent/WEB-INF/에 index.jsp를
하나
만들어줍니다.
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" |
요청이
잘
전달될수
있도록
포워딩을
시켜줍니다.
<jsp:forward page="/hello/hello.do"/>
이제
실행하면
잘
될겁니다. http://localhost:8090/Spring_MVC_Ex/ (로컬이라
눌러봐야안됩니다. ㅡ_ㅡ^ 예전에
어떤
분이
낚이셨다고
하셨는데
ㅋㅋㅋ
하X님이었나요? ㅋㅋㅋ)
지금까지
작업한
프로젝트
구조입니다.
출처 - http://cafe.naver.com/javachobostudy.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=30415&social=1
===========================================================
2009/11/18 11:40 in OpenSource/Log4J
* log4j를 사용하면 다음과 같은 장점이 있습니다.(일반적인 견해 + 개인적인 생각 ㅡ_ㅡ)
1. sysout남발로 인한 소스및 로그가 지저문해지는것을 방지.
2. sysout남용으로 인한 성능저하 방지.
3. 로그 모니터링및 문제 발생시 추적이 편해집니다.
4. 개발자들간에 로깅 방식이 통일되어 일관성있는 로깅이 가능해집니다.
* 그럼 지금부터 간단하게 log4j 설정해보겠습니다.
1. jar 다운로드 : http://www.apache.org/dyn/closer.cgi/logging/log4j/1.2.15/apache-log4j-1.2.15.zip
(스프링프레임웤을 다운받은적이 있는분은 (다운받은 스프링폴더)\lib\log4j에 보면 log4j-1.2.15.jar라는 파일이 있습니다.)
2. log4j-1.2.15.jar(Log4J버전에 따라 뒤에 숫자는 차이가 있습니다.)를 [프로젝트 소스폴더]\WebContent\WEB-INF\lib로 복사해서 추가합니다.
이클립스에서 프로젝트를 클릭하고 F5를 누른후 위와 같이 추가된것이 확인되면 문제 없이 추가 된겁니다.
3. 다음으로 web.xml설정을 입니다. web.xml에 다음 코드를 주가합니다.
<listener> |
4. 다음으로 프로퍼티 설정입니다.
4-1 Log4J 로깅레벨
① FATAL : 치명적인 에러가 났을때 사용. |
4-2 /WEB-INF/log4j.properties 작성.
# 최상위 카테고리에 DEBUG로 레벨 설정 및 appender로 stdout, dailyfile을 정의 # console # file # iBatis |
4-3 로그파일명 포맷 (DatePattern) : 위에서 "log4j.appender.dailyfile.DatePattern='.'yyyy-MM-dd" 부분입니다.
형식 | 설명 |
'.'yyyy-MM | 매달 첫번째날에 로그파일을 변경합니다 |
'.'yyyy-ww | 매주의 시작시 로그파일을 변경합니다. |
'.'yyyy-MM-dd | 매일 자정에 로그파일을 변경합니다. |
'.'yyyy-MM-dd-a | 자정과 정오에 로그파일을 변경합니다. |
'.'yyyy-MM-dd-HH | 매 시간의 시작마다 로그파일을 변경합니다. |
'.'yyyy-MM-dd-HH-mm | 매분마다 로그파일을 변경합니다. |
4-4 PatternLayout 포맷
로그자체를 어떤 포맷으로 남길지 결정합니다.
layout에는 HTMLLayout, PatternLayout, SimpleLayout, XMLLayout등이 있으며 PatternLayout이 일반적으로 가장 많이 쓰입니다.
형식 | 설명 |
%p | debug, info, warn, error, fatal 등의 priority 가 출력된다. |
%m | 로그내용이 출력됩니다 |
%d | 로깅 이벤트가 발생한 시간을 기록합니다. |
%t | 로그이벤트가 발생된 쓰레드의 이름을 출력합니다. |
%% | % 표시를 출력하기 위해 사용한다. |
%n | 플랫폼 종속적인 개행문자가 출력된다. \r\n 또는 \n 일것이다. |
%c | 카테고리를 표시합니다 |
%C | 클래스명을 포시합니다. |
%F | 로깅이 발생한 프로그램 파일명을 나타냅니다. |
%l | 로깅이 발생한 caller의 정보를 나타냅니다 |
%L | 로깅이 발생한 caller의 라인수를 나타냅니다 |
%M | 로깅이 발생한 method 이름을 나타냅니다. |
%r | 어플리케이션 시작 이후 부터 로깅이 발생한 시점의 시간(milliseconds) |
%x | 로깅이 발생한 thread와 관련된 NDC(nested diagnostic context)를 출력합니다. |
%X | 로깅이 발생한 thread와 관련된 MDC(mapped diagnostic context)를 출력합니다. |
예시) (같은 색끼리 보시면 됩니다)
[%c]
[%C]
[%d]
[%F]
[%l]
[%L]
[%m]
[%M] [%n] [%p] [%r]
[%t] [%x] [%X] |
5. 프로그램 적용
package com.lcy.controller; import java.util.Date; import org.apache.log4j.Logger; public class HelloController extends MultiActionController{ } |
6. 출력
대략 아래와 같은 로그가 찍히는것을 확인할수있습니다. ㅡ_ㅡ;;
2009-11-18 11:30:56,236 DEBUG [http-8090-2] controller.HelloController (HelloController.java:16) - ================ Method Name : hello |
7. daily file
다음날이 되면 아래처럼 날짜별로 파일이 저장됩니다.
* 참고자료 http://www.jakartaproject.com
출처 - http://everlikemorning.tistory.com/entry/Log4J-%EA%B0%84%EB%8B%A8-%EC%82%AC%EC%9A%A9%EB%B2%95
===================================================================================
출처 log4j 설정방법 - * 개인정리-------------------------------|작성자 어라
대충 다른곳에서 사용하는 설정을 가져다가 설정해서 사용하다가.. 이번기회에 정리를 한번 해봤다.
내게 있어서 제일 필요한것 appender와 log Level에 따라서 로그를 출력하는 것..
- 일단 로그를 출력할곳을 선택하기 위해서 설정해야 할것..
log4j.rootLogger=DEBUG, console, save
※앞의 DEBUG는 전체 Level설정값이다...
뒤에 log4j.appender.console.Threshold를 이용해서 Level을 지정해주지 않으면 여기서 설정된 설정치를 이용하여 log가 생성된다.
참고로 로그 레벨은( level : DEBUG < INFO < WARN < ERROR < FATAL) 제일 왼쪽이 제일아랫레벨이다.
여기서 WARN을 설정하면WARN, INFO까지만 로그가 출력이 된다.
※뒤의 consloe, save는 appender의 이름으로 2개의 appender를 사용하겠다는 설정이다.
- ConversionPattern 은 로그를 어떤 형태로 기록할지에 대한 설정이다. 각 옵션은 아래와 같다.
- %m : 당신이 지정한 메세지를 출력
- %p : 로깅 이벤트의 priority 를 출력
- %r : 어플리케이션이 시작되어 로깅이벤트가 일어날때까지의 경과시간을 밀리세컨드 값으로 출력
- %c : 로깅이벤트의 category를 출력한다. 예를 들어 category 이름이 "a.b.c" 일때 %c{2} 는 "b.c"를 출력하며 {2}는
도트(.)로 구분된 category 이름의 마지막 두개의 컴포넌트를 의미한다.
{n} 이 없으면 기본적으로 카테고리의 이름을 모두 출력한다.
- %t : 로깅 이벤트를 생성한 스레드 이름을 출력
- %x : 로깅이벤트를 발생시킨 스레드에 관련된 내포검사항목(Nested Diagnostic Context : NDC)을 출력한다.
Java Servlet 과 같이 다수의 클라이언트가 분산된 스레드에 의해 다루어 질 때 유용하다.
- %n : 플랫폼 독립적인 개행문자를 출력한다. "\n" 또는 "\n\r" 등이 지정될 수 있다.
- %% : 하나의 % 기호를 출력한다.
- 경고 : 아래의 형식은 프로그램의 실행속도를 느리게 한다. 실행속도가 중요하지 않은 것이 아니라면 사용을 피하도록 한다.
- %d : 로깅이벤트가 일어난 날자(date)을 출력한다.
date 변환 지정자는 날짜형식 지정자 뒤에 이어 나오는 brace({..}) 사이에 둘러쌓여 나온다.
예: %d{HH:mm:ss,SSS} 또는 %d{dd MMM yyyy HH:mm:ss,SSS}
만약 날자 형식 지정자가 주어져있지 않다면 ISO8601 형식으로 나타난다. 날짜형식 지정자는 자바의 속도가 느린
SimpleDateFormat 클래스의 시간형식 문자열과 같은 문법을 수용했다.
더 빠른 성능을 위해 %d{ISO8601}, %d{ABSOLUTE}, %{RELATIVE}(프로그램 시작 후 경과시간의 밀리세컨드값을 나타내며
가장 빠르다) 또는 %d{DATE} 를 사용하며 각각은
log4j의 ISO8601DateFormat, AbsoluteTimeDateFormat, RelativeTimeDateFormat, DateTimeDateFormat 날자형식을 사용한다.
- %l : 소스코드의 위치정보를 출력한다. %C. %M(%F:%L) 의 축약형이다.
- %C : 로깅요청을 일으킨 호출자의 완전한 클래스이름을 출력한다.
예를들어 "org.apache.xyz.SomeClass"라는 클래스 이름이 있을때, %C{1} 은 "SomeClass"를 출력한다.
{1} 는 "완전한 클래스이름의 마지막 하나의 구성요소를 출력하라" 는 뜻이다. 만약 {n} 이 없다면
기본적으로 완전한 클래스 이름을 출력한다.
- %M : 로깅요청을 일으킨 메소드를 출력한다.
- %F : 로깅요청을 일으킨 파일 이름을 출력한다.
- %L : 로깅요청을 일으킨 곳의 행번호를 출력한다.
- 각 클래스나 패키지별로 로그를 따로 설정할수도 있다. 설정방법은 아래와 같다.
Class 혹은 Package 별로 다른 출력 방식을 적용할 수 있다.
log4j.properties 설정-----------------------------------------------------------------
# Root Logger
log4j.rootLogger=INFO
# 바로 위처럼 Root Logger에 어떤 Appender도 설정하지 않으면 Root Logger는 Log Message를 출력하지 않는다.
# Console에서조차 다른 Package의 Log Message에는 관심이 없다면 위와 같이 하자 ^^/
# Adel Logger
log4j.logger.adel.test=INFO, console
# adel.test Package 하위의 Class에서만 Log Message를 출력한다.
log4j.logger.adel.test.sample_1=INFO, file-1
log4j.logger.adel.test.sample_2=INFO, file-2
# 각 Package 마다 다른 Appender를 적용시켜서 Package 별로 다른 파일에 Log Message를 출력한다.
# Console Appender
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d %p [%c] - %m%n
# File Appender
log4j.appender.file-1=org.apache.log4j.RollingFileAppender
log4j.appender.file-1.File=test-1.log
log4j.appender.file-1.MaxFileSize=10MB
log4j.appender.file-1.MaxBackupIndex=10
log4j.appender.file-1.layout=org.apache.log4j.PatternLayout
log4j.appender.file-1.layout.ConversionPattern=%d %p [%c] - %m%n
# File Appender
log4j.appender.file-2=org.apache.log4j.RollingFileAppender
log4j.appender.file-2.File=test-2.log
log4j.appender.file-2.MaxFileSize=10MB
log4j.appender.file-2.MaxBackupIndex=10
log4j.appender.file-2.layout=org.apache.log4j.PatternLayout
log4j.appender.file-2.layout.ConversionPattern=%d %p [%c] - %m%n
## Log4J Config Property File
#log4j.rootLogger=INFO, console
log4j.rootLogger=DEBUG, console, save
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Threshold=DEBUG
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%C][%M][%-5p][%d{yyyy/MM/dd HH:mm:ss}] %m%n
log4j.appender.save=org.apache.log4j.DailyRollingFileAppender
log4j.appender.save.Threshold=INFO
log4j.appender.save.ImmediateFlush=true
#log4j.appender.save.File=/sec/batch/gsparse/log/log
log4j.appender.save.File=c:/logs/log.txt
log4j.appender.save.Append=true
log4j.appender.save.DatePattern='.'yyyyMMdd
log4j.appender.save.layout=org.apache.log4j.PatternLayout
log4j.appender.save.layout.ConversionPattern=[%C][%M][%-5p][%d{yyyy/MM/dd HH:mm:ss}] %m%n
===================================================================================
Log4j를 사용할때 서비스별, 또는 기능별로 로그를 구분하여 관리되어야할 경우가 있다.
아래와 같은 방법으로 log4j.properties를 설정하게되면,
각Package별로 별도의 로그파일을 생성하여 관리할수 있다.
log4j.rootLogger=INFO, CONSOLE, PACK1, PACK2, PACK3
log4j.logger.com.package.package1=INFO, PACK1
log4j.logger.com.package.package2=INFO, PACK2
log4j.logger.com.package.package3=INFO, PACK3
# Console Appender
log4j.appender.Corg.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.C%5p(%F)[%d]-%m%n
# PACK1
log4j.appender.PACK1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.PACK1.Threshold=INFO
log4j.appender.PACK1.File=/app/logs/package1.log
log4j.appender.PACK1.layout=org.apache.log4j.PatternLayout
log4j.appender.PACK1.layout.C%5p(%F)[%d]-%m%n
# PACK2
log4j.appender.PACK2=org.apache.log4j.DailyRollingFileAppender
log4j.appender.PACK2.Threshold=INFO
log4j.appender.PACK2.File=/app/logs/package2.log
log4j.appender.PACK2.layout=org.apache.log4j.PatternLayout
log4j.appender.PACK2.layout.C%5p(%F)[%d]-%m%n
# PACK3
log4j.appender.PACK3=org.apache.log4j.DailyRollingFileAppender
log4j.appender.PACK3.Threshold=INFO
log4j.appender.PACK3.File=/app/logs/package3.log
log4j.appender.PACK3.layout=org.apache.log4j.PatternLayout
log4j.appender.PACK3.layout.C%5p(%F)[%d]-%m%n
참고사이트 : http://ecspecialist.tistory.com/38?srch ··· m%252f38
출처 - http://www.jejuen.com/home/lang.php?mid=31&r=view&uid=84
[출처] log4j 패키지별 로그 설정|작성자 표류자915 된장국
'Development > Java' 카테고리의 다른 글
Javadoc 이클립스에서 한글 출력 (0) | 2012.04.19 |
---|---|
SHA1 해쉬 구하는 클래스 (0) | 2012.04.12 |
java - slf4j (0) | 2012.03.24 |
서블릿 load-on-startup (0) | 2012.03.21 |
java 바이트코드 컨트롤 및 분석 - ASM (0) | 2012.03.19 |