해결된 질문
작성
·
34
답변 1
2
크리스팍님 좋은 질문 남겨 주셔서 감사합니다. 🙂
설계가 변경과 관련이 있다는 사실을 떠올려보시면 설계 원칙과 디자인 패턴이 밀접하게 연관되어 있다는 사실을 알 수 있습니다.
먼저 설계 원칙은 다음의 두 가지 용도로 활용할 수 있습니다.
요구사항이 변경될 때 코드의 어떤 부분이 변경에 부적합한 지를 판단하는 가이드로 활용할 수 있습니다. 이 부분은 새로 코드를 구현하는 시점이나, 기존 코드를 리팩터링하는 시점이나 동일한 가이드를 적용할 수 있는데, 설계 원칙을 따르는게 변경에 적합한지 여부를 결정해야 합니다.
코드를 리팩터링할 때 설계를 어떻게 변경하면 좋은 지에 대한 방향성을 알려줍니다. SRP는 코드를 변경에 따라 분리하도록 만들고, DIP는 변경을 기준으로 추상화를 도입하게 만듭니다.
설계 원칙에 따라 판단하고 리팩터링하면 코드가 적절한 위치를 찾아가면서 현재의 변경을 수용하기에 적합한 역할, 책임, 협력이 자리를 잡게 됩니다.
다양한 기능을 구현하거나 다양한 시스템을 구현하다 보면 코드를 유연하게 만들어야 하는 원인이 유사할 때 유사한 방식으로 코드를 리팩터링하게 된다는 사실을 발견하게 됩니다.
예를 들어서 요구사항이 변경돼서 다양한 종류의 할인 정책을 동적으로 선택해야 하는 상황과, 다양한 영속성 메커니즘이 필요해져서서 여러가지 영속성 스토리지를 선택해야 하는 상황은 변경이라는 관점에서 보면 동일한 요구사항을 처리할 수 있는 다양한 알고리즘 중에 하나를 선택한다는 공통점이 있습니다.
두 가지 모두 설계 원칙 관점에서 코드를 리팩터링하다 보면 유사한 역할, 책임, 협력으로 구성된 유사한 설계를 얻게 되는 경우가 많은데, 이렇게 유사한 문제를 해결하다 보면 “이런 변경에는 이런 식으로 코드를 설계하면 된다”는 일종의 경험치가 쌓이게 됩니다.
이렇게 유사한 변경이 반복적으로 발생할 때 매번 설계 원칙에 따라 역할, 책임, 협력을 결정하는게 아니라, 중간 단계를 생략하고 미리 알고 있는 역할, 책임, 협력의 템플릿을 가져다가 이를 기반으로 코드를 구현할 수 있는데, 이렇게 재사용 가능한 설계(코드가 아니라)를 디자인 패턴이라고 부릅니다.
다음은 "GoF의 디자인 패턴(https://product.kyobobook.co.kr/detail/S000001962303)" 서론에서 발췌한 부분인데 변경이라는 관점에서 아래 글을 읽어보시면 도움이 되실거에요.
전문가들이 초보자들처럼 하지 않는 것이 한 가지 있다면, 모든 문제를 처음 기초 단계에서 해결하려 하지 않는다는 것이다. 대신, 전에 사용했던 해결책을 다시 사용해 본다. 그리고 좋은 방법을 찾아냈다면 그 방법을 반복해서 계속 사용하게 된다. 이런 경험을 통해 전문가가 만들어지고, 결국에는 많은 객체지향 시스템들에서 클래스 패턴이나 객체들 간의 상호작용 방식이 반복됨을 알게 된다. 이런 반복 패턴들은 특정 설계 문제점들을 해결해 주고, 좀 더 유연하고, 근사하고, 재사용 가능한 객체지향 소프트웨어를 만들어준다.
… 디자인 패턴은 재사용 가능한 객체지향 설계를 만들기 위해 유용한 공통의 설계 구조로부터 중요 요소들을 식별하여 이들에게 적당한 이름을 주고 추상화한 것이다. 디자인 패턴은 패턴에 참여하는 클래스와 그들의 인스턴스를 식별하여 역할을 정의하고 그들 간의 협력 관계를 정의하고 책임을 할당한다.
결과적으로 현재 변경을 목표로 설계를 할 때 어떤 디자인 패턴을 적용하는게 적합하다고 판단된다면(이 부분은 단순히 기술적인 문제가 아니라 상황에 따라 복잡도가 올라가는지를 판단할 수 있는 경험이 필요합니다) 디자인 패턴을 적용하는 것을 목표로 코드를 구현합니다.
하지만 디자인 패턴은 꼭 필요할 때만 사용하는게 좋기때문에 애매하다면 일단 디자인 패턴을 고려하지 않고 코드를 구현한 다음에 실제로 구현된 코드를 보면서 설계 원칙을 기반으로 코드를 리팩터링하거나 디자인 패턴을 적용하는게 적합하다고 판단될 경우에만 디자인 패턴을 목표로 리팩터링하시는게 좋습니다.
이 부분에 대해서는 "패턴을 활용한 리팩터링(https://product.kyobobook.co.kr/detail/S000001469867)"을 읽어 보시면 큰 도움이 되실거에요. 🙂
답변이 되었는지 모르겠네요.
감사합니다.
도움이 되셨다니 다행입니다. 🙂
요즘 예전보다 설계에 대한 관심이 줄어 아쉬운 마음이 큰데, 크리스팍님처럼 강의를 통해 좋은 인사이트를 얻었다는 말씀을 들으면 큰 보람을 느끼게 됩니다.
제가 강의 하나를 만드는데 오래 걸리는 스타일이라 더디긴 하겠지만 설계에 관심이 있으신 분들께 도움이 될 수 있는 다양한 주제를 다뤄보도록 하겠습니다.
행복한 주말 보내시고 감사드립니다!
소중한 답변 감사드립니다.
답변에서도 강사님의 개발 철학이 느껴지는건 저뿐이려나요.. ㅎㅎ
과거 디자인패턴에 빠져서 핵심을 놓치고 패턴에만 맞춰 구현하다보니 뭔가 주객전도가 된 느낌을 지울수 없었는데 다시 처음부터 알고보니 왜 그랬었고 그래야 하는지 되돌아볼 수 있게된것 같습니다~ 🙂
소개해주신 책들도 꼭 보도록 하겠습니다~~ 강사님 덕분에 많은 인사이트 얻어갑니다~!!
앞으로 다양한 주제로 강의 만들어주시면 많은 개발자분들에게 큰 도움이 되지 않을까 싶습니다~!!
감사합니다!!