def get_board_set_from_board_group(request, board_group_id):
...완료!!!
def home(request):
...완료!!!
def board(request, board_url):
...이번장!!!
def post_detail(request, board_url, pk):
...
def reply_write(request, board_url, pk):
...
def rereply_write(request, board_url, pk):
...
def reply_delete(request, board_url, pk):
...
def rereply_delete(request, board_url, pk):
...
def like(request, board_url, pk):
...
[ get_board_set_from_board_group 함수 리팩토링 ]
get_board_set_from_board_group 리팩토링 정보 보기
[ home 함수 리팩토링 ]
home 페이지 성능 개선 Board View 코드 리팩토링
home 페이지 좋아요, 댓글 수 Board View 코드 리팩토링
Board 앱의 View 함수들을 살펴보니 총 9개의 코드가 존재합니다.
하나하나씩 불필요한 코드를 제거하거나 리팩토링해 보겠습니다
과거의 제가 주석을 남겨서 이 View 함수가 어떤 작업을 하는지 바로 알 수 있을 것 같습니다.
def board(request, board_url):
q = Q()
board_obj = None
tag_board = None
# page:
# 1 게시판 페이지
# 2 태그 페이지
# 3 검색 페이지
page = 1
search = request.GET.get('search')
# 태그 페이지
if board_url[0] == '_':
page = 2
tag_option = board_url[1:]
# 검색 페이지
if board_url == 'search':
page = 3
if search:
tag_id_list = Tag.objects.filter(
tag_name__icontains=search
).values_list(
'id', flat=True
)
q = q & Q(title__icontains=search) | Q(body__icontains=search) | Q(tag_set__in=tag_id_list)
# 게시판 선택
if page == 1:
board_obj = get_object_or_404(Board, url=board_url)
posts = board_obj.post_set.filter(q).order_by(
'-created_at'
)
# 태그 검색
elif page == 2:
tag_board = get_object_or_404(Tag, tag_name=tag_option)
posts = tag_board.post_set.filter(q).order_by(
'-created_at'
)
# 전체 검색
elif page == 3:
posts = Post.objects.active().filter(q).order_by(
'-created_at'
)
paging_obj = web_paging(
posts,
int(request.GET.get('page', 1)),
10,
5,
)
context = {
'posts': paging_obj.get('page_posts'),
'page_range': paging_obj.get('page_range'),
'board': board_obj,
'tag_board': tag_board,
}
return render(request, 'board/board.html', context)
일반 게시판, 태그 게시판, 검색 게시판을 1개의 View 에서 사용하고 있는 것 같습니다.
게시판에는 각 게시판에 대응되는 게시글들을 페이지네이션하여 보여주고 있습니다.
[ 일반 게시판 ]
URL 형태: https://cwbeany.com/blog_diary
[ 태그 게시판 ]
URL 형태: https://cwbeany.com/_%EB%A6%AC%ED%8E%99%ED%86%A0%EB%A7%81
앞에 '_' 문자가 붙음
[ 검색 게시판 ]
URL 형태: https://cwbeany.com/search?search=%EB%A6%AC%ED%8E%99%ED%86%A0%EB%A7%81
앞에 search 키워드와 함께
이렇게 개발했던 당시를 떠올려보면, 동일한 Request 구조와 Response 구조 때문에 하나의 board 함수에서 해당 로직을 구현한 것 같습니다.
이 방식에는 장점과 단점이 있습니다.
장점: 동일한 구조이기 때문에 모든 케이스가 동일하게 바뀌면 그에 대응하여 해당 부분만 수정하면 됩니다.
단점: 동일한 구조로 바뀌지 않으면 If 문이 많아질 가능성이 높고, 이에 따라 유지보수가 어려워지고 로직이 복잡해집니다. 코드가 너무 길어져서 새로운 사람이나 미래의 내가 이 로직을 다시 보면 이해하기 어렵습니다.
[ 장점 예제 ]
> 동일한 구조이기 때문에 모든 케이스가 동일하게 바뀌면 그에 대응하여 해당 부분만 수정
요구사항: "모든 게시판에 게시글 날짜 뿐만 아니라 시간도 보였으면 좋겠어!"
해결방법: 시간도 조회할 수 있도록 정보를 넘겨준다. 그러면 모든 곳에 시간도 보일 것이다.
[ 단점 예제 ]
> 동일한 구조로 바뀌지 않으면 If 문이 많아질 가능성 + 유지보수가 어려워지고 로직이 복잡
요구사항: "일반 게시판에만 날짜 뿐만 아니라 시간이 보이고, 검색 게시판에는 시간만 보이고, 태그 게시판에는 날짜랑 시간 둘다 보이고 싶어"
해결방법: 일반 게시판, 검색 게시판, 태그 게시판 케이스 각각 If 조건 문에 따라 응답값을 다르게 줍니다.
> 코드가 너무 길어져서 새로운 사람이나 미래의 내가 이 로직을 다시 보면 이해하기 어렵다.
요구사항: N개월 뒤, "A님 게시판 쪽 로직 수정해주세요~"
해결방법: '흠??? 로직이 어쩔 때는 이렇고, 어쩔 때는 저렇고 왤캐 난잡하지??? 히스토리를 알아야할 것 같은데... 너무 코드가 복잡해..' 처럼 코드 파악하는 데 시간이 걸립니다.
1. 각 게시판에 대한 로직을 새로운 endpoint 로 재구성
[ AS-IS ]
https://cwbeany.com/{여기의값에 따라 변경되는 1개의 URL}
[ TO-BE ]
일반 게시판: https://cwbeany.com/board/{게시판이름}?search=XXX
태그 게시판: https://cwbeany.com/board/tag/{tag명칭}?search=XXX
검색 게시판: https://cwbeany.com/board?search=XXX
2. home 함수 작업하면서 수정했던 좋아요 및 댓글 수 조회 쿼리 줄이기
3. Request DTO, Response DTO 생성으로 HTML 에 로직 최소화
생각해본 결과, 위에 있는 작업을 수행하면 될 것으로 판단되었습니다.
다음 장은 리팩토링을 하는 게시글이 될 것입니다!