ORM은 "Object-Relational Mapping"의 약어로, 객체와 관계형 데이터베이스 간의 매핑을 의미한다. 관계형 데이터베이스는 테이블, 행, 열 등의 구조를 가지고 있고, 객체 지향 프로그래밍에서는 클래스, 객체, 상속 등의 구조를 가지고 있다. ORM은 이러한 두 가지 다른 데이터 모델 간의 간극을 줄이기 위해 사용된다.
ORM은 개발자가 객체 지향 언어를 사용하여 데이터베이스와 상호 작용할 수 있도록 도와준다. 객체와 데이터베이스 테이블 간의 매핑을 자동으로 처리하며, 개발자는 SQL 쿼리를 직접 작성하는 대신 객체에 대한 조작을 통해 데이터베이스와 상호 작용할 수 있다.
일반적으로 ORM은 언어나 프레임워크에 종속적일 수 있으며, 대표적인 ORM 도구는 Hibernate(Java), Entity Framework(.NET), Django ORM(Python), SQLAlchemy(Python), Sequelize(Node.js) 등이 있다. ORM을 사용하면 개발자는 데이터베이스와의 상호 작용을 추상화하고, 코드의 가독성을 향상시키며, 유지보수를 쉽게 할 수 있는 장점을 얻을 수 있다.
객체 간의 관계를 바탕으로 SQL문을 자동으로 생성하고, 객체의 자료형 타입까지 사용할 수 있기 때문에 RDBMS의 데이터 구조와 객체지향 모델 사이의 간격을 좁힐 수 있다. 객체에만 집중할 수 있기 때문에 DBMS를 교체하는 큰 작업에도 리스크가 적고 드는 시간도 줄어든다. 예들 들어 자바에서 가공할 경우 equals, hashCode의 오버라이드 같은 자바의 기능을 이용할 수 있고, 간결하고 빠르게 가공할 수 있다.
장고에서의 ORM 사용은 어떤 효과를 가져다줄까?
1. 객체 지향적 설계
Django ORM은 객체 지향적 설계에 기반하여 데이터베이스 테이블을 모델 클래스로 매핑합니다. 각 모델 클래스는 데이터베이스 테이블의 레코드와 대응되며, 모델의 속성은 데이터베이스의 열에 해당합니다.
2. 자동화된 매핑
모델 정의를 통해 데이터베이스 스키마를 자동으로 생성하고, 모델 인스턴스를 통해 데이터베이스 테이블과의 상호 작용이 가능합니다. 이를 통해 SQL 쿼리를 직접 작성하지 않아도 됩니다.
3. 쿼리셋(QuerySets)
Django ORM은 데이터베이스에서 데이터를 검색하고 조작하기 위한 강력한 쿼리셋을 제공합니다. 쿼리셋은 데이터베이스로부터 데이터를 가져오거나 필터링, 정렬, 제한하는 등의 다양한 연산을 수행할 수 있습니다.
4. 다양한 데이터베이스 지원
Django ORM은 다양한 데이터베이스 시스템과 호환되며, PostgreSQL, MySQL, SQLite, Oracle 등을 지원합니다. 이는 Django를 다양한 프로젝트에 유연하게 활용할 수 있도록 도와줍니다.
5. 모델 간의 관계
Django ORM은 모델 간의 관계를 표현할 수 있습니다. ForeignKey, OneToOneField, ManyToManyField 등을 사용하여 모델 간의 연관 관계를 정의하고 사용할 수 있습니다.
6.마이그레이션(Migrations)
Django는 데이터베이스 스키마 변경을 추적하고 적용하는 마이그레이션 기능을 제공합니다. 이를 통해 데이터베이스 스키마를 간편하게 업데이트하고 유지할 수 있습니다.
7.보안성
Django ORM은 SQL 인젝션과 같은 일반적인 보안 문제를 방지하기 위해 안전한 쿼리 매개 변수 사용을 장려합니다.
하지만 ORM이 만능은 아니고, 불필요한 때도 있다.
1. 복잡한 쿼리 사용 시
ORM은 간단하 CRUD 작업을 처리하는데 특화, JOIN/UNION과 같은 복잡한 쿼리를 작성해야 할 경우 직접 SQL을 사용하는 것이 좋다. 데이터베이스 엔진이 제공하는 특정 기능은 ORM이 지원하지 않을 수 있다.
2. 대량 데이터 처리
ORM은 객체 단위로 데이터를 처리하므로 대량의 데이터 처리에는 메모리 사용량이 증가하고, 성능 저하가 발생할 수 있다.
3. 최적화하기 어려운 쿼리
데이터베이스 스키마가 복잡하거나 ORM을 통해 최적화하기 어려운 쿼리인 경우에는 직접 SQL을 작성하는 것이 유리.
4. 데이터베이스 업그레이드 또는 마이그레이션
'Framework > Django' 카테고리의 다른 글
Django Template Engine은 무엇이고 어떤 기능을 제공합니까? (1) | 2023.12.18 |
---|---|
_meta (1) | 2023.12.17 |
reverse, reverse_lazy (0) | 2023.12.16 |
DRF manage.py 해석 (0) | 2023.10.31 |
DRF Serializer는 무엇이며, 어떤 기능을 수행합니까? (0) | 2023.10.11 |