서버를 구성할 때 고를 수 있는 언어는 다양한데 각자 장단점이 있는 것 같다. java의 spring framework를 잘 쓰시는 분들이 워낙 많아서 특이사항이 없으면 spring을 고르는게 좋은 것 같지만 그래도 다른 언어의 프레임워크를 쓰면 좋을 만한 상황이 있는 것 같다. 그 중에 파이썬으로 구성하면 두 가지 상황에서 강점을 발휘한다.

python

1. 머신러닝, 데이터 사이언티스트와 같이 협업하기 좋다.
  머신러닝 개발자나 데이터 사이언티스트라면 파이썬에 익숙할 것이다. 그러면 머신러닝 개발자가 모델을 서빙하는 서버를 구축해야한다던가, 데이터 사이언티스트가 데이터 파이프라인을 만드는데 있어서 서버도 같이 본다던가, 그런 유도리있는(?) 개발이 가능하다. 협업이라고 하기엔 조금 이상한 것 같은데 아무튼 유연한 상황들이 있어서 좋은 것 같다. 그래서 머신러닝에만 집중하는 회사들은 파이썬으로 서버를 만드는 경우가 많은 것 같다.

2. 스크립트 언어답게 일회성으로 뭔가 만들어야 할 때 좋다.
  가끔은 일회성으로 해야 할 것들을 코드로 짜는 경우도 있는데 이럴 때 참 편한 것 같다. 컴파일도 프로젝트 생성도 필요없이 스크립트 짜서 뭔가 하게 하는 것도 좋은데 django 같은 경우에는 python manage.py shell < main.py 과 같이 django 내부에 정의되어 있는 모델, 함수들을 바로 쓸 수 있어서 편하더라. 컴파일 언어 같은 경우에는 batch나 내부에 따로 일회성 api를 짜야할 것 같은데 더 좋은 방법이 있는지는 잘 모르겠다.

그리고 뭐 바로바로 실행하면서 함수를 테스트할 수 있는 것도 좋은 점이긴 한데 그건 스크립트 언어들의 장점이니까 '파이썬'으로 서버를 구성했을 때의 장점은 아니다. 아무튼 쓰면 쓸 수록 귀여운 언어인 것 같다. 뭔가 개구쟁이 같은 느낌이다.

이제 막 배우는 단계다 보니 새롭게 느끼는 점이 많아서 기록해 놓고 싶어서 써본다. 

1. 컴파일러 때문에 실수가 많이 준다.
  이건 django -> spring이 아니라 python -> java에 해당하는 점. python을 쓰다보면 오타를 냈다던가, 1 * 5을 생각하고, 코드를 짰는데 테스트하다보면 '1'이 들어와서 '11111'이 반환되는 경우들이 생긴다. 근데 java를 쓰다보면 오타라던지 동적 타입 때문에 생기는 실수들이 매우 많이 준다.

2. spring을 사용해보면 제공되는 무언가가 굉장히 많다...
 이거는 장점이 될 수도, 단점이 될 수도 있는 것 같다. django를 가지고 개발할 때는 환경세팅할 때 고려해야할 것이 많지는 않았던 것 같다. 근데 spring을 가지고 개발할 때는 이 spring만을 위해서 제공되는 무언가들이 굉장히 많은 것 같다. spring이 발전해서 spring-boot가 생겨났다던지, spring-boot-initiatior라는 페이지가 있다던지, test 툴들도 선택지도 많고, java를 간편하게 개발하도록 lombok이 있다던지...
 근데 선택지가 많아서 뭐를 선택해야 하는지 구글링이나 고민도 해야하고, 빌드 툴도 gradle, maven이 있고, 더 나아가서 버전에 따라 문법도 달라지더라. 아무튼 spring, java의 생태계는 엄청 넓은 것 같다...

사족으로 오랫동안 django, python을 사용하다가 spring, java를 사용해보니 장점이 많이 보이는 것 같기도 하다. 근데 항상 새롭게 배우면 장점이 많이 보이고, 오랫동안 사용하면 할수록 단점들이 보이는 것 같다. 이런 걸 많이 경험해보면 어떤 상황에 어떤 걸 선택해야하는지 안목도 생기지 않을까 하는 생각이 든다 :) 

원래는 어떤 모델의 instance를 생성할 때 foregin key field가 있으면 .get()으로 객체를 가져와서 넣어주거나 serializer을 통해 넣어줘야했었다. 근데 최근에 일단 validation을 통과하지 못할 객체를 만들고, custom 전처리 함수를 통해 필드들을 전처리 후에 validation과 생성을 하고 싶은 상황이 생겼다. 근데 이 때 프론트에서 주는 데이터를 일단 instance에 넣고, 전처리 함수와 validation을 통해서 valid한 instance가 되게 하려는데 foreign key field가 integer가 아닌 model을 받아야 된다고 예외를 던져줘서 방법을 찾아봤더니

{foreign_key}_id라는 field가 따로 있어서 그 필드에 일단 integer을 넣고, 생성을 하게 하면 django model이 foreign key field에 {foreign_key}_id라는 걸 참조해서 model을 넣어준다. serializer을 통하지 않고, 객체를 따로 불러와서 넣어주지 않으면서 integer로 일단 필드값을 넣어주고 싶을 때 이 방법을 사용하면 괜찮을 것 같다.

'Programming' 카테고리의 다른 글

django를 쓰다가 spring을 쓰면서 느낀 점  (0) 2022.05.14
soft delete를 해보면서 느낀 점  (0) 2022.04.16
django의 transaction  (0) 2022.02.03
spring mvc vs. django mvc(mvt?) 패턴  (0) 2022.02.02
python decorator와 spring AOP  (0) 2022.02.01

spring이나 django를 쓰다보면 한 view에서 쿼리를 여러 번 날려야하고, 여러 개의 쿼리 중 어떤 부분이 잘못 되었을 때 모두 롤백을 해야하는 상황이 생긴다. spring에서 @transaction을 써서 처리할 수 있듯이 django에서도 transaction.atomic()과 같은 context를 쓰면 여러 개의 쿼리를 하나 즉, atomic이니까 더이상 나눌 수 없는 transaction으로 만들 수 있다.

django에서 model을 다룰 때 .save(commit=False)을 유용하게 쓰듯이 transaction.atomic()도 잘 사용하면 유용하게 쓸 수 있다.

아래 링크는 공식문서로 자세한 내용을 확인할 수 있다.(django 3.2)

https://docs.djangoproject.com/en/3.2/topics/db/transactions/

 

Database transactions | Django documentation | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

 

가끔 django와 관련된 글들을 보면 django가 mvc 패턴을 따르도록(?) 되어있다고 되어있는데 반은 맞고 반은 틀린 말 같다.

왜냐하면 동작하는 방식은 mvc 패턴이 맞는데 사용하는 단어들은 mvc패턴과 약간 다르기 때문이다. spring을 보면 mvc 패턴을 따르게 만들면 사용하는 클래스들의 이름도 model, view, controller다. 근데 django에는 controller가 없다. view도 그 view가 아닌 것 같다(!) django에서는 urls, views들이 합쳐져서 controller의 역할한다고 봐도 무방할 것 같다. 그리고 mvc pattern에서 view는 사용자가 보는 걸 지칭하는데 django에서는 template이 그 역할을 한다. 이런 것들이 django mvc라고 검색을 하면 mvt(model, view, template)라는 단어가 같이 등장하는 이유라고 볼 수 있을 것 같다.

또 django에서는 단순히 template가 view만을 대체하는 게 아니라 forms를 포함시킬 수도 있다. django rest framework가 아닌 순수한 django를 사용하게 되면 template를 만들 때 forms.py를 이용해서 form을 만듦과 동시에 validation을 수행할 수도 있다.특히 이걸 잘 다루기 위해서 jinja2라는 언어(?)를 알아두면 좋다. spring에서는 thymeleaf라는 모듈이 있듯이. 근데 백엔드 개발을 하다보면 오히려 이런 template 언어를 다뤄야할 때 어려움을 겪는 것 같다...ㅋㅋㅋ

+ Recent posts