✏️ 0620
아웃소싱 팀 프로젝트
수준별 학습: 스탠다드 이론반
API 사용시간 측정 방법
API 사용시간
== Controller 에 요청이 들어온 시간 ~ 응답이 나간 시간
EX)
Controller 에 요청이 들어온 시간 : 9시 10분 30초
Controller 에 응답이 나간 시간: 9시 10분 33초
일 때, API 사용시간은?
Controller 에 응답이 나간 시간 - Controller 에 요청이 들어온 시간
※ 3초
- 수행시간 측정 코드 구현
Intellij 메뉴에서 File > New > Scratch File → Java 선택
Scratch File 은 프로젝트랑 상관없이 어떤 특정한 method 혹은 코드를 수행시켜 보고 싶을 때 사용하는 파일
이쪽에 위치해 있어서 프로젝트에 전혀 영향을 주지 않는다
위의 기능을 이용해 부가기능으로 회원별 총 API 사용시간 저장 같은 걸 확인할 수 있다
- 부가기능 모듈화의 필요성
핵심기능 : 각 API 별 수행해야 할 비즈니스 로직
ex) 상품 키워드 검색, 관심상품 등록, 관심상품에 폴더 추가 등
부가기능 : 핵심기능을 보조하는 기능
ex) 회원 패턴 분석을 위한 로그 기록, API 수행시간 저장
- 문제점
모든 '핵심기능'의 Controller 에 '부가기능' 코드를 추가했을 때
핵심기능이 수십개라면...?
모든 핵심기능에 동일한 내용의 코드 추가 필요하다
나중에 추가된 핵심기능이라면...?
항상 부가기능 추가를 신경써줘야 하는 상황이 발생한다
그런데 깜빡했다....?
일부 API 수행시간이 추가되지 않았다 → Top5 회원의 신뢰성 이슈가 발생 끔ㅡ찍
추가 말고 수정 사항 발생한다면...?
핵심기능의 개수만큼 부가기능도 수정
... 끔찍 상상도 하기싫어 어우 왜 내게 이런 시련을?
그때 필요한 것이 모듈화 !!!
어 아주 중요하네 무조건 해야겠네...
AOP (Aspect Oriented Programming) 를 통해 부가기능을 모듈화
부가기능은 핵심기능과는 관점(Aspect), 관심이 다르다
따라서, 핵심기능과 분리해서 부가기능 중심으로 설계, 구현이 가능하다
Spring AOP 란?
어드바이스 : 핵심기능에 언제 수행할 건지 정한다
언제 ? : 핵심기능이 수행되기 전이냐 수행된 후냐 혹은 전후 전부냐
아직 안끝났다
핵심기능이 잘 수행되서 어떤 값을 반환했는데 그 값을 사용할거냐
또있다
핵심기능이 오류가 난다면 이 섹션이 터진다면 그러면 그때 수행할거냐
즉, 핵심기능이 어떻게 되냐에 따라서 부가기능을 어떻게 붙여넣을지 언제 실행시킬지를 정해야한다
그 방법이 어드바이스
- 어드바이스 종류
- @Around : 핵심기능 수행 전과 후 (@Before + @After)
- @Before : 핵심기능 호출 전 (ex. Client 의 입력값 Validation 수행)
- @After : 핵심기능 수행 성공/실패 여부와 상관없이 언제나 동작 (try, catch 의 finally() 처럼 동작)
- @AfterReturning : 핵심기능 호출 성공 시 (함수의 Return 값 사용 가능)
- @AfterThrowing : 핵심기능 호출 실패 시, 예외 (Exception) 가 발생한 경우만 동작
(ex. 예외가 발생했을 때 개발자에게 email 이나 SMS 보냄)
@Aspect // 빈 클래스만 적용 가능, 해당 클래스는 AOP 설정이다 알림
public class UseTimeAop { }
@Aspect : AOP 설정을 할거다 라고 알려주는 것
Spring Been 클래스에만 적용
내가 바로 빈(Been)이다 !!! 외칠 때 사용한다
포인트컷 Expression 형태
execution(modifiers-pattern? return-type-pattern declaring-type-pattern? method-name-pattern(param-pattern) throws-pattern?)
? 는 생략 가능
포인트컷은 적용할 위치, 핵심기능 어디다가 붙여넣을지 지정한다
아래 예제 코드 !
@Pointcut("execution(* com.sparta.myselectshop.controller.ProductController.*(..))")
@Pointcut : 포인트컷 재사용 가능
포인트컷 결합 (combine) 가능
@Around("product() || folder() || naver()")
public Object execute(ProceedingJoinPoint joinPoint) throws Throwable { }
요런 식으로 사용한다 !
- modifiers-pattern
- public, private, *
- return-type-pattern
- void, String, List<String>, *
- declaring-type-pattern
- 클래스명 (패키지명 필요)
- com.sparta.myselectshop.controller.* - controller 패키지의 모든 클래스에 적용
- com.sparta.myselectshop.controller..* - controller 패키지 및 하위 패키지의 모든 클래스에 적용
- method-name-pattern(param-pattern)
- 함수명
- addFolders : addFolders() 함수에만 적용
- add : add 로 시작하는 모든 함수에 적용
- 파라미터 패턴 (param-pattern)
- (cohttp://m.sparta.myselectshop.dto.FolderRequestDto) - FolderRequestDto 인수 (arguments) 만 적용
- () - 인수 없음
- (*) - 인수 1개 (타입 상관없음)
- (..) - 인수 0~N개 (타입 상관없음)
'개발 일지 > TIL' 카테고리의 다른 글
[ #50 ] TIL (2) | 2024.06.26 |
---|---|
[ #47 ] TIL (0) | 2024.06.22 |
[ #45 ] TIL (0) | 2024.06.19 |
[ #44 ] TIL (0) | 2024.06.18 |
[ #43 ] TIL (0) | 2024.06.17 |