BACKEND
언어별 백엔드 프레임워크 비교
안금장
2024. 1. 7. 22:32
Python 웹 프레임워크
Python 의 다양한 라이브러리 사용 가능 → 데이터, 머신러닝 관련 라이브러리가 다른 언어보다 제공이 잘 된다.
Django
- MTV (Model - Template - View) 패턴을 사용 → 역할에 따라 독립적으로 개발되기 때문에 유지보수가 수월하고 확장이 용이하다.
- 테스트 관련 라이브러리 제공
- Django ORM 을 이용하여 편리하게 데이터베이스 접근
- SQL 쿼리를 직접 사용하지 않고도 파이썬 객체를 사용해 DB 를 다룰 수 있다. → DB 종류에 의존하지 않음 → 추후 DB 가 바뀌더라도 유연하게 대처 가능
- 자체 Admin 페이지 제공
- 지속적인 업데이트
- 23년 12월에 Django 5.0 이 나올 만큼 개발자들이 지속적으로 업데이트를 해주고 있다. (물론 다른 프레임워크도..)
from django.test import TestCase
from myapp.models import Animal
class AnimalTestCase(TestCase):
def setUp(self):
Animal.objects.create(name="lion", sound="roar")
Animal.objects.create(name="cat", sound="meow")
def test_animals_can_speak(self):
"""Animals that can speak are correctly identified"""
lion= Animal.objects.get(name="lion")
cat= Animal.objects.get(name="cat")
self.assertEqual(lion.speak(), 'The lion says "roar"')
self.assertEqual(cat.speak(), 'The cat says "meow"')
# Python shell에서 실행
from myapp.models import Blog
from django.utils import timezone
# 새로운 블로그 생성
new_blog = Blog(title="My First Blog", content="This is the content of my first blog.", pub_date=timezone.now())
new_blog.save()
# 쿼리셋(데이터베이스 조회) 예시
all_blogs = Blog.objects.all()
# SELECT * FROM myapp_blog;
filtered_blogs = Blog.objects.filter(title__contains="First")
# SELECT * FROM myapp_blog WHERE title LIKE '%First%';
FastAPI
- API 문서 기본 제공
- 자체 비동기 프레임워크 사용 → NodeJS와 GO 와 대등할 정도의 높은 성능
- Starlette 이라는 자체 ASGI 를 기반으로 더 빠르게 처리 가능 (Django 에서도 사용 가능 하지만 일부 추가 설정 필요)
Flask
- 마이크로 프레임워크
- 기본 기능만 제공 → 구조나 기능을 자유롭게 설계 가능
Java 웹 프레임워크
- Java 언어 자체가 웹 어플리케이션 개발을 위해 나온 언어인 만큼 따로 설치 없이 Java 자체만으로, 정확히는 Java Servlet 만을 이용하여 웹 개발이 가능하다.
- 객체 지향 프로그래밍
- 객체 지향 언어인 만큼 설계를 탄탄히 잡고 개발이 가능하기 때문에 유지보수, 확장성 등이 월등히 뛰어나다.
- 객체 지향의 특징 (추상화, 캡슐화, 상속, 다형성) 이용 가능
- 다양한 Test 프레임워크 제공
- Junit, AssertJ 등 테스팅을 위한 프레임워크 및 라이브러리가 제공된다.
Spring
- MVC (Model - Controller -View) 패턴을 사용 → 역할에 따라 독립적으로 개발되기 때문에 유지보수가 수월하고 확장이 용이하다.
- POJO(Plain Olde Java Obejct) 프로그래밍 지향
- 순수 Java 만을 통해 객체 생성 → Java 와 Java 스펙에 정의된 기술만을 사용하여 객체 관리 → 단순한 코드 → 테스트, 디버깅 쉬움
- DI (Dependency Injection) : 의존성 주입
- 객체의 의존관계를 내부에서 결정하는 것이 아니라 객체 외부에서 결정한다.
- → 추후 의존관계가 바뀌더라도 (예를 들어 DB connection 을 Postgresql에서 mysql로 바꾸더라도) 내부 코드 변경 없이 외부에서 쉽게 바꿔줄 수 있다.
- AOP (Aspect Oriented Programming) 지원 : 어떤 로직을 기준으로 핵심적인 관점, 공통적인 관점으로 나누어 보고 그 관점을 모듈화
- 예를 들어 메소드 실행 시간 비교를 한다. 메소드 시작 전, 후에 time을 찍어주어 비교한다.
- 만약 메소드가 1000개 라면? 하나하나 다 찍어줘야겠지만 AOP를 통해 쉽게 해결 가능
- 예를 들어 메소드 실행 시간 비교를 한다. 메소드 시작 전, 후에 time을 찍어주어 비교한다.
- Spring Boot
- Spring 만을 사용하면 프로젝트 초기 설정이 몹시 복잡하다(라고 한다~).
- 내장 서버도 직접 설정해야 되었는데 Boot는 Tomcat 이라는 기본 내장서버를 지원해 준다.
- 프로젝트에 사용하는 의존성들을 Starter 패키지를 통해 제공하여 간편하게 추가할 수 있다.
web과 관련된 의존성을 설정하기 위해서는 위 사진에서 보이는 것 이상으로 많은 의존성을 버전까지 맞추며 직접 설정이 필요했으나 boot는 이것을 버전까지 직접 맞춰서 설정할 수 있게 해 준다.
- Spring JPA
- Django ORM 과 마찬가지로 Java에서 사용하는 ORM이다.
JavaScript 웹 프레임워크
Express.js
- 클라이언트 측에서 사용하는 언어를 그대로 사용 가능 하다
- 타입을 지정하지 않는 단점이 있었지만 타입스크립트로 커버 가능하다
- 다른 언어에 비해 빠르다
- 언어 자체가 비동기 처리를 위해 설계되었기 때문에 비동기 처리가 뛰어나다. (물론 지금은 다른 언어와 큰 차이 없다고 생각한다)
정리
데이터, 머신러닝 관련 라이브러리를 이용할 때는 Python 관련 프레임워크를 사용하자!
언어는 도구일 뿐, 웹 개발에 있어서 공통적인 지식을 가지는 것이 중요하다고 생각한다. 취향에 맞는 프레임워크를 사용하는 것이 좋다고 생각한다.