I can do it(Feat. DEV)

DB 조회는 최소한으로! 본문

개발자 모드/오류처리

DB 조회는 최소한으로!

까짓거 해보자 개발자 2024. 3. 14. 11:37
728x90
📝 글을 쓰게 된 계기(문제 발견)

 

프로젝트 진행 중 저번에 만들었던 엑셀 다운로드 기능으로 다운로드 테스트를 했음.

 

그런데!! 건수가 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조회는 최소한으로 할 수 있도록 개발해야 한다는 것을 한번 더 상기시킬 수 있었음.

 

다음번에는 한 번에 수정된 코드처럼 개발할 수 있는 어썸 한 개발자가 되고 싶었음🙏

728x90