유디의 공간정보·개발일기

7-1. 0909_ Spring AOP, logger의 패턴과 level(info, debug) 본문

Spring, Mybatis

7-1. 0909_ Spring AOP, logger의 패턴과 level(info, debug)

55yudi 2021. 9. 9. 14:56

Q. 등록을 하기위해 뭔가를 입력하고 저장하면 서버에서 뭐가 실행되나요?

A. addrbook컨트롤러 안에 있는 register 메서드가 실행되고,

   그 후 DAO에 있는 create가 실행된다.

    list.jsp가 나타남

 

= 종적 및 횡적으로 빈을 선택

우리는 아직 service layer는 안써봤다

 

- 횡단 관심(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>

jar파일 생성됨

 

 

* 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를 눌러서 수정화면으로 넘어갔을 때 콘솔창에 나타나는 내용 보기

 

- 과제