SQL은 왜 작성 하는가?

Yoo Young-mo
5 min readJan 22, 2017

--

이 글은 객체 지향 프로그래밍(이하 OOP)기반으로 데이터 저장소를 관계형 데이터베이스 사용하는 상황에서 SQL(Structured Query Language)을 작성하는 본질적인 이유를 이야기 하고자 한다.

객체 영속화(Persistence)와 패러다임의 불일치

애플리케이션을 개발 하다 보면 데이터를 장기간 보존해야 하는 경우가 많이 있다. 예를 들면 회계 애플리케이션에서 다루는 대부분의 데이터(인사/급여, 구매/발주 등등)는 애플리케이션이 종료 되거나 컴퓨터 전원이 나갔을 때에도 유지 되어야 한다. 이렇게 데이터를 보존하기 위해서 비휘발성 저장소에 저장하는 것을 영속화라고 한다. 영속화 되는 데이터는 OOP에서는 객체(Object)로 표현되고 다루어진다. 따라서 객체를 영속화 한다고 한다.

데이터 저장소로는 관계형 데이터베이스를 보편적으로 사용한다. 문제는 OOP(객체 모델l)와 관계형 데이터베이스(관계 모델)는 같은 데이터를 표현하고 다루는 방법이 차이가 발생한다는 것이다. 이를 패러다임의 불일치 또는 Object-relational impedance mismatch 라고도 한다. 이러한 불일치 요소가 여러가지가 있지만 주요한 두 가지 ‘연관 관계’와 ‘상속’을 살펴 보자.

연관 관계

객체 모델에서는 객체의 참조를 소유함으로써 연관 관계를 맺는다.

출처 : Pro JPA2
class Employee {// Address 참조private Address address;......}class Address {......}

하지만 관계 모델에서는 테이블의 외래키(Foreign Key)를 소유함으로써 연관 관계를 맺는다.

출처 : Pro JPA2

상속(Inheritance)

OOP에서는 상속을 명시적으로 지원 하며, Java 에서는 extends 키워드 사용하여 구현한다.

출처 : Pro JPA2
class Employee {......}class PartTimeEmployee extends Employee {......}class FullTimeEmployee extends Employee {......}

하지만 관계 모델에서는 상속을 명시적으로 지원하지 않으며, 아래와 같이 3가지 형태로 객체 모델의 상속을 표현할 수 있다.

출처 : Pro JPA2

©의 경우는 객체 모델의 상속과 비슷해 보이지만 이것은 관계 모델의 슈퍼 타입과 서브 타입이다.

“공통 속성을 가지는 슈퍼 타입과 공통 부분을 제외하고, 두개 이상의 엔티티타입간의 속성에 차이가 있을 때 별도의 서브 타입으로 존재할 수 있다. 이때 서브타입을 구분하는 형식에 따라 슈퍼타입의 특정 엔티티가 반드시 하나의 서브타입에만 속해야 하는 배타적 관계(Exclusive Relationship) 슈퍼타입의 특정 엔티티가 두개 이상의 서브타입에 포함될 수 있는 포괄적 관계(Inclusive Relationship)로 구분할 수 있다.” — 데이터베이스 설계와 구축

관계 모델의 슈퍼 타입과 서브 타입은 객체 모델의 상속과의 대표적인 차이점은 객체의 다형성(polymorphism)을 지원하지 않는다는 것이다.

SQL를 작성하는 이유

결국 SQL을 작성하는 행위는 객체 모델과 관계 모델 간의 페러다임의 불일치가 발생하기 때문에 이를 해결하기 위해서 관계 모델에 맞게 객체를 테이블에 매핑해 주는 것이다. 하지만 영속화 객체를 대상으로 하나 하나 SQL을 작성한는 것은 장점 보다는 단점이 많다.

규모가 작은 프로젝트에서는 구성원들이 SQL에 익숙하다면 별도의 학습 비용이 발생하지 않기 때문에 SQL을 직접 작성하는 것이 효율적일 수 있다. 하지만 대규모의 프로젝트에서 단순 CRUD(Create, Read, Update, Delete)를 반복적인 SQL 작성하는 것은 지루하고 생산성을 저하 시키는 원인이다. 그리고 특정 관계형 데이터베이스 종속적인 SQL을 사용하는 경우 성능 향상에 도움을 줄 순 있겠지만 다른 데이터베이스로 변경하는 경우 비용이 증가하게 된다.

객체를 SQL로 매핑하는 것을 자동화할 수 없을까?

이런 질문에 답이 ORM(Object-Relational Mapping)이다. ORM은 객체 모델을 관계 모델로 매핑을 자동화해 준다. 자동화해 준다는 것은 SQL을 ORM이 대신 만들어 준다는 의미이다. Java 진영에서는 JPA(Java Persistence API) 를 ORM 표준 인터페이스를 정의 하였고, JPA를 구현한 대표적인 ORM 프레임워크로는 Hibernate가 있다.

--

--