memostack
article thumbnail
Published 2020. 6. 3. 19:35
리팩토링(Refactoring)에 대해서 ETC
블로그를 이전하였습니다. 2023년 11월부터 https://bluemiv.github.io/에서 블로그를 운영하려고 합니다. 앞으로 해당 블로그의 댓글은 읽지 못할 수 도 있으니 양해바랍니다.
반응형

리펙토링이란?

리펙토링은 기존의 코드를 외부의 동작 방식에는 변화 없이 내부 구조를 변경해서 재구성하는 작업 또는 기술을 말한다.

 

리펙토링을 통해 얻을 수 있는 이점

  • 코드를 이해하기 편해짐
  • 변화에 효율적으로 대응할 수 있음
    • 생산성이 높아짐
    • 코드의 품질이 좋아짐
    • 유지 보수하기 편함

 

Example

(적절한 예인지 모르겠으나, 한가지 예를 만들어봤다)

 

예를들어서, 정보를 담고 있는 A.txt, B.txt 파일 2개를 만들고, text_dir 라는 특정 디렉토리에 복사하는 프로그램을 작성했다.

import os
import shutil

dir_path = "~/text_dir"

# A.txt
a_file_path = "~/A.txt"
with open(a_file_path, "w") as f:
    f.write("블라블라")
shutil.copy2(a_file_path, os.path.join(dir_path, "A.txt"))

# B.txt
b_file_path = "~/B.txt"
with open(b_file_path, "w") as f:
    f.write("블라블라2")
shutil.copy2(b_file_path, os.path.join(dir_path, "B.txt"))

 

중복제거

하지만, 위 코드는 중복된 부분도 있고, 복사해야하는 파일 C.txt 가 생긴다고 하면 같은 코드를 또 작성해야한다.

위 코드를 리팩토링하면, 아래와 같이 할 수 있다. (더 좋게 바꿀 수도 있겠지만, 내가 생각한 부분은 여기까지..)

import os
import shutil


def write_n_copy(src_path, dest_path, text):
    """파일에 만들고 특정 디렉토리로 복사한다"""
    dir_name, file_name = os.path.split(src_path)
    with open(src_path, "w") as f:
        f.write(text)
    shutil.copy2(src_path, os.path.join(dest_path, file_name))


# A.txt
write_n_copy("~/A.txt", "~/text_dir", "블라블라")

# B.txt
write_n_copy("~/B.txt", "~/text_dir", "블라블라2")

 

상황 1. 파일 추가 요청

고객사의 요청으로 C.txt 파일도 추가하고, C.txt 파일은 text_dir2에 복사해달라고 한다면 아래와 같이 메소드를 하나 더 호출하면 된다.

import os
import shutil


def write_n_copy(src_path, dest_path, text):
    """파일에 만들고 특정 디렉토리로 복사한다"""
    dir_name, file_name = os.path.split(src_path)
    with open(src_path, "w") as f:
        f.write(text)
    shutil.copy2(src_path, os.path.join(dest_path, file_name))


# A.txt
write_n_copy("~/A.txt", "~/text_dir", "블라블라")

# B.txt
write_n_copy("~/B.txt", "~/text_dir", "블라블라2")

# C.txt
write_n_copy("~/C.txt", "~/text_dir2", "블라블라3")

 

상황 2. DB 저장 추가

이번에는 파일을 만들고 특정 디렉토리로 복사하는 것 뿐만 아니라, DB에도 값을 저장해달라는 요청이 들어왔다. 단순히 메소드 내부만 수정하면 된다.

import os
import shutil


def write_n_copy(src_path, dest_path, text):
    """파일에 만들고 특정 디렉토리로 복사한다"""
    dir_name, file_name = os.path.split(src_path)
    with open(src_path, "w") as f:
        f.write(text)
    shutil.copy2(src_path, os.path.join(dest_path, file_name))
    
    # 아래에 DB에 값을 넣는 코드 추가
    # ...


# A.txt
write_n_copy("~/A.txt", "~/text_dir", "블라블라")

# B.txt
write_n_copy("~/B.txt", "~/text_dir", "블라블라2")

# C.txt
write_n_copy("~/C.txt", "~/text_dir2", "블라블라3")

 

결론은 코드 리팩토링을 통해 변화에 효율적이고 유연하게 대응할 수 있다는 것이다.

 

Code Smell

리팩토링이 절실히 필요한 코드를 Code Smell 이라고 칭한다.

  • 말 그대로 "코드에서 (나쁜) 냄새가 난다." 라는 뜻

출처: http://arbo.com.ve/code-smells/when-and-why-your-code-starts-to-smell-bad-3-638-jpg/

Code Smell 중 흔한 예는 '중복된 코드' 다. 적절한 리팩토링을 통해 Code Smell 을 제거해줘야 한다.

 

추천하는 책

Code Smell 과 관련되어 추천하는 책

  • '리팩토링' (마틴 파울러, 켄트 벡 공저)
반응형
블로그를 이전하였습니다. 2023년 11월부터 https://bluemiv.github.io/에서 블로그를 운영하려고 합니다. 앞으로 해당 블로그의 댓글은 읽지 못할 수 도 있으니 양해바랍니다.
profile

memostack

@bluemiv_mm

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!