일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- OrientalUnity
- Pinpoint
- Scheduler
- Thymeleaf
- ncloud
- Naver Cloud
- AssertJ
- ngrinder
- F-Lab
- docker
- NaverCloudPlatform
- Naver Cloud Platform
- mybatis
- Database
- 네이버클라우드
- spring
- papago
- 네이버 클라우드
- junit
- navercloud
- object storage
- React
- 에프랩
- NooBLoL
- Java
- spring boot
- NCP
- 회고
- DBDocs
- Enum
- Today
- Total
DevJong12
[기능구현] Method의 실행 시간을 확인해보자 본문
목차
1️⃣ 개요
회사에 입사하고 코드를 분석을 하고 있었는데, 도저히 분석만 하고 있을 수 없고 리팩토링을 진행할 수밖에 없는 환경이었다.
회사 코드를 보여줄수 없으나, 발생하는 문제가 비즈니스 로직이 20N + 1, 15N + 1 을 로직에서 직접 구현을 하고 있었다(아니 JPA를 쓰면서, 왜 이해를 못하고 쓰는데..)
그러다 보니 10개, 20개를 조회하는데도 쿼리가 200번, 400번 , 데이터가 좀 많으면 수만건의 Select절을 실행하고 있었다.
그리 생긴 결과물은, 데이터가 거의 없음에도 API의 요청이 10초~ 15초~ 20초~ 가지각생으로 매우매우 느린상황이었다.
그래서 내가 선언한 어노테이션이 달려있는 메소드들만의 실제 실행 시간을 확인해보고자 기능을 구현하게 되었다...
APM등의 부가적인걸 붙여볼 수 있는 환경이면 좋겠지만 아무런 모니터링툴도 설치하지 못하고 Local을 통해 테스트만 가능한 환경이어서 AOP를 채택하게 되었다.
2️⃣ 환경사항
- JDK 17
- Spring Boot 3.2.0
3️⃣ 필요 의존성
AOP가 필요하나, Security, JPA등 Spring프로젝트 대부분에 AOP가 존재하여 의존해 사용해도 상관은 없다.
하지만 직접 관리하는게 용이하니, 필자의 경우 AOP를 추가하였다.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-aop'
}
4️⃣ 코드 구현
다시보니 매우간단하네...ㅋㅋㅋㅋ
5️⃣ 사용방법 및 결과물
사용방법은 아래의 이미지처럼 실제 실행 시간을 측정하고 싶은 메소드에 위에서 생성했던 어노테이션인 @TimeCheck 어노테이션을 선언하면 된다.
또한 실제 요청을 발송하게 될 경우 아래처럼 실제 호출한 메소드와 실행 시간을 확인해 볼 수 있게 된다.
6️⃣ 글을 마치며
이게 세네번 할 때 까지는 별로 필요성을 못느꼈는데, 로직체크하려고 매번 작성하다보니 너무 불편함을 느껴서 만든 기능인데 너무 편했었다. 기능자체가 간단해서 사실 별다르게 적을건 없는데.. 이걸 만들어서까지 확인해야 할 정도로 느린걸 주구장창 만들었다면... 다시 기본적인 개념을 공부해야 할 사람이지 않을까 싶다...
소스코드 레벨에서부터 자신의 코드가 얼마나 나쁜 습관의 코드인지를 모르는 것이니까... 해당 기능을 계속쓰면서 성능체크를 하면서 다시금 코드를 작성할 때는, 생각을 깊게 하면서 작성해야하는걸 체감했다...