TypeScript와 Design Pattern

Jessie·2024년 6월 28일

굉장히 주관적인 의견을 담아 작성한 글이며, 아직 부족한 실력으로 인해 잘못된 정보가 포함되어있을수 있습니다.

타입스크립트에 디자인 패턴을?

내가 지금 일하고 있는 회사는 객체 지향적으로 프로그래밍 하는 것을 선호한다. 그러다보니 자연스럽게 코드에 디자인 패턴을 사용하게 되었다. 하지만 타입스크립트로 코드를 작성하다보면 디자인 패턴을 적용하기가 어려운 부분이 있다. 구글을 찾아보면 디자인 패턴 개념에 딸린 예시는 전부 Java 코드고, 실제 사용 예시를 찾아보면 Swift나 Kotlin이었다. 따라하려고 해도 언어가 제공해주는 기능이 다르다보니 한계를 마주하게 된다. 어찌저찌 지지고볶아 모양새를 만들어내면, 읽기 어렵고 고치기 어려운 코드가 되고 말았다. 그러다보니 타입스크립트로 개발을 할 때 디자인 패턴이 문제 해결을 위해 적합한 방법인지 생각해보게 되었다. 예제가 많이 없는 것은 사람들이 많이 쓰지 않는다는 말일까? 디자인 패턴은 타입스크립트라는 언어에 맞는 문제 해결 방법인가? 아니면 디자인 패턴 대신 이 문제를 해결할 수 있는 타입스크립트만의 방법이 있을까? 이 고민을 하며 나름의 답을 찾기 위해 여러 글을 읽어보았고, 나만의 개발 방향성을 찾고자 했다.

자바스크립트는 멀티 패러다임 언어

자바스크립트는 프로토타입을 기반으로 객체 지향 프로그래밍을 지원하는 언어다. 그리고 함수를 일급 객체로 다룸으로써 함수형 프로그래밍 패러다임 또한 사용할 수 있게 해준다. 구글링을 하면서 자바스크립트를 사용하는데 OOP는 크게 중요하지 않다거나, 디자인 패턴에 대해 공부하지 않아도 괜찮다는 글을 종종 봤다. (물론 그런 의견을 가진 분들도 나름의 이유를 가지고 글을 쓴 것일테고, 극단적으로 자바스크립트를 쓸 때 객체 지향을 아예 하지 말라는 말도 아닐 것이라는 것은 안다.) 하지만 자바스크립트에 OOP가 중요하지 않다면 왜 프로토타입을 기반으로 하면서까지 객체 지향 프로그래밍을 지원하게 되었는지, 왜 ES6에서 class 키워드를 추가하게 되었는지, 왜 타입스크립트에 각종 객체 지향 문법이 추가되었는지 설명이 되지 않았다. 객체 지향과 함수형 패러다임을 사용할 수 있게 만들어주었다면, 두 기능 모두를 잘 사용하는 것이 이 언어를 잘 쓰는 방법이 아닌가?

하지만 자바스크립트는 자바나 C++처럼 클래스를 기반으로 하는 언어들과는 다른 특성을 가진다. 위에서 언급한 함수의 일급 객체 취급이나 프로토타입 객체 지향 방식 뿐만 아니라 this의 동적 바인딩 등 자바스크립트만의 독특한 특성을 가진다. 심지어 처음 만들어졌을 당시에는 class 키워드도 없었고, 현재는 class 키워드가 생겼다고는 하지만 프로토타입 기반 객체지향의 문법적 설탕이라는 평가를 받기도 한다. 물론 타입스크립트가 생기면서 인터페이스, 접근제어자 등이 사용가능해지며 객체 지향 프로그래밍을 더욱 편하게 할 수 있게 된 것은 사실이지만, 타입스크립트는 엄연히 자바스크립트를 기반으로 생성된 언어다. 이런저런 조건을 따져봤을 때, 자바스크립트 또는 타입스크립트로는 class 기반의 객체 지향 방식이나 디자인 패턴을 따르기가 쉽지 않다. 오히려 이런 형태를 완벽하게 따라하기 위해서 더욱 어렵고 불편한 코드를 작성해야 할 수도 있다.

내가 내린 결론

결국 내가 내린 결론은 타입스크립트로 객체 지향 프로그래밍을 하고 디자인 패턴을 쓰되, class 기반의 객체 지향 방식을 무조건적으로 따르려하지 말자는 것이다. 나는 매우 중요한 사실을 간과하고 있었는데, 객체 지향은 개념이고 프로그램을 표현하는 규칙일 뿐, 어떤 언어가 객체 지향언어라는 말은 잘못된 표현이라는 것이다 (나무위키 - 객체 지향 프로그래밍). 즉, 객체 지향은 특정 언어로만 할 수 있는 것이 아니다.

각각의 프로그래밍 방식은 자신만의 역할이 있다. 클린 아키텍처라는 책에서는 프로그래밍 패러다임들이 저마다 다른 것을 제한하는 역할을 한다고 했다. 객체 지향 프로그래밍이 함수형 프로그래밍을 대체할 수 없고, 그 반대도 마찬가지다. 그리고 어떤 하나를 쓴다고 해서 다른 하나를 쓰지 못하는 것도 아니다. 이 부분의 코드는 객체 지향으로, 저 부분의 코드는 함수형으로 작성할 수 있다.

객체 지향 프로그래밍도 함수형 프로그래밍도 결국은 더 읽기 쉬운 코드, 더 유지보수를 하기 쉬운 코드를 작성하기 위해 사용하는 것이다. 따라서 어떤 방식을 완벽하게 따라하는 것이 중요한 것이 아니라 그 개념을 내가 마주한 상황에 맞춰 필요한 형태로 사용하는 것이 현재로써는 옳은 방법이라고 판단된다. 함수를 일급객체로 다루는 타입스크립트의 특성을 사용하여 기존의 디자인 패턴에서 클래스를 사용하던 것을 함수로 구현할 수 있다. 또는 패턴에 설명된 모든 클래스를 구현하지 않더라도 일부 클래스를 구현해서 필요한 부분만 사용한다거나, 특정 상황에서는 (비슷한 문제라도) 디자인 패턴을 사용하지 않는게 좋은 방법일 수도 있다. 패턴을 사용하는 것보다 중요한 것은, 객체 지향 프로그래밍을 사용할 때 정말 객체 지향적으로 코드를 작성하고 있는지를 판단해야 하는 것이다. SOLID 원칙은 잘 지켜지고 있는지, 코드의 분리는 제대로 되었는지 등을 생각해야한다.

지금은 경력이 너무 짧다보니 좋은 선택을 할수는 없다. 하지만 나와 팀원들을 설득시킬 수 있는 코드를 짜보려고 노력해야한다. 이렇게 내가 작성하는 코드의 큰 그림을 보려고 의도적으로 의식하며 경험을 쌓아간다면 언젠가는 읽기 좋고 고치기 쉬운 코드를 작성하는 개발자가 될 수 있지 않을까?

profile
주니어 프론트엔드 개발자입니다 😎

0개의 댓글