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

 

최근에는 python의 django에서 벗어나 다른 언어와 프레임워크를 맛보고자 spring을 공부하기 시작했다. java의 spring framework가 웹 개발에 있어서는 가장 주된 프레임워크라서 참고자료도 많고, 배워두면 좋을 것 같아 spring을 택했다.

어떤 프로젝트에 어떤 프레임워크를 선택할지는 회사 내부 개발자들의 스펙, 프레임워크의 장점과 단점 또는 지향하는 바 등을 보고 고르게 되는 것 같다. 띠라서 spring이 가장 많이 쓰이는 이유도 java 개발자 풀이 제일 크고, 프레임워크가 완성도가 높아서인 것 같다. 프레임워크의 성숙도가 높아서 spring을 배우면서 좋았던 점은 "이런이런 상황이 닥쳤을 땐, 이렇게 하는데 보통 괜찮더라" 이런 가이드라인이 있어서 좋았다. django를 배우면서 약간 아쉬웠던 점은 validation을 model 단에서 할 수도 있고, serializer 단에서도 할 수 있고, 여러가지 방법 들이 있는데 너무 다양해서 어느 것을 선택할지가 많이 고민이 되었다.(요즘에는 거의 하나로 통일시키고 있지만)

아무튼 django로 개발을 하면서 어떤 view들을 만들 때 앞에서는 validation이나 authorization을 해야하고, 마지막에서는 pagination들을 해야하는 경우들이 많이 발생하는데 앞의 authorziation을 python의 decorator을 이용해서 개발을 했었다. 근데 spring을 배우면서 aop(aspect oriented programming)이라는 패러다임(?)을 보게 되었는데 이게 사실 python decorator 안에 wrapper 함수와 매우 비슷하더라. 근데 spring-aop 모듈은 그보다 더 나아가서 after, before, around 등으로 시점을 지정해줄 수도 있고, @annotation, bean과 같은 파라메터로 어떤 곳에서 쓸지도 한 번에 지정할 수도 있어서 놀라웠다.

특히나 intellij에서 spring-aop가 적용된 곳을 한 번에 볼 수 있게 해준다거나, 어떤 method에 지금 spring-aop가 적용되어 있다는 사실들을 보여준다거나 하는게 꽤나 편리하게 작용할 것 같았다. 이런 것들을 볼 때마다 intellij가 참 잘 만들어졌고, 왜 다들 intellij로 개발을 하는지 알 것 같았다.

+ Recent posts