Model?
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 글자 변경(전체)
'프로그래밍 > Spring' 카테고리의 다른 글
10.22(AOP의 이해, @Slf4j) (0) | 2020.10.22 |
---|---|
10.21(query & resultset logging) (0) | 2020.10.21 |
10.19(spring-security, 암호화 처리, 회원 탈퇴) (0) | 2020.10.19 |
10.16( lombok, redirect 메시지 잘 안뜨는 경우 ) (0) | 2020.10.16 |
10.15(서버코드 수정 후 톰캣 재기동 없이 반영하기) (0) | 2020.10.15 |