상황
만약에 모든 메소드의 호출시간을 측정하고 싶다는 요청이 온다면?
MemberController 클래스에 가서
System.currentTimeMillis();
try~finally를 통해 시간을 재준다.
이는 굉장히 비효율, 유지보수가 어렵기 때문에!
이런 공통의 기능들(ex. 메소드 호출시간재기)을
공통관심사항(cross-cutting concern)
이라 한다.
그리고 기존의 findMember()의 return memberRepository.findAll();이라던지 그런 주요 코드들을
핵심관심사항(core concern)
이라 한다.
또다른 예시로 회원가입 시간, 회원조회 시간을 측정하고 싶다면
어떻게 할건가?
문제
- 회원가입, 회원 조회에 시간을 측정하는 기능은 핵심 관심 사항이 아니다.
- 시간을 측정하는 로직은 공통 관심 사항이다.
- 시간을 측정하는 로직과 핵심 비즈니스의 로직이 섞여서 유지보수가 어렵다.
- 시간을 측정하는 로직을 별도의 공통 로직으로 만들기 매우 어렵다.
- 시간을 측정하는 로직을 변경할 때 모든 로직을 찾아가면서 변경해야 한다.
이러한 문제점들로 AOP를 써서 핵심 로직과 분리해서 유지보수가 쉽게 만든다.
AOP(Aspect Oriented Programming)
cross-cutting concern(공통 관심 사항)과 core concern(핵심 관심 사항)을 분리한다.
공통관심사항과 핵심관심사항을 각각 모듈화 한다고도 말한다.
새로운 TimeTraceAop라는 클래스 생성(공통 관심 사항 분리)
로직 작성 후 @Aspect 어노테이션을 달아준다. : AOP사용
그리고 @Component 어노테이션은 스프링 컨테이너에 등록,
component 하는 두가지 방법이 있는데
1. 공통관심사항 클래스에 달기(위의 코드)
2. Config클래스에 달기(밑의 코드)
이후
aop를 어디에 적용시킬 것인지를 등록하면 된다. :@Around
@Around 어노테이션 ("execution(범위지정)")
AOP 적용 후
해결
- 회원가입, 회원 조회등 핵심 관심사항과 시간을 측정하는 공통 관심 사항을 분리한다.
- 시간을 측정하는 로직을 별도의 공통 로직으로 만들었다.
- 핵심 관심 사항을 깔끔하게 유지할 수 있다.
- 변경이 필요하면 이 로직만 변경하면 된다.
- 원하는 적용 대상을 선택할 수 있다.
Proxy 기반 AOP
AOP 적용 후의 의존관계를 살펴보면
Proxy기반 AOP 구현 : 가짜 클래스를 하나 더 만든다고 생각하면 된다.
AOP 용어
1. Target
- 부가기능을 부여할 대상 (핵심기능을 담고 있는 모듈)
2. Aspect
- 부가기능 모듈을 Aspect라고 부른다. (핵심기능에 부가되어 의미를 갖는 모듈)
- 부가될 기능을 정의한 Advice와 Advice를 어디에 적용할지를 결정하는 PointCut을 함께 갖고 있다.
- 어플리케이션의 핵심적인 기능에서, 부가적인 기능을 분리해서 Aspect라는 모듈로 만들어서 설계하고 개발하는 방법
3. Advice
- 실질적으로 부가기능을 담은 구현체
- 타겟 오브젝트에 종속되지 않기 때문에, 부가기능에만 집중할 수 있음
- Aspect가 무엇을 언제 할지를 정의
4. PointCut
- 부가기능이 적용될 대상(Method)을 선정하는 방법
- Advice를 적용할 JoinPoint를 선별하는 기능을 정의한 모듈
5. JoinPoint
- Advice가 적용될 수 있는 위치
- Spring에서는 메소드 조인포인트만 제공한다.
- 타겟 객체가 구현한 모든 메소드는 조인 포인트가 된다.
6. Proxy
- Target을 감싸서 Target의 요청을 대신 받아주는 랩핑 오브젝트.
- 클라이언트에서 Target을 호출하게되면, 타겟이 아닌 타겟을 감싸고 있는 Proxy가 호출되어, 타겟메소드 실행 전에 선처리, 후처리를 실행한다.
inflearn 김영한님의 spring 입문 완강,
느낀점
proxy와 bean(component)에 대한 개념이 부족, 빈약하다. 조금 더 공부하길
그리고 이것을 끝으로 스프링 입문 강의는 끝났다.
완강을 했다니 매우매우 뿌듯했다.
맛보기 강의로도 깨우친게 많다..열심히 하자..
스프링 공부를 조금 더 깊이하기 앞서 자바공부를 더 열심히 해야겠다는 생각이 들었다.
앞으로는 자바쪽에 초점을 맞춰서 공부할 예정+물론 스프링 공부도 할 예정!
바쁘다 바빠!
REFERENCE
- https://expert0226.tistory.com/200
- https://develop-im.tistory.com/3
- https://nack1400.tistory.com/39
- https://dev-coco.tistory.com/81
- https://programmingrecoding.tistory.com/13
- https://galid1.tistory.com/494
'Spring > Spring' 카테고리의 다른 글
[Spring / WebFlux] WebFlux , Spring 5 (0) | 2022.07.19 |
---|---|
[Spring / 기본] Why Spring? (0) | 2022.03.02 |
[inflearn / Spring 입문] Spring Data JPA (0) | 2022.02.22 |
[inflearn / spring 입문 ] JDBC Template and JPA(*)(+ 추가예정) (0) | 2022.02.21 |
[inflearn / Spring 입문] 순수 JDBC와 통합테스트 (0) | 2022.02.18 |