방명록
- [Spring Boot][TROUBLESHOOTING] 6초 이상의 첫 로딩 시간 문제 해결2024년 05월 20일 17시 08분 36초에 업로드 된 글입니다.작성자: DandyNow728x90반응형
1. 6초 이상의 첫 로딩 시간문제
백엔드는 Spring Boot, 프런트엔드는 React.js로 작성된 서비스이다. 이 서비스에 접근하면 6초 이상의-극악의-로딩 시간이 필요했다.
2. 원인
크롬 개발자 도구에서 확인해 보니 전체 로딩 시간 중 5초 이상을 백엔드 API 호출이 차지하고 있었다. 백엔드 코드(서비스 클래스)를 확인해 보니 API 호출 시 GET과 UPDATE 요청이 각각 순차적으로 이루어지며, UPDATE 요청이 완료되면 GET 요청 결과를 응답하도록 작성되어 있었다. UPDATE 요청도 여러 번 시도되고 있었기 때문에 이 부분에서 병목 현상이 발생하고 있다고 보았다.
3. 비동기 처리하여 1초 미만으로 개선
UPDATE 요청을 비동기 처리하여 GET 요청이- UPDATE 요청이 완료될 때까지 기다리지 않고-즉시 응답되도록 하였다. 그 결과 [그림 2]와 같이 1초 이내로 로딩이 완료될 수 있었다.
개선한 코드의 대략은 아래와 같다. UPDATE 요청 부분을 비동기 처리하기 위해 새로운 서비스 클래스를 생성해 @Async를 적용하고, 기존 서비스 클래스는 추가한 서비스 클래스의 객체를 주입받는 방식으로 수정하였다.
// 기존 서비스 클래스 수정 // (생략) @Service @AllArgsConstructor public class HomeService { // (생략) // int resUpdate = promotionMapper.updateCallCnt(all); // 기존 코드 promotionService.updateCallCntAsync(all); // 비동기 처리한 서비스 객체 사용. 반환값이 없으므로 변수에 할당하지 않았음. // (생략) }
// 비동기 처리 위해 새로운 서비스 클래스 추가 정의 //(생략) @Service public class PromotionService { private final PromotionMapper promotionMapper; public PromotionService(PromotionMapper promotionMapper) { this.promotionMapper = promotionMapper; } @Async // 비동기 처리 public void updateCallCntAsync(List<PromotionDTO> all) { promotionMapper.updateCallCnt(all); } }
728x90반응형'언어·프레임워크 > Spring Boot' 카테고리의 다른 글
[Spring Boot] application.properties 환경별 설정 (0) 2024.11.04 [Spring Boot] LocalDateTime과 DB의 시간 데이터 불일치, 쿼리 오작동 문제(DateTimeFormatter으로 해결) (0) 2024.05.09 [Spring Boot] ubuntu에서 git clone 후 gradle build하기 (0) 2024.05.09 [Spring Boot] gradle lombok Slf4j로 테스트 코드 로그 찍기 (0) 2024.04.10 [Spring Boot] MySQL 연동 application.yml 설정 (1) 2024.04.08 다음글이 없습니다.이전글이 없습니다.댓글