728x90
반응형

Model?

 

 

Spring MVC Request Lifecycle

Model은 view단에 뭔가를 전달할 목적으로 사용하는 Map객체(MVC패턴의 M이 아님!)
view단 처리하는 데이터의 임시저장소이며, Map객체(k,v)
model에서 다루는건 보통 데이터와 viewName

 

 

1. ModelAndView(2.0) - 일반클래스 (1번을 많이 씀)
  - 속성추가 addObject(String, Object)
  - viewName setViewName(String) 
2. ModelMap(2.0) - 일반 클래스
  - 속성추가 addAttribute(String, Object)
  - viewName String리턴
3. Model(2.5) - 인터페이스
  - 속성추가 addAttribute(String, Object)
  - viewName String리턴

 

뷰단처리를 위해서는 어떤방식으로 controller에서 담건 ModelAndView로 옮겨담아서 뷰단처리됨
ModelAndView를 쓰려면 -> RedirectAttributes와 충돌 조심


1. ModelAndView를 파라미터 지정하고 ModelAndView 리턴 

2. 데이터 추가는 addObject 통해서 진행
ex> mav.addObject("loginMember", member);

3. viewName지정
mav.setViewName("redirect:/");

 

 

log4j
sysout출력하는게 안좋을 수 있음 그걸 대신할 log4j


Log Level(Priority)
1. FATAL : 심각한 에러 (slf4j에서 지원 X)
2. ERROR : 요청처리중 단순 에러 발생
3. WARN : 프로그램 실행에는 문제 없지만, 향후 에러를 유발할수 있는 부분에 대한 경고
4. INFO : 상태변경과 같은 정보성 메시지
5. DEBUG : 개발환경에 디버깅용도의 메세지
6. TRACE : 개발환경에서 상세 이벤트 표현용 메세지(DEBUG의 세분화) 

 

예를들어 로그인 레벨을 INFO로 지정하면 그 뒤 레벨인 DEBUG, TRACE는 안찍힘
출력에 따른 성능저하 막을 수 있음 
pom.xml의 logger에서 설정가능
ex>

<level value="trace" />

log4j를 사용하기 위해 pom.xml의 scope를 compile로 변경해주기

 

 

Appender 설정

Appender는 로그가 출력되는 위치를 나타냄
XXXAppender로 끝나는 클래스들의 이름을 보면, 출력 위치를 어느 정도 짐작할 수 있음

 

Appender 선언과 정의

전달된 로그를 출력하는 객체 : Console, File, RollingFile, JDBC Appender

출력 위치에 따라 Appender 종류와 설정 태그가 달라짐

 

Layout 설정

Layout은 발생한 로그 이벤트의 포맷을 지정하고, 원하는 형식으로 로그를 출력할 수 있음
Appenders 설정과 마찬가지로 Log4j 2에서는 Layout을 class 속성이 아닌 태그로 구분

 

PatternLayout의 pattern

패턴 설명
%c 카테고리명(logger이름)을 표시
카테고리명이 a.b.c일때, %c{2}는 b.c를 출력
%C 클래스명을 표시함
풀 클래스 명이 com.kh.logger일때, %C{2}는 kh.logger를 출력
%d 로그 시간을 출력
java.text.SimpleDateFormat에서 적절한 출력 포맷을 지정할 수 있음
%d{HH:mm:ss, SSS}  
%d{yyyy MMM dd HH:mm:ss, SSS}  
%d{ABSOLUTE}   
%d{DATE}   
%d{ISO8601}  
%F 파일명을 출력
로그시 수행한 메소드, 라인번호가 함께 출력
%l  로깅이 발생한 caller의 위치정보
메소드명 (자바파일명:라인번호) - 링크제공
%L 라인 번호만 출력(링크없음)
%m 로그로 전달된 메시지를 출력
%M 로그를 수행한 메소드명을 출력
%n 플랫폼 종속적인 개행문자가 출력. rn 또는 n
%p 로그 이벤트명등의 priority 가 출력(debug, info, warn, error, fatal )
%r 로그 처리시간 (milliseconds)
%t 로그이벤트가 발생된 쓰레드의 이름을 출력
%% % 표시를 출력. escaping
%r 어플리케이션 시작 이후 부터 로깅이 발생한 시점의 시간(milliseconds)
%X 로깅이 발생한 thread와 관련된 MDC(mapped diagnostic context)를 출력
%X{key} 형태

 

 

logger
로깅내역을 수집하는 객체
개발시 레벨을 낮게 해놓고 개발하다가 이후 수정하는것이 좋음

<logger name="com.kh.spring" additivity="true">
	<level value="trace" />
</logger>

 

 

log4j를 추상레이어를 통해 제어 
왜냐면 log4j를 쓸수도 있지만 기본 제공되는 util로깅을 쓸수도 있음
그럴때마다 코드 전체를 바꿀수는 없기에 추상화 레이어를 통해 제어함
장점 : 동일한 코드로 구현체를 제어하면서 쓸 수 있음
단점 : 세세한 설정까지 다 사용가능하진 않음

 

Simple Logging Facade For Java 
PSA Portable Service Abstraction -> 대표적인 예가 slf4j
구현 라이브러리를 추상레이어에 특정라이브러리로 제어하는 것.
 - 추상체 : slf4j
 - 구현체 : log4j, java.util.logging, apache.commons.logging, LogBack

 

 

pom.xml에 시스템 Logging을 작성하여 file로 남기자!
-> open launch configuration > catalina base뒤 위치 복사 
>C:\workspace\spring_workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0 이 경로에 로그 작성됨

 

 

LoggerInterceptor클래스 만들어서 extends HandlerInterceptorAdptor 상속
>override/implement
> preHandle : DispatcherServlet에서 controller의 handler메소드 호출 전
   postHandle : Handler메소드에서 DispatcherServlet으로 리턴되기 직전, view단에 전달된 Model 객체 확인 직전
   afterCompletion : view단에서 응답처리후에 호출
체크 후 오버라이드
> private Logger log = LoggerFactory.getLogger(getClass()); 선언하고  
> 요구하는 요청 정보들 작성 후 > Handler Interceptor 등록(Servlet-context.xml에 등록하기)

 

 

* sts 단축키 alt+shift+r 글자 변경(전체)

반응형
복사했습니다!