회원가입

[리팩토링] 9. board 함수 리팩토링 설계

Beany 2024-06-01

 AS-IS Code

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 에 로직 최소화

생각해본 결과, 위에 있는 작업을 수행하면 될 것으로 판단되었습니다.

 

다음 장은 리팩토링을 하는 게시글이 될 것입니다!

0 0
블로그 일기
제 블로그의 고도화 과정을 설명합니다. 이는 코드 리팩토링과 추가된 기능들에 대해 기록하기 위한 게시판입니다. 어떤 기능이 추가되었는지, 무엇이 개선되었는지 등 고도화되는 과정을 자세히 다룰 예정입니다.
Yesterday: 456
Today: 86