Clean Architecture

프로그래밍 패러다임

mechaniccoder 2023. 10. 21. 15:45

들어가면서

얼마전에 회사에서 클린 아키텍처 책을 바탕으로 스터디를 시작했다. 예전 코딩에 입문한지 얼마 되지 않았을 때 읽었던 기억이 있는데 그때는 배경 지식이 없다보니 대부분의 내용을 잘 이해하지 못했다. 이제는 책을 이해하기 위한 배경 지식이 어느 정도 쌓인 상태이고 이 책을 통해 더 나은 비지니스 모델의 변경에 유연하게 대처하는 아키텍처를 설계하는 역량을 쌓을 것이다.

스터디를 진행하면서 중요한 내용은 나만의 관점으로 소화하여 블로그에 기록할 예정이다.

패러다임

프로그래밍 패러다임에 관한 내용이 나온다. 내가 알기로는 절차지향, 객체지향, 함수형 프로그래밍 이렇게 세가지가 존재하는 것으로 알고 있는데 책에서는 구조적, 객제지향, 함수형을 소개하고 있다. 절차지향과 구조적이 다른점인데 찾아보니 구조적 프로그래밍이 절차지향을 포함하는 패러다임이라고 한다. 자세한 내용은 아래에서 살펴보자.

그리고 각 패러다임마다 개발자로부터 하나의 능력을 뺏어가는데 어떤 능력을 뺏어가는지 보는 것도 재밌을 것이다.

구조적 프로그래밍

구조적 프로그래밍은 개발자로부터 goto문을 뺏어갔다. 코드의 흐름을 뛰어넘어 다니는 goto문은 프로그램을 더 작은 단위의 모듈로 분해하는 것에 방해가 된다. 이를 위해서 순차, 분기, 반복만을 사용해 프로그램을 작성하도록 한다.

나는 다음 문장을 읽고 영감을 받았다. "큰 시스템을 모듈, 컴포넌트로 나눌 수 있으며 각각의 모듈과 컴포넌트는 입증할 수 있는 작은 단위로 더 나눌 수 있다." 즉 테스트 가능한 단위로 시스템을 나눌 수 있게 됐다는 의미라고 받아들였다. 하나의 큰 덩어리를 테스트하기는 정말 어렵다. 실무에서 많이 겪었던 부분이다. 테스트를 위해 중요한 코드를 다른 모듈로 분리해내고 단위테스트를 붙였던 경험들이 생각이 났다.

객체지향 프로그래밍

객체지향 프로그래밍은 간접적인 제어에 대한 규칙이 생긴다.

이 책에서는 객제지향 개념중 다형성에 초점을 맞춰 설명하고 있다. 내가 이전에 공부했었던 객체지향은 객체들간의 협력과 객체들이 가지는 책임 그리고 역할을 강조하고 있었는데 다형성만 초점을 맞추고 있어서 의아하긴 했다.

의존성 역전에 대해 책에서는 이렇게 표현하고 있다. "객체지향은 다형성을 활용해 소스코드의 제어 흐름에 절대적인 권한은 획득하도록 한다." 의존성 역전 원칙을 생각해보면 구현체에 의존하는 것이 아닌 인터페이스에 의존하도록 설계한다. 그리고 런타임에 구현체를 주입함으로써 적절한 로직이 실행되도록 한다. 표현을 저렇게 하니 굉장히 멋진 능력을 손에 넣은 기분이 들었다.

함수형 프로그래밍

함수형 프로그래밍은 변수 할당에 대한 규칙을 부여한다.

즉 불변성에 관한 얘기이다. 가변 변수는 버그을 발생시키는 주요 원인이 된다. 물론 프로그래밍은 무언가를 변화하기 위해 존재한다. 함수형 프로그래밍이 말하는 것은 불변한 것과 가변적인 것을 나눠서 가변적인 것을 고립시키는 것이다. 최대한 많은 것들을 불변하는 영역으에 두고 어쩔 수 없는 것들만 가변적인 영역에서 관리하면 버그를 격리시키고 관리하기가 용이해진다고 생각한다.

내가 공부했던 함수형 프로그래밍에서는 가변적인 부분에 대해 액션이라는 용어를 사용했었다. 만약 어떤 함수가 액션이고 다른 함수가 이를 사용하게 되면 이 함수또한 액션이 전파된다. 이를 해결하기 위해 액션을 최대한 위로 꺼내서 격리시킨다. 클린 아키텍처, 어니언 아키텍처, 헥사고날 아키텍처를 생각해봤을때 이 개념이 녹아들어 있다고 생각했다.

사실 내가 함수형 프로그래밍을 공부할때 불변, 가변이 전부는 아니었다. 추상화 계층을 어떤 식으로 설계할 것인지 (즉 이 레이어에서는 어떤 것을 모르게 할건지) 이를 위해 일급 함수를 사용했고 map, reduce 같은 파이프라인도 소개하고 있었다. 물론 불변 가변이 중요한 부분이니 다시 한번 머리에 정리하는 시간이 됐다.

마치며

프로그래밍 패러다임에 대한 지식을 가지고 있는 것은 좋다고 생각한다. 프런트엔드 혹은 백엔드 코드를 짤때 이 비지니스 로직은 어떤 식으로 접근할지 코드를 어떤 위치에 둘지 코딩을 접한지 얼마되지 않았을때 고민하는 것에 대한 기준이 생긴다. 이러한 기준이 생기면 좋은게 고민할 시간이 줄어드니 생산성이 올라가고 코드리뷰에서 다른 사람을 설득하기가 더 쉬워진다.

다음 내용은 SOLID에 대한 개념이 나오기 시작한다. 굉장히 중요한 개념이고 나도 공부하면서 다시 한번 정리하는 시간이 될 것 같다.