240614
오늘의 학습
● 1. Spring AOP
Spring AOP
핵심기능과 부가기능을 관점을 나누어 관점을 기준으로 각각 모듈화를 시켜주자는
대부분의 부가기능은 핵심기능을 보조해주는 역할로써 같이 사용하는 경우가 대부분이다. 핵심 기능에 부가 기능을 추가하게 된다면 모든 핵심 기능에 똑같은 부가 기능을 추가해줘야 한다면 모든 메서드에 부가 기능을 넣기에는 많은 힘듦이
있을 수 있다. 그래서 이를 해결을 하려면 핵심 기능과 부가 기능을 모듈화를 시켜 분리를 해야 된다.
1. 핵심기능
각 API 별 수행해야 할 비즈니스 로직 ( 하나의 API라고 보면 된다. )
ex) 상품 등록, 상품 수정, 상품 삭제, 상품 키워드 검색, 관심상품 등록, 회원 가입, 로그인 등등이 있다.
2. 부가기능
핵심기능을 보조하는 기능 ( 비즈니스 로직을 보조하는 로직이다. )
ex) 회원 패턴 분석을 위한 로그 기록, API 수행시간 저장, Transactional
3. 핵심기능에 부가기능이 들어있는 자바 기본 예제
class Scratch {
public static void main(String[] args) {
// 측정 시작 시간
long startTime = System.currentTimeMillis();
// 핵심 기능이라고 생각하자
for(int i = 0; i < 1000; i++) {
System.out.println("test");
}
// 측정 종료 시간
long endTime = System.currentTimeMillis();
long runTime = endTime - startTime;
System.out.println("소요시간: " + runTime);
}
}
위의 System.currentTimeMillis() 메서드는 호출 시점에 현재 시간을 밀리초 단위로 반환하는 메서드이다. ( 시스템 상 )
즉, 위의 로직은 로직 수행 전 시간과 로직을 수행 후 시간을 빼서 runtime 시간을 알 수 있다. ( 생명주기 시간 )
보통 이러한 기능들이 핵심기능(가운데 for문)을 보조하는 부가기능의 역할을 하게 된다. 하지만 이러한 기능들은 주로
이런 하나의 기능에만 추가되는 것이 아닌 핵심 기능이 여러개 존재할 때도 그러한 기능들에 부가기능을 추가할 수 있다.
API 시간 측정 같은 경우에 모든 API 메서 드들에 부가기능을 추가하기엔 많은 어려움이 존재한다.
이러한 문제점을 해결하기 위해 나온것이 AOP(Aspect Oriented Programming)을 통해 부가기능을 모듈화를 시켜
핵심기능과 분리해서 부가기능을 따로 중심적으로 설계 및 구현을 가능하게 해준다.
참고로 AOP는 개념이다. ( 따로 분리해서 설계를 하자는 방식을 의미하는 것이다. )
AOP
AOP(Aspect Oriented Programming) 관점 지향 프로그래밍으로 어떤 로직을 기준으로 핵심적인 관점과 부가적인
관점으로 나눠보고 그 관점을 기준으로 각각 모듈화를 하겠다는 의미이다.
참고로 핵심기능은 비즈니스 로직을 의미하고, 부가기능은 핵심기능은 보조해주는 역할을 해준다.
( 비즈니스 로직은 사용자에게 서비스를 제공해주는 역할을 한다. 주로 보여주는 역할 )
Spring AOP
Spring AOP 는 이러한 모듈화를 편리하게 해주고 있으며 어떠한 방식으로 부가 기능을 모듈화 시키는지 알아보자.
핵심기능과 부가기능을 모듈화를 시켜주고 이러한 모듈을 합쳐주어 쉽게 핵심기능에 부가기능을 추가할 수 있으며,
이러한 모듈을 만들어주고 편리하게 합쳐주는 기능을 제공해주는 것이 Spring AOP 이다.
서버가 켜지는 동시에 스프링 컨테이너가 만들어지고, 애너테이션들을 다 읽어 내부적으로 Bean들을 컨테이너에 담는다.
그 후 요청이 들어오면 Filter -> Spring AOP -> DispatcherServlet -> Controller 순으로 요청이 들어가게 된다.
핵심
어드바이스
어드바이스 부가기능을 핵심기능에 언제 수행할 것인지 정하는 것이다.
언제는 핵심 기능이 수행되기전이냐 수행된 후냐 아니면 전후 전체냐 또는 핵심기능이 잘 수행되어서 값을 반환하는데 그 값을 사용할 것이냐 핵심기능이 어떻게 되느냐에 따라 이 부가기능을 어떻게 붙혀 넣을 지 언제 실행 시킬지 정해줘야한다.
이러한 것을 정해주는 것이 어드바이스다.
포인트컷
적용 위치를 뜻한다. 말그대로 포인트컷 지정 위치, 부가기능을 만들고 핵심기능에 붙히기 위해선 어디에 붙혀야 될 지를
알려줘야한다. 핵심기능 어디다가 붙히겠다는거야? 이런 느낌.
부가기능을 만들고 어디에 수행할지 정해주는 것
@Aspect
Spring 빈(Bean) 클래스에만 적용이 가능하다.
AOP설정을 할 것이다를 알려주는 애너테이션이다.
AOP설정을 하는 클래스에 적어준다고 생각하면 된다.
어드바이스
@Around : 핵심기능 수행 전과 후
@Before : 핵심기능 호출 전 수행
@After : 핵심기능 수행 성공/실패 여부와 상관없이 언제나 동작 finally() 처럼 동작
@AfterReturning : 핵심기능 호출 성공 시 ( 메서드의 Return 값을 사용 할 수 있다. )
@AfterThrowing : 실패 했을 경우 Exception이 발생했을 경우에만 동작한다. 이러한 기능이 필요한 이유는
예외가 터졌을 경우 개발자에게 이메일을 보낸다거나 호출한 유저에게 메시지를 보낸다거나 후처리가 가능하다.
( 요로한 어드바이스를 제공한다. )
포인트컷
적용하고자 하는 지점
포인트컷 Expression Language
어드바이스 애너테이션에 직접 적용하는 방법과 따로 포인트컷 애너테이션을 만드는 방법이 존재한다
execution(modifiers-pattern? return-type-pattern declaring-type-pattern?
method-name-pattern(param-pattern) throws-pattern?)
1. modifiers-pattern
가장 첫 번째에 적어주는 것
public, private, * ( 접근 제어자 )
2. return-type-pattern
두 번째로 오는것
해당 메서드가 어떤 타입을 리턴하는지 알려주는 것
void, String, List<String>, *(모든상관없음)
3. declaring-type-pattern
어떠한 부분에 포인트컷을 할 것인지 지정을 해줄것인지 알려주는 것
클래스명 ( 패키지명 필요)
com.sparta.myselectshop.controller.* - controller 패키지의 모든 클래스에 적용
com.sparta.myselectshop.controller.. - controller 패키지 및 하위 패키지의 모든
( 클래스에 적용 )
4. method-name-pattern(param-pattern) 파라미터 전달 가능!
메서드명을 지정해주는 것
addFolders : addFolders() 메서드에만 적용을 해준다.
add* : add로 시작하는 모든 메서드에 적용을 해준다.
파라미터 패턴
addFolders(com.sparta.myselectshop.dto.FolderRequestDto) - addFolders메서드의 인수로 FolderRequestDto를 가지고 있는 메서드에만 적용을 시켜준다.
() 인수없는 것만 적용
(*) 인수 한개인 것만 적용
(..) 모든게 다 됨.
# 오늘의 회고
심화 강의를 완강을 했고, 과제를 진행하였다. AOP를 이용해 각 메소드마다 로그를 찍는 요구사항과 Entity와 DTO 클래스의 단위 테스트 코드 작성과 Service의 통합 테스트, Controller 단위 테스트의 요구사항이 있었다.
AOP는 어떻게 진행을 했는데 테스트에 대한 어려움이 존재해서 많은 시간을 쓰고 있다.
'내일배움캠프 Spring 5기' 카테고리의 다른 글
내일배움캠프 48일차 TIL - 아웃소싱 프로젝트[KPT회고] (0) | 2024.06.25 |
---|---|
내일배움캠프 42일차 TIL - 톰캣, 서블릿 (0) | 2024.06.17 |
내일배움캠프 40일차 TIL - Spring Test (0) | 2024.06.13 |
내일배움캠프 39일차 TIL - 소셜 로그인 API(OAuth) (0) | 2024.06.12 |
내일배움캠프 38일차 TIL - 뉴스피드 프로젝트 (0) | 2024.06.12 |