서버 최적화: DB에서 데이터를 메모리로 캐싱하여 성능 향상하기
Velocity 에서 DB 가져오는 시간 줄이기
Velocity 에서 Render 하는 작업이 굉장히 오래 걸린다. 그래서 우선 제일 사람들이 많이 방문하는 main page 그리고 포스트를 보는 question page 의 vm 파일을 한줄 한줄 보았다
우리는 post handle 에서 util class 를 직접 내린다. utils 에서 사용하고 싶은 함수가 몇몇 있기 때문이다.
1
modelAndView.addObject("Utils", utils);
다시 메인페이지로 넘어와 메인페이지는 모든 게시판들의 글을 모아서 보여주고 있다. 따라서 QnA 글을 답변의 수를 보여주고 자유 게시판은 댓글의 수를 보여주고 이런 식으로 space 들 마다의 설정이 DB 에 저장이 되어있다. 이 값을 가져오는 함수는 utils 에 있었다.
1
2
3
4
public String getReadOption(String spaceName) {
//REad From DB
return readOption;
}
이 함수를 매 게시글 하나하나를 갈때마다 들리게 되니 게시글의 수 만큼 DB 에 접근을 하게되었다. 그만큼 사용자가 페이지를 보게 될 시간이 점점 느려지고 있었다.
DB 에 접근하지 말고 잠시 메모리에 저장해 두자
따라서 중복으로 DB 를 가지 않도록 한번 불러온 값은 Map 에 저장해두고 거기에서 가져오는것이 좋을것 같았다. 따라서 개선된 코드는 아래와 같다!
#foreach($post in $posts)
#set($readOptionMap = {})
#set($currentPostSpace = $post.space)
#if(!$readOptionMap.containsKey($currentPostSpace))
!$readOptionMap.put($currentPostSpace, $!Utils.getReadOption($currentPostSpace))
#end
$readOptionMap.get($currentPostSpace) ### 이 값으로 사용한다!
readOption 뿐만 아니라 showReplyOrComment, spacecolor 등등 엄청 다양했는데 위와 같이 수정하니 확실히 시간이 줄었다. VisualVM 에서 rendering 이 오래 걸렸다는 사실을 알려주어서 실마리를 찾을 수 있었다!
This post is licensed under CC BY 4.0 by the author.