객체 지향이란❔ ORM이란❔

Seoyul Kim·2020년 7월 7일
0

Django

목록 보기
10/12

객체 지향 프로그래밍(OOP)

Object Oriental Programming

프로그래밍에서 필요한 데이터를 추상화시켜 상태와 행위를 가진 객체를 만들고 그 객체들 간의 유기적인 상호작용을 통해 로직을 구성하는 프로그래밍 방법

장점

  • 다른 사람이 만든 클래스를 가져와서 이용할 수 있고, 상속을 통해 확장해서 사용할 수 있기 때문에 코드 재사용이 용이하다.

  • 절차지향 프로그래밍에서는 코드를 수정해야할 경우 일일이 찾아 수정해야 하는 반면 객체 지향 프로그래밍에서는 수정해야 할 부분이 클래스 내부에 멤버 변수 혹은 메서드로 있기 때문에 해당 부분만 수정하면 된다.(프로그램을 유연하고 변경이 용이하게 만든다.)

  • 클래스 단위로 모듈화시켜서 개발할 수 있으므로 대형 프로젝트 개발이 필요할 시 업무 분담이 쉽다.(프로그램의 개발과 보수를 간편하게 만든다.)

  • 직관적이 코드 분석이 가능하다.

단점

  • 처리속도가 상대적으로 느리다.

  • 객체가 많으면 용량이 커질 수 있다.

  • 설계시 많은 시간과 노력이 필요하다.

객체 지향 프로그래밍 키워드

클래스와 인스턴스

  • 클래스 : 어떤 문제를 해결하기 위한 데이터를 만들기 위해 추상화를 거쳐 집단에 속하는 속성(attribute)과 행위(behavior)를 변수와 메서드로 정의한 것

  • 인스턴스(객체) : 클래스의 인스턴스로, 클래스에서 정의한 것을 토대로 실제 메모리상에 할당된 것으로 실제 프로그램에서 사용되는 데이터

  • 메서드(method) : 클래스로부터 생성된 객체를 사용하는 방법으로 객체의 속성을 조작하는데 사용된다.

추상화

  • 불필요한 정보는 숨기고 중요한 정보만을 표현함으로써 공통의 속성이나 기능을 묶어 이름을 붙이는 것이다.(객체들이 가진 공통의 특성들을 파악하고 불필요한 특성들을 제거하는 과정)

캡슐화

  • 목적 : 코드를 재수정 없이 재활용하는 것
    프로그램 코드에서 변수와 함수를 재활용하기에 분산되어 있기 때문에 재활용이 어려웠으나 캡슐화를 통해 관련된 기능과 특성을 한곳에 모으로 분류하기 때문에 재활용이 원활해졌다.
    객체지향 프로그래밍에서 기능과 특성의 모음을 클래스라는 캡슐에 분류해 넣은 것이 캡슐화이다.
    객체가 맡은 역할을 수행하기 위한 하나의 목적을 한데 묶으며 객체의 데이터를 외부에서 접근하지 못하게 막고, 함수를 통해서만 조작이 가능하게 하는 작업

상속

  • 부모클래스의 속성과 기능을 그대로 이어받아 사용할 수 있게하고 기능의 일부분을 변경해야 할 경우 상속받은 자식 클래스에서 해당 기능만 다시 수정하여 사용할 수 있게 한다.

    👉🏻 다중상속은 불가하다. 클래스의 상속 관계에서 혼란을 줄 수 있기 때문에 상속은 반드시 하나만 가능하고 필요에 따라 인터페이스를 사용할 수 있게 했다.

다형성

  • 오버라이딩이 가능하여 하나의 변수명, 함수명 등이 상황에 따라 다른 의미로 해석될 수 있다.

    ☑️ 오버라이딩 : 부모클래스의 메서드와 같은 이름 매개변수를 재정의 하는 것
    ☑️ 오버로딩 : 같은 이름의 함수를 어러개 정의하고, 매개변수의 타입과 개수를 다르게 하여 매개변수에 따라 다르게 호출할 수 있게 하는 것

ORM(Object relational mapping)이란❔

OOP를 사용하는데 제약받지 않고 RDBMS를 이용하기 위한 프레임워크로 클래스를 사용하는 객체 지향 프로그래밍과 테이블을 사용하는 관계형 데이터베이스간의 불일치를 ORM객체 간의 관계를 바탕으로 SQL을 자동으로 생성하여 불일치를 해결하는 것을 의미한다.

사물을 추상화시켜 이해하려는 OOP적 사고방식과 DataModel을 정형화하여 관리하려는 RDB 사이를 연결할 계층의 역할로 제시된 패러다임으로 RDB 모델을 OOP에 entity 형태로 투영시키는 방식

즉, 객체와 관계형 데이터베이스의 데이터를 자동을 매핑 해주는 것을 의미한다. (객체를 통해 간접적으로 데이터베이스 데이터를 다룬다.)

장점

객체 지향적 코드

  • 객체 지향적 코드로 인해 더 직관적이다
    • CRUD를 위한 긴 SQL문을 작성할 필요가 없고, SQL의 절차적 접근이 아닌 객체적인 접근으로 생산성을 높여준다.(선언문, 할당, 종료같은 부수적인 코드가 줄어든다.)
    • 각 객체(Model)별로 코드를 작성하여 가독성을 높여준다.

재사용, 유지보수에 용이

  • ORM을 사용하면 객체는 객체대로 설계하고, 관계형 데이터베이스는 데이터베이스 대로 설계하고 중간에서 ORM 프레임 워크가 매핑을 해주어 서로 의존성을 배제할 수 있고, 기존 객체와 독립적으로 작성이 되어있기 때문에 해당 객체들은 재사용이 가능하며 유지보수의 편리성이 증가한다.

DBMS(Database Management System) 종속성 하락

  • DBMS에 대한 종속성이 줄어든다.
    • 객체간의 관계를 바탕으로 SQL문을 자동으로 생성하고, 객체의 자료형 타입까지 사용할 수 있기 때문에 RDBMS의 데이터 구조와 객체 지향 모델 사이의 간격을 좁힐 수 있다.
    • 대부분의 ORM은 DB에 종속적이지 않으며, 개발자는 객체에만 집중할 수 있기 때문에 DBMS를 교체하는 극단적인 작업에도 비교적 적은 리스크와 시간이 소요된다.

👉🏻 종속성
프로그램 구조가 데이터 구조에 영향을 받는 것

👉🏻 RDB(Relational Database)
관계형 데이터 모델에 기초를 둔 데이터베이스로 데이터를 테이블 형태로 저장한다.
각 데이터 항목들은 행에 저장되고 항목의 속성은 열이라고 부른다.
☑️ 열(column) : 필드(field)라고도 부르며, 항목의 속성을 나타낸다. 필드마다 각각 정수, 텔스트 같은 데이터 유형을 정할 수 있다.
☑️ 행(row) : record라고도 부르며, 각 데이터 항목을 저장한다.
☑️ 스키마(schema) : 필드는 데이터 유형뿐 아니라 제약사항도 지정할 수 있는데, 이것을 스키마로고 부른다.(중복값을 해당 행에 저장할 수 없다거나, 반드시 값을 가져야한다는 조건)

단점

  • 완벽한 ORM만으로는 구현하기 어렵다.
  • 잘못 구현된 경우 속도 저하 및 일관성이 무너질 수 있다.
  • 자동으로 생성되는 쿼리 때문에 직접 SQL을 사용하는 것보다 복잡할 수 있다.
  • 프로시저가 많은 시스템에서는 ORM 객체 지향적인 장점을 활용하기 어렵다.

    👉🏻 프로시저
    특정 작업을 위한 프로그램의 일부로 함수와 같은 의미를 지닌다.

객체-관계 간의 불일치

클래스를 사용하는 객체 지향 프로그래밍과 테이블을 사용하는 관계형 데이터베이스간의 불일치는 다음과 같은 특성에서 일어난다.

세분성(Granularity)

경우에 따라서는 데이터베이스에 있는 테이블 수보다 더 많은 클래스를 가진 모델이 생길 수 있다.(User라는 Table이 Person, Address라는 클래스로 구분해서 생성하는 경우)

상속성(Inheritance)

RDBMS는 객체지향 프로그래밍 언어의 특징인 상속 개념이 없다.

일치(Identity)

RDBMS는 Primary key를 이용하여 동일성을 정의하지만 객체지향 언어는 객체 식별(a==b)과 객체 동일성(a is b)을 모두 지원한다.

연관성(Associations)

객체지향 언어는 방향성이 있는 객체의 참고를 사용하여 연관성을 나타내지만 RDBMS는 방향성이 없는 외래키를 이용해서 나타낸다.(객체 지향 언어는 쌍방향 참조시 각 객체가 서로를 참조할 변수를 지녀야 한다.)

탐색(Navigation)

객체지향 언어의 경우 객체간의 연결을 통해서 이동하며 탐색 및 순회하지만, RDBMS에서는 일반적으로 SQL문을 최소화하고 쿼리를 최적화하여 Join을 통해 여러 entity를 로드하고 탐색 및 선택한다.


[Ref]
https://jeong-pro.tistory.com/95
https://jins-dev.tistory.com/entry/ORMObject-Relational-Mapping이란-ORM-패러다임의-개념
https://geonlee.tistory.com/207

0개의 댓글