Easy Understanding

Web Framework(1) - 웹 프레임워크의 유형 비교(Spring, Express, Nest.js 등) 본문

Dev

Web Framework(1) - 웹 프레임워크의 유형 비교(Spring, Express, Nest.js 등)

appleg1226 2021. 7. 13. 15:07

최근에 Spring 프레임워크를 스터디하면서 웹 프레임워크 전반에 대해서 관심을 갖게 되었다.

 

현재 회사에서 사용하고 있는 프레임워크가 주로 공부한 Spring이 아닌 Node.js의 Nest.js인 데다가,
이전에 Django(Python), Gin(Go), Express.js(Node.js) 들을 사용해 보았기 때문에 이런 것들을 종합해서,

프레임워크 전반적으로 어떤 점들이 비슷하고 어떤 점들이 다른 지를 알아보고 싶어졌다.

 

그래서 앞으로 포스트에 다음을 정리해보려고 한다.

1. 웹 프레임워크의 두 가지 분류
2. 웹 프레임워크의 핵심 구성요소들

 

글을 쓰면서 참고한 프레임워크의 목록은 다음과 같다.

1. Spring(Java/Kotlin)
2. Express.js(Javascript/Typescript)
3. Nest.js(Typescript)
4. Armeria(Java/Kotlin)
5. Gin(Golang)
6. Django(Python)
(이외에도 Kotlin의 Ktor, Golang의 echo 등을 참고하였음)

 


웹 프레임워크의 두 가지 분류

웹 프레임워크는 다 각자의 특성이 완전히 똑같지는 않기 때문에,

이게 정확하게 여기에 속한다고 말하기는 좀 그렇다.

그렇지만 어느정도의 경향성이 있기 때문에 그에 따라서 분류를 해 보았다.

 


1. 완전관리형 프레임워크

여기에 속하는 프레임워크들은 '다 내가 하라는대로 해' 식의 특징을 가진다.

Spring, Nest.js, Django 같은 프레임워크가 포함된다.

영어 문서에서는 이런 프레임워크들을 'Opinionated Framework' 라고 부르기도 한다.

 

다양한 기능 제공

이 유형의 프레임워크들은 자신들이 제공하는 규칙이 확실히 정해져 있다.

Spring, Nest.js에서는 DI(Dependency Injection)을 제공해서 각 클래스들의 의존성을 관리한다.

또한 내부적으로 Container를 통해서 Object들을 Singleton으로 관리해서 사용하게 해 준다.

 

게다가 디렉터리의 구조, 클래스의 이름 규칙까지도 제시해준다.

보통 클래스의 이름에 Service, Controller, Repository 같은 것들을 붙이도록 하는 편이다.

 

Spring이나 Django에서는 View(또는 Template)까지도 렌더링 해주기도 하며,

그에 관련된 Template(예로 들면 Spring의 thymeleaf) 기술도 지원을 해준다. 

 

이외에도 굉장히 많은 규칙들과 기능이 존재하기 때문에,

개발자는 자유롭게 프로그램을 만들기 보다는,

정해진 규칙에 의해서 하라는 대로 코드를 작성하다보면 프로그램이 어느새 완성될 것이다.

 

다양한 라이브러리들의 지원

이런 프레임워크들은 외부 라이브러리나 모듈들도 자신들의 영역으로 Greedy하게 가져와 버린다.

아래는 Spring에서 제공하는 NoSQL 관련 모듈들이다.

웬만한 NoSQL과 관련된 라이브러리는 다 가져와서 본인들의 프로젝트에 넣어 버리는 것을 확인할 수 있다.

출처: start.spring.io

 

Spring Boot가 프레임워크들 중에서 스케일은 압도적으로 크다고 생각한다.

웬만한 오픈소스들은 다 스프링 생태계 안으로 들어와 있는 것을 확인할 수 있다.

Kafka, RabbitMQ 같은 Messeging Queue부터 시작해서,

MySQL 같은 RDBMS,

MongoDB, ElasticSearch 같은 NoSQL

서비스를 개발하는 데에 필요한 것들을 대부분 스프링 생태계 안으로 넣어 버렸다.

 

게다가 Spring Boot와 Initialzer 덕분에 라이브러리 버전 관리도 굉장히 쉽게 가능하다.

다른 프레임워크에서 라이브러리 버전 관리 때문에 고생하는 것을 생각하면, 이것도 큰 장점이다.

 

Nest.js 또한 Spring Boot와 크게 다르지가 않다.

Spring과 구조도 크게 다르지 않고, 동일하게 DI를 지원하는 프레임워크다.

Typeorm, Sequelize 같은 ORM도 Nest.js 내부적으로 지원해주어서 DB 사용하기가 굉장히 편하다. 

특히 GraphQL, gRPC 같은 기술을 지원해준다는 특징도 장점이다.

 

정리하자면

자유로운 구조, 원하는 라이브러리의 사용 등 본인이 역량이 있고 자유를 좋아한다면

이런 프레임워크를 좋아하지 않을 가능성이 크다.

 

반면 초보자의 경우에는 처음부터 끝까지 무엇인가를 직접 할 필요가 없기 때문에,

이런 프레임워크가 배우기가 오히려 쉽게 느껴질 것이다.

 

게다가 프레임워크가 책임지는 것들이 많다보니, 무거운 것이 확실히 느껴진다.

Spring의 경우 Compile 부터 시작해서, Spring Context를 설정하고 준비되기 까지의 시간이 짧지가 않다.

물론 언어적인 특징도 있겠지만, 긴 시간이 걸리고 무겁게 느껴지는 건 어쩔 수가 없다.

 


2. 미니멀리즘 프레임워크

Express.js, Gin 같은 프레임워크가 이에 포함된다.

최소한의 웹 프레임워크의 기능만 제공해주고 나머지는 사용자에게 맡기는 스타일의 프레임워크들이다.

이런 유형은 'Un-opinionated Framework' 라고도 불린다.

 

간단한 개발

이 프레임워크들은 딱 웹 요청만 처리하고, 추가로 약간의 기능만 가지고 있을 뿐이다.

그래서 단순하게 "hello"를 반환하는 'GET /hello' 라는 api만  만든다면,

꽤나 빠른 속도로 프로그램이 동작할 것이다.

 

자유로운 개발을 좋아하는 사람들, 그리고 무거운 개발 환경이 싫은 사람들에게는

이런 유형의 프레임워크가 딱이다.

 

자유로운 라이브러리 & 아키텍쳐의 사용

보안, DB, Messaging, Logging, Caching 등을 자신의 입맛에 맞는 라이브러리로 꾸밀 수가 있다.

 

또한 어플리케이션의 아키텍처에도 아무 제한이 없다.

본인의 역량에 따라서 정말 복잡하게 만들 수도 있고, 반대로 말도 안 되게 단순하게 만들 수도 있다.

(예를들면 app.use()에 모든 로직을 때려 넣는다던지...)

 

아마도 실력 있는 개발자들이라면 이런 것들에 있어서 노하우를 가지고 있지 않을까 한다.

 

단점

다만 모두가 스타일이 제각각이기 때문에 발생하는 문제가 다소 존재한다.

협업을 할 때, 각자의 코드 작성 스타일이 다르기 때문에 이를 하나의 Convention으로 통합하는 과정이 필요하다.

이런 것들을 미리 정해두지 않는다면, 각자의 개성 때문에 문제가 잦아질지도 모른다.

 

또한 라이브러리들 간의 버전 관리가 너무 어렵다.

갑자기 라이브러리를 업데이트를 해버리면, 동작하던 코드가 동작하지 않는 상황이 벌어질 수도 있다.

여러 라이브러리들 간의 의존성을 잘 알아야 한다는 점에서 전문 지식과 경험이 더욱 필요할 것이다.

 


사실 각 웹 프레임워크들을 한 쪽에 소속시키기가 어렵기는 하다.

각 프레임워크들들은 본인들의 철학에 맞게 많은 기능들을 넣기도 하며, 때로는 빼기도 한다.

그래서 대부분은 두 유형 사이 어딘가에 존재할 것이다. 

 

또한 어떤 것이 더 좋은 프레임워크냐에 대한 의견은 이 글에서는 가지고 있지 않다.

각자 나름의 장단점이 존재한다고 생각한다. 

필요에 따라, 또는 취향에 따라 그 기술을 고민하여 결정하는 것이 제일 좋다고 생각한다.

(결국은 다 써보게 된다고 생각한다.)

 

개인적으로는 첫 번째 유형인 완전관리형 프레임워크를 좋아한다.

아무래도 입문부터 사용했던 프레임워크기도 하고,

그 방대한 프레임워크 코드 자체에 대한 경외심도 느껴지는 것 같다.

 

다만 어떤 프레임워크라도 사용해야 할 일이 생긴다면 기꺼이 사용할 준비가 되어 있다.