7-1. 0909_ Spring AOP, logger의 패턴과 level(info, debug)
Q. 등록을 하기위해 뭔가를 입력하고 저장하면 서버에서 뭐가 실행되나요?
A. addrbook컨트롤러 안에 있는 register 메서드가 실행되고,
그 후 DAO에 있는 create가 실행된다.
list.jsp가 나타남
= 종적 및 횡적으로 빈을 선택
- 횡단 관심(CrossCutting Concern)
여기에서 '관심'은 (관점에 있던) 로깅, 예외처리, 트랜젝션 등
- 현재 프로젝트에서 AOP-XML방법으로 해보기
- servlet-context.xml에서 Namespace - aop 선택
- Advice 만들기
Advice는 java 소스 코드이므로 적절한 패키지와 클래스명으로 만들어준다.
Bean을 만들기
<beans:bean id="addrbookAdvice" class="lx.edu.team8.aop.AddrbookAdvice"></beans:bean>
aop:config 만들기 > 그 안에 pointcut과 aspect가 있어야 한다.
pointcut 코드 완성하기 --> expression : AddrbookController의 모든 메서드 실행시키기
<aop:pointcut expression="execution(* lx.edu.team8.controller.AddrbookController.*(..))" id="abController"/>
aspect 코드 완성하기 < joinpoint
- org.aspectj.weaver.tools.JoinPointMatch 오류 : porm.xml에 repository dependency 추가하기
<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.7</version>
<scope>runtime</scope>
</dependency>
-
* pointcut태그의 expression 속성 이해하기 / 우리는 execution을 사용할 것임
JoinPoint
- Advice 정의하기 (before advice)
[logger]
[info 와 debug 레벨]
- HomeController 코드, home 메서드 다시 보기
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
(중략)
@Controller
public class HomeController {
private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
/**
* Simply selects the home view to render by returning its name.
*/
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(Locale locale, Model model) {
//@controller에 의해(?)
//value(/)로 인해 클라이언트에 요청이 들어오면 홈 메서드에서 정의된 내용이 실행된다.
logger.info("Welcome home! The client locale is {}.", locale);
logger.debug("byebye");
(중략)
(중략)
- level=debug 와 level=info 의 차이
INFO : lx.edu.team8.controller.HomeController - Welcome home! The client locale is ko_KR.
DEBUG: lx.edu.team8.controller.HomeController - byebye
-> log4j.xml의 logger-lx.edu.team8 level=debug
level=info 로 변경하고 브라우저 새로고침하면
INFO : lx.edu.team8.controller.HomeController - Welcome home! The client locale is ko_KR. 만 나온다.
-> log4j.xml의 logger-lx.edu.team8 level=info
: 콘솔에 출력될 정보의 양을 조절해서 오류 내역을 확인할 수 있다.
- AddrbookController 에 logger 코드 추가해서 addrbook에서 확인해보기
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Controller
public class AddrbookController {
Logger logger = LoggerFactory.getLogger(this.getClass());
(중략)
@RequestMapping("addrbook_list.do")
public ModelAndView list(HttpServletRequest req) throws Exception {
//System.out.println("list()");
logger.debug("list.debug");
logger.info("list.info");
(중략)
log4j.xml에서 레벨을 debug로 변경하여 확인
브라우저에서 등록과 목록을 왔다갔다 하면 콘솔창에 로그가 찍힌다.
value="%-5p: %c - %m%n" 의 형태
%-5p : level 내용
%c : -앞의 내용 : 어떤 클래스에서 알려주는지
%m : -뒤의 내용
%n : 줄바꿈
- log 의 패턴
https://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html
PatternLayout (Apache Log4j 1.2.17 API)
C Used to output the fully qualified class name of the caller issuing the logging request. This conversion specifier can be optionally followed by precision specifier, that is a decimal constant in brackets. If a precision specifier is given, then only the
logging.apache.org
%d : 시각, %d{HH:mm:ss,SSS}
<logger name="lx.edu.team8"><!-- package의 이름 -->
<level value="debug" />
</logger>
<!-- mapper-addrbook에 mapper태그의 namespace임(mybatis는 별도의 패키지를 쓰지 않기때문에) -->
<logger name="mapper-addrbook">
<level value="debug" />
</logger>
- 주소록 목록에서 id를 눌러서 수정화면으로 넘어갔을 때 콘솔창에 나타나는 내용 보기
- 과제