본문 바로가기

개발 일지/TIL

[ #46 ] TIL

✏️ 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  (0) 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