공부한것들을 정리하는 블로그 입니다.
4. 스프링 AOP : log4j 설정 본문
비즈니스 컴포넌트 개발에서 가장 중요한 두 가지 원칙은 낮은 결합도와 높은 응집도를 유지하는 것입니다. 스프링의 의존성 주입(Dependency Injection)을 이용하면 비즈니스 컴포넌트를 구성하는 객체들의 결합도를 떨어뜨릴 수 있어서 의존관계를 쉽게 변경할 수 있습니다. 스프링의 IoC가 결합도와 관련된 기능이라면, AOP(Aspect Oriented Programming)는 응집도와 관련된 기능이라 할 수 있습니다.
AOP는 관심분리를 통해 메소드마다 공통으로 등장하는 로깅이나 예외, 트랜잭션 처리 같은 횡단 관심에 해당하는 공통 코드를 독립적인 모듈로 분리해냄으로써 코드 분석과 유지보수를 쉽게 만들어줍니다.
관심분리 = 횡단관심 + 핵심관심
핵심관심 : 사용자의 요청에 따라 실제로 수행되는 핵심 비즈니스 로직
OOP(객체지향프로그래밍)는 구조상 위와같은 공통코드의 분리가 완벽하게 이루어지기 힘듭니다.
이번 글에서는 스프링의 AOP를 이용해서 핵심관심과 횡단관심을 분리해보겠습니다. 이 실습을 통해 기존의 BoardServiceImpl 소스들과는 무관하게 작동하는 LogAdvice나 Log4jAdvice 클래스의 메소드를 구현 가능합니다.
1. pom.xml 에서 AOP 라이브러리 추가
2. LogAdvice.java 작성
3. applicationContext.xml 에서 네임스페이스 추가 및 AOP 설정
4. BoardServiceClient를 이용해 테스트 실행
1. pom.xml 에 AOP 라이브러리 추가
2. LogAdvice.java 작성
package com.springbook.biz.common;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Service;
@Service
@Aspect
public class LogAdvice {
@Pointcut("execution(* com.springbook.biz..*Impl.*(..))")
public void allPointcut() {}
@Pointcut("execution(* com.springbook.biz..*Impl.get*(..))")
public void getPointcut() {}
@Before("allPointcut()")
public void printLog(JoinPoint jp) {
System.out.println("[공통 로그] 비즈니스 로직 수행 전 동작");
}
}
3. applicationContext.xml 에서 네임스페이스 추가 및 AOP 설정
4. BoardServiceClient를 이용해 테스트 실행
BoardServiceClient를 이용해 테스트 해본 결과, 기존의 BoardServiceImpl 소스들에 전혀 수정을 가하지 않고도
LogAdvice가 동작하는 모습을 확인 할 수 있습니다.
'(2019) 사이드 프로젝트 > BoardWeb(게시판-MVC1,MVC2,스프링MVC)' 카테고리의 다른 글
4-4. 별첨) 프로젝트 첨부 (0) | 2019.06.19 |
---|---|
4-3. 시스템로그를 로그파일(.log)로 자동저장하기: log4j (0) | 2019.06.18 |
4-2. 관심분리(횡단관심) : LogAdvice를 Log4Advice로 교체, pointcut엘리먼트 사용, XML설정을 Annotation설정으로 교체 (0) | 2019.06.17 |
4.1 oracle error 해결 : Socket read interrupted, Authentication lapse 0 ms. (0) | 2019.06.17 |
3-1. 비즈니스 컴포넌트 실습2 (0) | 2019.06.14 |
3. 비즈니스 컴포넌트 실습(Annotation + JDBC + maven) (2) | 2019.06.14 |
2-2. 다형성 예제 실습(polymorphism) (0) | 2019.06.14 |
2-1. IoC컨테이너 학습 : Servlet 클래스 만들어보기(not POJO) (0) | 2019.06.13 |