AOP

2023. 5. 10. 03:34· SPRING/스프링 입문 (김영한 강사님)
반응형

출처 : 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 - 김영한

AOP가 필요한 상황

  • 모든 메소드의 호출 시간을 측정하고 싶다면?
  • 공통 관심 사항(cross-cutting concern) vs 핵심 관심 사항(core concern)
  • 회원 가입 시간, 회원 조회 시간을 측정하고 싶다면?

 

MemberService 회원 조회 시간 측정 추가

package hello.hellospring.service;

@Transactional

public class MemberService {
	 /**
	 * 회원가입
	 */
	 public Long join(Member member) {

		long start = System.currentTimeMillis();
		
        try {
 			validateDuplicateMember(member); //중복 회원 검증
 			memberRepository.save(member);
 			return member.getId();
 		} finally {
 			long finish = System.currentTimeMillis();
 			long timeMs = finish - start;
 			System.out.println("join " + timeMs + "ms");
 		}
 }
 
 /**
 * 전체 회원 조회
 */
 public List<Member> findMembers() {
 	long start = System.currentTimeMillis();
 
 	try {
 		return memberRepository.findAll();
 	} finally {
 		long finish = System.currentTimeMillis();
 		long timeMs = finish - start;
 		System.out.println("findMembers " + timeMs + "ms");
 	}
    }
}

 

문제

  • 회원가입, 회원 조회에 시간을 측정하는 기능은 핵심 관심 사항이 아니다.
  • 시간을 측정하는 로직은 공통 관심 사항이다.
  • 시간을 측정하는 로직과 핵심 비즈니스의 로직이 섞여서 유지보수가 어렵다.
  • 시간을 측정하는 로직을 별도의 공통 로직으로 만들기 매우 어렵다.
  • 시간을 측정하는 로직을 변경할 때 모든 로직을 찾아가면서 변경해야 한다.

 

AOP 적용

  • AOP: Aspect Oriented Programming
  • 공통 관심 사항(cross-cutting concern) vs 핵심 관심 사항(core concern) 분리

 

시간 측정 AOP 등록

package hello.hellospring.aop;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class TimeTraceAop {

    @Around("execution(* hello.hellospring..*(..))")
    public Object execute(ProceedingJoinPoint joinPoint) throws Throwable {
        long start = System.currentTimeMillis();
        System.out.println("START: " + joinPoint.toString());
        try {
            return joinPoint.proceed();
        } finally {
            long finish = System.currentTimeMillis();
            long timeMs = finish - start;

            System.out.println("END: " + joinPoint.toString()+ " " + timeMs +
                    "ms");
        }
    }
}

해결

  • 회원가입, 회원 조회등 핵심 관심사항과 시간을 측정하는 공통 관심 사항을 분리한다.
  • 시간을 측정하는 로직을 별도의 공통 로직으로 만들었다.
  • 핵심 관심 사항을 깔끔하게 유지할 수 있다.
  • 변경이 필요하면 이 로직만 변경하면 된다.
  • 원하는 적용 대상을 선택할 수 있다

AOP 적용 전 전체 그림

 

AOP 적용 후 전체 그림

  • 스프링 컨테이너가 AOP가 적용된 클래스에 대해서 가짜 스프링 빈을 만들고 프록시를 통해 AOP를 실행한 뒤 join.Point.proceed()에서 진짜가 호출된다.

 

출처 : 인프런 - 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 - 김영한

'SPRING > 스프링 입문 (김영한 강사님)' 카테고리의 다른 글

스프링 DB 접근 기술  (0) 2023.05.10
회원 관리 예제 - 웹 MVC 개발  (2) 2023.05.03
스프링 빈과 의존관계  (1) 2023.05.03
회원 관리 예제 - 백엔드 개발  (1) 2023.05.03
스프링 웹 개발 기초  (0) 2023.05.02
'SPRING/스프링 입문 (김영한 강사님)' 카테고리의 다른 글
  • 스프링 DB 접근 기술
  • 회원 관리 예제 - 웹 MVC 개발
  • 스프링 빈과 의존관계
  • 회원 관리 예제 - 백엔드 개발
송경훈
송경훈
잘하지는 못하지만, 될 때까지 합니다.
송경훈
잘하지는 못하지만, 될 때까지
송경훈
전체
오늘
어제
  • 분류 전체보기 (93)
    • JPA (10)
    • JAVA (2)
    • SPRING (10)
      • 스프링 입문 (김영한 강사님) (6)
    • HTTP (3)
    • ERROR 해결 (1)
    • DB (4)
      • MariaDB (2)
      • MySQL (1)
    • OS (2)
      • Mac (1)
      • 운영체제 이론 (1)
    • WEB (4)
    • ALGORITHM (49)
      • 백준 (43)
      • 알고리즘 이론 (6)
    • PROJECT (3)
    • Git & GitHub (2)
    • 회고록 (0)
    • 트러블 슈팅 (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 자바
  • commit기록누락
  • github
  • 커널 수준 스레드
  • Spring Batch
  • 10431
  • 잔디안심어짐
  • 스프링
  • db
  • 코딩은 체육과목 입니다
  • 기본키생성전략
  • 투 포인터 알고리즘
  • 사용자 수준 스레드
  • JPA
  • 연관 관계 매핑
  • 외래키 지양
  • Web
  • @RequestParam
  • 13223
  • mysql
  • 백준
  • jsp
  • 별 찍기 7
  • 알고리즘
  • spring
  • 킹 퀸 룩 비숍 나이트 폰
  • nooffset
  • 2744
  • 혼합형 스레드
  • git
hELLO · Designed By 정상우.v4.2.0
송경훈
AOP
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.