면접준비를 하면서 배웠던 객체지향적 프로그래밍과 그 패러다임에 맞는 ORM에 대해서 적어보겠다.
영어로 물질 혹은 물체 지향적은 프로그래밍의 번역형태를 객체라고 부르는 것 같다. 즉, 프로그래밍을 물체의 형태로 만들어서 하겠다는 것이다. 컴퓨터(혹은 프로그래밍으로 제어할 수 있는 모든것) 제어하는 프로그램을 짜는 것을 좀 더 인간이 구조화 시키고 이해하기 쉽게 만들기 위한 프로그래머들의 노력의 결과물인 것 같다.
예를들어 '나' 라는 사람은 눈이두개, 코가한개, 입이한개라는 특징을 가진다. 그리고 밥을먹을 수 있고, 숨을 쉴 수 있고, 사물을 볼 수 있다. 이처럼 우리가 생각하는 물체는 특징을 가지고 그 물체가 할 수 있는 행위가 있다(이거는 정의하기 나름이다).
학생이 학교에 가는 프로그램을 객체지향에 맞게 만들어보자
우선 학생이라는 객체, 학교라는 객체가 있을 것이다.
(객체지향을 설명하기 위해서 든 예시인 만큼 설명적인 관점에서 이해해 주길 바람)
class Student:
[1] def __init__(name, student_number, class):
self.name = name
self.student_number = student_number
self.class = class
[2] def go_school():
[2-1] self.name .......
self.student_number .....
self.class .....
return 'success'
class School:
[3] def _init_(name, location, ....)
self.name = name
self.location = location
def teach():
return 'teach'
[4] student_1 = Student('james', 1234,'3-2')
[5] school_1 = School('daeryun', 'Seoul...')
[6] student_1.go_school
[7] school_1.teach
우선 Student라는 클래스를 만들어서 학생을 정의해준다. 그 학생은 이름, 학생번호, 반 등이 있을 것이고 '학교를 간다'라는 행위를 할 수 있을 것이다. 여기서 행위(동사)를 추가한다면 '밥먹기' 등이 있을 수 있다(뭘 추가할지는 개발자 마음)
그리고 School이라는 클래스를 만들어 학교를 정의해준다. 학교는 학교이름, 위치 등의 고유한 특성을 가질 수 있을 것이다.
마지막으로 [4], [5]를 통해서 클래스에 특정한 학생, 특정한 학교를 부여해주는 작업을 한다. 클래스는 학교와 학생 그 자체를 뜻하고, [4]와 [5]에서 정의한 학생과 학교는 구체적으로 학교와 학생에 속성을 부여해 주었다.
이제 구체적인 학교와 학생이 만들어졌고 [6], [7]에서 만들어진 구체적 학교와, 학생에 해당된 행위를 실행할 수 있다.
그렇다면 여기서 student_1의 이름에 해당하는 'james'라는 데이터에 접근하기 위해서는 어떻게 해야할까?
student_1.name
을 통해서 'james'라는 이름 데이터에 접근할 수 있다. [4]에서 정의된 하명의 학생은 그 변수(student_1)을 통해서만 접근이 가능하다.
우선 orm은 sql쿼리를 코드 영역에서 객체지향에 맞게 구현하고 그것을 sql쿼리로 mapping시켜주는 기술이다.
Django의 orm과 Flask의 pymysql을 사용하면서 orm과 로우쿼리의 장단점을 체감하면서 왜 ORM이 등장하게 되었을 까 생각해 보았다.
우선 관계형 데이터베이스와 프로그래밍은 그 목적이 다르다.
데이터베이스(RDB를 가정하고 설명)는 어떻게 데이터를 효율적으로 저장하고 빠르게 데이터를 읽어올 수 있도록 하는 것이 가장 큰 목표를 가지고있다.
반면, 프로그래밍은 어떻게 효율적으로 시스템을 제어하고 구현 된 기능을 유지보수 하는 목표를 가지고 있다.
프로그래머는 프로그래밍을 하면서 데이터베이스에 있는 데이터를 가져와야한다. 하지만 개발의 특성상 데이터베이스에 있는 데이터를 CRUD하는 일이 개발의 많은 부분을 차지하기 때문에 SQL로우쿼리와 프로그램의 비즈니스 로직이 공존하게 되고, 프로그래밍 자체가 SQL 쿼리 위주로 작성되는 경우가 많다.
프로그래머는 프로그래밍은 객체지향적으로 하고, 데이터베이스와 소통은 SQL쿼리를 사용하는, 두가지를 신경써야 한다.
ORM은 개발자가 객체지향적으로 데이터베이스를 제어(CRUD)하면 좀 더 효율적으로, 더 객체지향적으로 프로그래밍을 할 수 있지 않을까 하는 필요성에 의해 등장했다.
위에서 설명한 바와 같이 테이블을 하나의 물체(object)로 두고 리소스를 CRUD한다.
하지만 분명 단점도 존재한다.
- 개발자가 객체지향적으로 코드를 짜면 orm이 알아서 sql쿼리를 작성하기 때문에 개발자가 직접 작성하는 것 보다 쿼리 효율이 떨어질 수 있다.
- 복잡한 쿼리의 경우 orm을 통해서 가져오지 못하는 경우가 존재할 수 있다.
장단점이 있기 때문에 프로젝트의 특성에 맞게 사용하는 개발자의 센스가 필요하다