- Today
- Total
Act99 기술블로그
[항해99 4주차 WIL] ORM & NoSQL vs SQL 본문
ORM 이란?
ORM이란 객체 관계 매핑 (Object Relational Mapping)의 준말이며, 우리가 OOP(Objec Oriented Programming) 에서 쓰이는 객체라는 개념을 구현한 클래스와 RDB(Relational DataBase) 에서 쓰이는 데이터인 테이블을 자동으로 매핑하는 것을 의미한다. 하지만 클래스와 테이블은 서로가 기존부터 호환가능성을 두고 만들어진 것이 아니기 때문에 불일치가 발생하는데, ORM 을 통해 객체 간의 관계를 바탕으로 SQL문을 자동으로 생성하여 불일치를 해결한다.
ORM을 사용하기 전에는 개발자가 개발을 위해 DB 에 접근하려면 SQL Query 문을 직접 만들었다.
하지만 SQL 문법을 알고 있어야 하며, 쿼리문 작성시간이 오래걸려 개발이 지체되는 문제가 발생하게 되었다. 또한 개발 코드와 DB 가 서로 종속되기 때문에 ORM이 등장하게 되었다.
ORM의 장점은 개발의 생산성 향상과 명확한 쿼리, DB 의존성 감소 등이 있다.
하지만 단점 역시 존재하는데, 튜닝에 어려움이 있으며, 복잡한 쿼리문 작성에서도 문제가 발생한다.
자바스크립트에서에서 가장 유명한 ORM은 TypeORM 인데, TypeORM 이란 타입스크립트와 자바스크립트용 ORM 이다.
// TypeORM 예시
connection.getRepository(CategoryPage)
.createQueryBuilder()
.where("category_id = :categoryId", { categoryId: 5 })
.andWhere("(show_at is null or show_at >= now())" )
.andWhere("(hide_at is null or hide_at <= now())" )
.orderBy("updated_at", "DESC")
.limit(1)
.getMany()
SQL 이란?
SQL이란 관계형 DB를 의미하며, 이를 사용하면 RDBMS에서 데이터를 저장, 수정, 삭제 및 검색을 할 수 있다.
관계형 데이터베이스에는 핵심적인 두 가지 특징이 있다.
1. 데이터는 정해진 데이터 스키마에 따라 테이블에 저장된다.
2. 데이터는 관계를 통해 여러 테이블에 분산된다.
데이터는 테이블 레코드로 저장되는데, 각 테이블마다 명확하게 정의된 구조가 있다. 해당 구조는 필드의 이름과 데이터 유형으로 정의된다.
따라서 스키마를 준수하지 않은 레코드는 테이블에 추가할 수 없다. 즉, 스키마를 수정하지 않는 이상, 정해진 구조에 맞는 레코드만 추가가 가능한 것이 관계형 데이터베이스의 특징 중 하나이다.
또한, 데이터 중복을 피하기 위해 관계를 이용한다.
하나의 테이블에서 중복 없이 하나의 데이터만을 관리하기 때문에 다른 테이블에서 부정확한 데이터를 다룰 위험이 없어지는 장점이 있다.
NoSQL 이란?
말 그대로 SQL (관계형 DB)의 반대이다.
즉, 스키마도 없고, 관계도 없다.
또한 스키마가 없는 상황에서 새로운 타입의 데이터가 추가될 때 제약 역시 없다.
NoSQL에서는 레코드를 문서라고 부른다.
SQL과의 핵심적 차이가 바로 여기서 발생하는데, SQL은 정해진 스키마를 따르지 않으면 데이터 추가가 불가능했지만, NoSQL에서는 다른 구조의 데이터를 같은 컬렉션에 추가가 가능하다.
문서는 Json 형태와 비슷하며, 관계형 데이터베이스처럼 여러 테이블에 나누어 담지 않고 관련 데이터를 동일한 컬렉션에 넣는다.
따라서 여러 테이블에 조인할 필요 없이 이미 필요한 모든 것을 갖춘 문서를 작성하는 것이 바로 NoSQL이다.
SQL과 NoSQL 중 무엇이 좋을까?
사실 둘 중 무엇이 좋냐는 질문보다는 상황에 따라 무엇을 쓸지가 더 좋은 말이 되겠다. SQL 스키마가 명확하기 때문에 데이터 무결성을 보장하며, 각 데이터를 중복없이 한번만 저장하기 때문에 주식데이터나, 행정관계도 및 자료 등 구분이 뚜렷한 데이터를 처리할 때 좋다. 하지만 유연성이 덜하며, 관계를 맺고 있어 조인문이 많은 복잡한 쿼리를 만들 수 있다. 또한 수직적 확장만 가능하기 때문에 약간의 제약이 존재한다.
NoSQL의 경우 스키마가 없어 유연하고 언제든 저장된 데이터를 조장하고 새로운 필드 추가가 가능하며, 데이터는 어플리케이션이 필요로 하는 형식으로 저장되기 때문에 데이터를 읽어오는 속도가 빠르다. 또한 수직 및 수평 구조의 확장이 가능해 어플리케이션이 발생시키는 모든 읽기 및 쓰기 요청이 가능하다. 하지만 NoSQL은 장점인 유연성으로 인해 데이터 구조 결정을 미루게 될 수 없다는 단점을 갖게 된다. 또한 데이터 중복을 계속 업데이트 시켜주어야하며, 데이터가 여러 컬렉션에 중복되어 있기 때문에 수정 시 모든 컬렉션에서 수행해야 한다.
따라서 SQL의 경우 변경될 여지가 없고 명확한 스키마가 사용자와 데이터에게 중요한 경우, 가령 앞서 말한 주식데이터나 행정자료 등의 구조가 뚜렷해야 되는 데이터의 경우 SQL을 사용하면 좋으며, 유연성이 필요한 경우, 가령 커뮤니티 블로그나 뿌리가 뻗어나아가야되는 데이터 등은 NoSQL 을 사용하는 것이 좋을 듯 하다.
'개발팁저장소' 카테고리의 다른 글
[클로저 & 프로토타입] - 클로저와 프로토타입에 대한 이해 (0) | 2022.02.09 |
---|---|
[TDZ(Temporal Dead Zone) 일시적 사각지대란?] (0) | 2022.02.09 |
항해99 3주차 / 웹 저장소 (feat. 토큰) (0) | 2022.02.01 |
항해99 3주차 / 토큰 기반 인증 (0) | 2022.02.01 |
항해99 3주차 / Callback & Promise (0) | 2022.02.01 |