혁신을 이룹니다, 오딘박스(OdinBOX)

언제나 어디서나 오딘박스와 함께!

레거시 코드, 너는 대체 왜 이러니? 개발자의 생존 가이드

간지뽕빨리턴님 2025. 1. 4. 20:40
반응형

레거시 코드는 '누가 이걸 만들었어?' 하다가 거울 속 내 얼굴을 보게 되는 코드

레거시 코드는 과거의 선택이 현재의 도전이 된 코드

개발자라면 누구나 한 번쯤 이런 경험이 있을 겁니다.

"이 코드는 누가 짰지?"

"어라, 내가 짰네..."

이제는 손대기 무서운 코드가 되어버린 레거시 코드

레거시 코드는 마치 오래된 라면 수프처럼, 없으면 안 되지만 뜯으면 뭔가 찝찝한 존재입니다. 하지만 이것도 결국 누군가의 땀과 눈물로 만들어진 유산이죠. 이번 글에서는 레거시 코드의 정체와 문제점, 이를 어떻게 다루면 좋을지, 그리고 우리에게 주는 교훈까지, 재미있고 실용적으로 풀어보겠습니다.

목차

    레거시코드

    레거시 코드란 무엇인가?

    레거시 코드(Legacy Code)란 단순히 오래된 코드를 의미하지 않습니다.

    대체로 다음과 같은 특징을 가진 코드를 말합니다

     

    테스트가 없다: 변경하려고 코드를 살짝 건드렸더니 다른 기능이 망가지는 미스터리

    문서화가 없다: 코드를 짠 사람만이 알던 비밀은 이미 역사 속으로 사라졌습니다.

    복잡하고 이해하기 어렵다: 한 줄 읽었는데 이해하는 데 하루가 걸리는 코드

    "잘 돌아가고 있으니까 건들지 마"라는 경고가 달려 있다.

    하지만, 레거시 코드의 진짜 정의는 유지보수가 어렵고, 현재 기술 스택과 잘 맞지 않는 코드입니다.

    즉, 시대를 잘못 만난 코드라고 볼 수 있죠.

    왜 레거시 코드는 우리를 괴롭히는가?

    레거시 코드는 마치 집 안 구석에 쌓여 있는 오래된 물건과 같습니다.

    분명히 쓸모는 있는데, 치우려고 하면 일이 너무 커져서 포기하게 되는 물건 말이죠.

    문제점 1: 변경의 두려움

    레거시 코드는 보통 테스트 코드가 없기 때문에, 코드를 변경하면 다른 부분이 깨질 확률이 높습니다.

    def calculate_discount(price, discount_rate):
        return price - (price * discount_rate)  # 여기 문제 생기면 다 망함
        
    # 테스트 코드가 없어서 이걸 건드리면 시스템 전체가 터질지도 모름...

     

    문제점 2: 복잡성의 늪

    레거시 코드는 한 번 작성된 이후, 여러 명의 개발자가 얹어 쌓아 올린 결과물입니다.

    이 과정에서 로직이 꼬이고, 구조가 복잡해지며, 결국 아무도 이해하지 못하는 코드가 됩니다.

    문제점 3: 기술 부채

    기술 부채란 현재의 편의를 위해 미래의 문제를 떠넘기는 것입니다.

    레거시 코드는 대부분 "나중에 고치자"라는 마음으로 만들어졌지만, 그 "나중"이 결국 지금이 된 거죠.

    레거시 코드 해결법, 괴물을 길들이는 기술

    테스트 코드 추가

    레거시 코드를 변경하기 전에, 반드시 테스트 코드를 작성하세요.

    테스트는 레거시 코드와의 싸움에서 가장 강력한 방패입니다.

    # 기존 함수
    def calculate_total(price, tax):
        return price + tax
        
    # 테스트 코드
    def test_calculate_total():
        assert calculate_total(100, 10) == 110
        assert calculate_total(200, 20) == 220

    리팩터링은 작은 단위로

    레거시 코드는 한꺼번에 고치려다 보면 더 큰 문제가 생깁니다.

    작은 단위로 나누어 리팩터링하세요.

    # 리팩터링 전
    def process_order(order):
        if order["type"] == "physical":
            print("Processing physical product")
        elif order["type"] == "digital":
            print("Processing digital product")
    
    # 리팩터링 후
    def process_physical_order():
        print("Processing physical product")
    
    def process_digital_order():
        print("Processing digital product")
    
    def process_order(order):
        order_processors = {
            "physical": process_physical_order,
            "digital": process_digital_order,
        }
        order_processors[order["type"]]()

    기술 빚을 갚는 습관 만들기

    레거시 코드는 기술 빚의 결과물입니다.

    빚를 갚기 위해서는 주기적으로 코드를 검토하고, 오래된 부분을 개선해야 합니다.

     

    코드 리뷰: 다른 개발자와 함께 코드를 검토하세요.

    정기적인 리팩터링: 주기적으로 코드를 개선하는 시간을 가지세요.

    문서화와 대화

    레거시 코드를 다룰 때는 팀원들과의 소통이 중요합니다.

    "왜 이렇게 고쳤는지"를 기록으로 남기면, 미래의 자신과 동료들과 소통이 될 수 있으리라 생각합니다.

    레거시 코드가 주는 교훈

    레거시 코드는 단순히 "나쁜 코드"가 아닙니다.

     

    역사의 산물: 누군가는 이 코드를 통해 문제를 해결하고, 가치를 창출했습니다.

    배움의 기회: 레거시 코드를 다루며 설계, 디버깅, 리팩터링의 역량이 크게 향상됩니다.

    협업의 중요성: 레거시 코드는 혼자 해결하기 어려운 경우가 많습니다. 팀워크가 필수입니다.

    마무리

    레거시 코드는 개발자들에게 도전 과제이자 성장의 기회입니다. 괴물처럼 보일지 몰라도, 올바른 접근법과 마음가짐으로 다가간다면, 그것은 당신을 더 뛰어난 개발자로 만들어 줄 것입니다. 다음에 레거시 코드를 만난다면, 이렇게 말해보세요.

    "너와 내가 함께 성장할 시간이야!"

    하지만, 현실은 만나게 되면 겁부터 먹을게 뻔하겠지만 이 글을 이렇게 정리를 하면서 저 또한 실무에서 실제로 레거시 코드를 만나게 된다면 변화할 수 있도록 노력해야겠죠