일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Es
- 영어
- Linux
- Windows
- JavaScript
- AWS
- error
- MSSQL
- elasticsearch
- JS
- build
- Python
- logstash
- Kibana
- ssh
- nodejs
- API
- Ai
- docker
- ChatGPT
- mariadb
- 구글
- unity
- sample
- 설정
- s3
- MySQL
- 엘라스틱서치
- 유니티
- Today
- Total
가끔 보자, 하늘.
ORM 쓰지 마세요! 본문
fastAPI를 주로 사용하기에 Django를 거의 보지 않았는데 여기저기서 많이 쓰길래 한번 살펴보았다. 거기에 ORM도 많이들 사용하기에 그냥 odbc와 sp로 만들지 왜 속도도 좋지 않은데 이걸 왜 쓸까하는 마음에 같이 살펴보았다.
쓰지마! 좀 귀찮아도 RDBMS 좀 배우고 SQL 배워. 개발자라면 크게 어렵지 않아. ORM을 쓰던 ORM 할아버지를 쓰던 DB관리는 필요하고 관리가 힘들면 SaaS써. 요즘 다 Cloud 하나쯤은 쓰잖아(-_-;). DB 관리툴들도 요즘 너무 편하고 좋아. 그냥 간단한 툴 하나 배우는거랑 다르지 않아. ORM을 쓰던 SQL로 직접 만들던 쿼리, 인덱스, 뷰 개념 알아야 제대로 된 서비스 만들 수 있어. DB 관리자 있고 최적화 잘 해준다고?? 그럼 ORM을 왜 쓰는거야. SP 사용하면 리소스 비용도 저렴하고 속도도 좋아. injection 공격 조금만 조심하면 되. SP 사용하면 걱정할 필요도 없고. 다중 DB 지원이 필요한 때가 있을까?? 서비스중에 MySQL로 구축해서 MSSQL이나 Oracle로 변경하는 경우가 얼마나 있을까? 최적화 안할꺼야? 처리 속도 이대로 그냥 둘꺼야???
일단 처음이라 MySQL, Django의 ORM을 사용해봤다. 별도 설치도 필요없어서 바로 테스트 할 수 있었다. 하지만 시작부터 ... 두둥!
MySQL에서 Database는 생성해야 했다. 아예 ORM에서 DB 설치 및 사용자 계정 설정 빼고는 할게 없을 줄 알았는데 아니었음. 계정 설정하고 database 설정 후 python manager.py migrate를 실행하니 아래와 같은 관리용 테이블이 생성되었다.
처음이라 저 테이블들이 어떻게 관리될지 잘 모르겠지만 나도 모르게 기록되고 관리될 저 테이블들을 보니 머리가 어질어질하네 -_-; 어차피 용량은 크지 않겠지만 django_admin_log 테이블의 데이터들은 자동 삭제되지 않기 때문에 별도로 delete job을 만들어야 한다.
View 사용은 불가. raw sql을 이용해 생성한 후 model에서 연결은 가능하다.
Index는 다음과 같이 사용 가능하다.
# 단일 필드 인덱스 - db_index=True
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100, db_index=True)
birth_date = models.DateField()
# 다중 필드 인덱스 - Meta class에 추가 정의
from django.db import models
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
published_date = models.DateField()
class Meta:
indexes = [
models.Index(fields=['title', 'published_date']), # 복합 인덱스
]
# 유니크 인덱스
# unique_together 사용
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
published_date = models.DateField()
class Meta:
unique_together = ['title', 'author'] # title과 author의 조합이 고유
# UniqueConstraint 사용 - unique_together 속성이나 UniqueConstraint를 사용해 정의
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
published_date = models.DateField()
class Meta:
constraints = [
models.UniqueConstraint(fields=['title', 'author'], name='unique_title_author')
]
아무리 python 언어만으로 처리가 가능하다고는 하지만 DATABASE의 개념을 알아야하고 DB 관리자도 필요한데다가 ORM을 위한 러닝 커브도 존재한다.
DB 관리자가 있다면 쿼리를 제작 요청해서 작업하고 혼자 다해야 한다면 AI의 도움을 조금만 받으면 손쉽게, 더 좋은 결과물을 얻을 수 있다.
ORM이 무조건 나쁘다는건 아니다. 프로젝트 여건에 맞는 상황이 있을 듯 하지만 어차피 어떤 DB와 연결하느냐에 따라 학습 곡선이 필요하다. 그러니 더 좋은 결과물을 위해 RDBMS나 No SQL을 공부하는게 더 좋을 것 같다는 생각이다.
'개발 이야기 > 개발 및 서비스' 카테고리의 다른 글
Windows에서 https로 localhost 테스트하기(feat. React) (0) | 2024.04.19 |
---|---|
GPTs hack preventing (0) | 2024.01.16 |
Redis "... currently not able to persist on disk." 메세지 (31) | 2023.12.27 |
ReactJS 빌드 시 GENERATE_SOURCEMAP 옵션 (1) | 2023.12.15 |
ReactJS에서 Input 컴포넌트 controlled/Uncontrolled 차이 (0) | 2023.12.15 |