일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 속도기능개선
- react 자동입력방지
- spring error
- 스프링 시큐리티
- 백엔드 아키텍처
- Spring Boot
- SpringBoot
- error
- Spring Security
- 리액트 심플캡차
- Docker
- maven
- REACT
- react 캡차
- Security 로그인
- react captcha
- 배치파일로 JDK 버전변경
- 깃
- git
- react 상태
- react simple captcha
- 리액트 캡차
- 에러
- build
- react 심플캡차
- spring security 로그인
- spring
- 스프링 시큐리티 로그인
- 스프링
- 계층구조vs도메인구조
- Today
- Total
I can do it(Feat. DEV)
DB 조회는 최소한으로! 본문
📝 글을 쓰게 된 계기(문제 발견)
프로젝트 진행 중 저번에 만들었던 엑셀 다운로드 기능으로 다운로드 테스트를 했음.
그런데!! 건수가 2만 건 정도 되는데 10초 넘게 걸림.😅
이건 문제가 있다고 판단하여 속도 개선을 위해 어느 부분에서 시간이 오래 걸리는지 디버깅 모드에서 찾아봄.
확인 결과 📢
엑셀을 만들고 데이터를 세팅하는데 시간이 오래 걸린 게 아니라
엑셀 만들기 전에 데이터를 변환하는 과정이 있었는데 그 과정에서 문제가 있었음.
🔧 해결과정
데이터 변환 로직(일부)
//기존 코드
Field[] fields = target.getClass().getDeclaredFields();
for (Field field : fields
) {
field.setAccessible(true); //접근 권한 변경
if(field.get(target) != null){
switch (field.getName()) {
case "aCde":
setCode1("detail",ftrcList,field,target);
break;
case "bCde":
setCode2("detail",hjdList,field,target);
break;
case "cCde":
setCode3("detail",bjdList,field,target);
break;
case "dCde":
setCode4("detail",mngrList,field,target);
break;
case "eCde":
case "fCde":
case "gCde":
case "hCde":
case "iCde":
//문제 발생 지점
rdCodeList = codeService.getOtherCodeListToExcel(new ArrayList<>(Arrays.asList("test","test1","test2")));
setCode5("detail",rdCodeList, field, target);
break;
default:
setCode5("detail",codeList, field, target);
break;
}
}
}
위 코드처럼 각 Field를 가져와서 switch 문의 조건에 해당하는 코드를 변환하는 로직인데
문제 발생 지점에서 codeService를 통해 코드 리스트를 조회하는 부분이 매 컬럼마다 실행되어
의미 없는 DB 조회가 중복되고 있었고 때문에 속도가 떨어졌던 것이었음.
그럼 문제 지점은 알았으니 어떻게 변경하면 속도 기능이 개선될지 고민해 본 결과
rdCodeList라는 리스트에 아무 데이터가 없을 때만 조회를 하면 딱 한 번만 데이터를 조회할 수 있다고 판단하여
아래와 같이 로직을 리펙토링하였음.
//변경한 코드
Field[] fields = target.getClass().getDeclaredFields();
for (Field field : fields
) {
field.setAccessible(true); //접근 권한 변경
if(field.get(target) != null){
switch (field.getName()) {
case "aCde":
setCode1("detail",ftrcList,field,target);
break;
case "bCde":
setCode2("detail",hjdList,field,target);
break;
case "cCde":
setCode3("detail",bjdList,field,target);
break;
case "dCde":
setCode4("detail",mngrList,field,target);
break;
case "eCde":
case "fCde":
case "gCde":
case "hCde":
case "iCde":
if(rdCodeList.size() < 1){
//한번만 조회하도록 설정
rdCodeList = codeService.getOtherCodeListToExcel(new ArrayList<>(Arrays.asList("test1","test2","test3")));
}
setCode5("detail",rdCodeList, field, target);
break;
default:
setCode5("detail",codeList, field, target);
break;
}
}
}
소스를 수정하고 엑셀 기능을 다시 테스트해보니...
10초 넘게 걸리던 시간이 2~3초로 확! 줄었음.🎉🎊👍
🔎 느낀 점
기능 개발을 우선순위로 두고 개발을 진행하다 보니 속도 이슈 같은 현상을 만날 때마다 당황스러움.
하지만 리펙토링을 진행하고 개발한 소스의 어떤 부분이 문제였는지 알아가면서
현재 필자의 안 좋은 개발 습관도 고쳐나갈 수 있었고, 다음부터는 이렇게 개발해야겠다는 방향도 잡을 수 있었음.
또한 리펙토링의 소중함과 DB조회는 최소한으로 할 수 있도록 개발해야 한다는 것을 한번 더 상기시킬 수 있었음.
다음번에는 한 번에 수정된 코드처럼 개발할 수 있는 어썸 한 개발자가 되고 싶었음🙏