카테고리 없음

[CS/기술면접] 데이터베이스 (Database)와 ORM(Object Relational Mapping)

보리시스템 2023. 4. 18.
데이터베이스 (Database)와 ORM(Object Relational Mapping)에 대해 설명해보세요.

 

  • [2023.04.21.금] 멘토링 (박세명 기술 멘토님)
    • typeorm N+1 문제
      • 객체로 만들면 가독성은 좋지만
      • 로우쿼리를 잘알면 굳이 orm을 쓸 필요가 있냐는 의견도
        • RDBMS의 단점이 유연하지 못하다는 것 (테이블 간 관계 설정 되어 있으면 한 테이블 삭제하려면 어떤 테이블은 삭제 안되고..) => 그래서 로우쿼리로 필요한 것만 JOIN해서 하면 문제가 없는

https://velog.io/@ypd03008/TypeORM-N1-%EB%AC%B8%EC%A0%9C

 

[TypeORM] N+1 문제

User는 N개의 Post를 가지고 있다. ( 1:N 관계 )사용자를 조회 했더니 (SELECT 1개)Post 조회를 N번 더 한다. (SELECT N개)총합 N+1 개의 조희 쿼리 발생가능한 적은 query를 날리기 위해 JOIN을 사용 하도록 한다

velog.io

 

1. 한마디 정리

데이터베이스는 데이터를 구성하고 저장하는 방법을 정의하는 시스템이며,
ORM은 객체 지향 프로그래밍 언어와 관계형 데이터베이스 간의 데이터 변환을 자동화하는 기술입니다.

 

2. 내가 생각한 꼬리질문

1) ORM을 사용하는 장점과 단점은 무엇인가요?

ORM(Object-Relational Mapping)을 사용하는 장점과 단점은 다음과 같습니다.

1. 장점
1) 생산성 향상
ORM을 사용하면 SQL 쿼리를 작성하지 않고도 객체를 이용하여 데이터베이스와 상호작용할 수 있으므로, 개발 생산성이 높아집니다.

2) 코드 재사용성
ORM을 사용하면 코드 재사용성이 높아지므로, 프로젝트의 유지보수 및 확장성이 좋아집니다.

3) 객체 지향적인 코드 작성
ORM을 사용하면 객체 지향적인 방식으로 코드를 작성할 수 있습니다. 이는 코드의 가독성과 유지보수성을 높여줍니다.

4) 데이터베이스 독립성
ORM을 사용하면 데이터베이스 종류에 상관없이 일관된 방식으로 데이터베이스와 상호작용할 수 있습니다.

2. 단점
1) 성능 저하
ORM은 SQL을 추상화하므로, 쿼리의 최적화가 어려울 수 있습니다. 또한 ORM의 캐시 기능을 이용하지 않으면 성능이 저하될 수 있습니다.

2) 학습 비용
ORM을 사용하려면 ORM 라이브러리에 대한 이해가 필요합니다. ORM 라이브러리마다 다양한 개념과 구조가 있으므로, 초기 학습 비용이 높을 수 있습니다.

3) 제약 사항
ORM을 사용하면 데이터베이스와 객체 간의 매핑이 자동으로 이루어지므로, 데이터베이스의 특성을 완벽하게 이해하지 않으면 제약 사항이 발생할 수 있습니다.

4) 복잡성
ORM을 사용하면 데이터베이스와 객체 간의 매핑이 자동으로 이루어지므로, 객체 모델과 데이터베이스 모델이 일치하지 않으면 복잡한 매핑 작업이 필요할 수 있습니다.

따라서 ORM을 사용할지 여부는 개발하는 애플리케이션의 특성과 데이터베이스 종류, 개발자의 스킬 등 다양한 요소를 고려하여 결정해야 합니다.

 

2) ORM을 사용하지 않고 데이터베이스를 사용했을 때의 장점과 단점은 무엇인가요?

ORM(Object-Relational Mapping)을 사용하지 않고 직접 데이터베이스를 사용하는 경우에는 다음과 같은 장단점이 있습니다.

1. 장점
1) 세밀한 제어
ORM을 사용하지 않으면 SQL 쿼리를 직접 작성하기 때문에, 개발자가 데이터베이스와 직접 상호작용할 수 있습니다. 이를 통해 개발자는 세밀한 제어를 할 수 있습니다

2) 높은 성능
ORM을 사용하지 않는 경우에는 개발자가 직접 SQL 쿼리를 최적화할 수 있습니다. 이를 통해 더 높은 성능을 얻을 수 있습니다.

2. 단점
1) 반복적인 작업
ORM을 사용하지 않으면 개발자가 직접 SQL 쿼리를 작성해야 하므로, 반복적인 작업이 많아집니다.

2) 유지보수성 저하
직접 SQL 쿼리를 작성하면, 데이터베이스 스키마가 변경될 때마다 SQL 쿼리를 모두 변경해야 합니다. 이는 유지보수성을 저하시키는 요인이 됩니다.

3) 객체 지향적인 코드 작성의 어려움
객체 지향적인 코드 작성을 위해서는 데이터베이스와 객체 간의 매핑을 수동으로 처리해야 합니다. 이는 개발자가 작성해야 하는 코드 양이 많아지며, 복잡도가 높아질 수 있습니다.

따라서, ORM을 사용하는 것이 데이터베이스 사용에 비해 보다 쉽고 편리하며, 객체 지향적인 코드 작성을 가능하게 해주는 것으로 인정되어 있습니다. 하지만, 데이터베이스 사용에 대한 직접적인 제어와 높은 성능을 필요로 하는 경우에는 ORM을 사용하지 않고 직접 데이터베이스를 다루는 것이 더 적절할 수 있습니다.

 

3) ORM을 사용하면 객체 지향적인 방식으로 코드를 작성할 수 있다고 했는데 무슨 의미인가요?

ORM(Object-Relational Mapping)은 객체와 관계형 데이터베이스 간의 매핑을 자동으로 처리해주는 기술입니다. ORM을 사용하면 객체 지향적인 방식으로 코드를 작성할 수 있습니다.

객체 지향 프로그래밍에서는 객체를 중심으로 코드를 작성합니다. 객체는 데이터와 해당 데이터를 처리하는 기능을 함께 포함합니다. 데이터베이스에서는 데이터와 해당 데이터를 처리하는 방법(쿼리)이 따로 존재합니다. ORM은 이러한 객체와 데이터베이스 간의 불일치를 해결하기 위해 객체를 자동으로 데이터베이스와 매핑해줍니다. 이를 통해 객체를 중심으로 코드를 작성할 수 있습니다.

예를 들어, 객체를 생성하고 이를 데이터베이스에 저장할 때, 일반적으로는 데이터베이스에 INSERT 쿼리를 작성하여 데이터를 저장합니다. 그러나 ORM을 사용하면 객체를 생성하고 저장하는 코드를 작성하면, ORM이 해당 객체와 데이터베이스 테이블을 매핑하여 INSERT 쿼리를 자동으로 생성하고 실행합니다. 이를 통해 코드의 가독성과 유지보수성이 향상되며, 객체 지향적인 코드를 작성할 수 있습니다.

 

4) ORM을 사용하면 데이터베이스와 객체 간의 매핑이 자동으로 이루어진다고 했는데 설명해주세요

ORM(Object-Relational Mapping)은 객체와 관계형 데이터베이스 간의 매핑을 자동으로 처리해주는 기술입니다. ORM을 사용하면 개발자가 직접 SQL 쿼리를 작성하지 않고, 객체를 데이터베이스에 저장하거나 조회할 수 있습니다.

ORM을 사용하면 개발자가 데이터베이스와 객체 간의 매핑을 수동으로 작성하지 않아도 됩니다. 대신, ORM이 객체와 데이터베이스 간의 매핑 정보를 가지고 있으며, 이를 바탕으로 데이터베이스와 객체를 자동으로 매핑합니다.

ORM은 보통 객체를 데이터베이스의 테이블과 매핑합니다. 객체의 필드는 데이터베이스의 컬럼에 매핑되고, 객체 간의 관계는 데이터베이스의 조인으로 표현됩니다. ORM이 제공하는 API를 통해 데이터를 생성, 조회, 수정, 삭제할 수 있으며, ORM이 자동으로 SQL 쿼리를 생성하고 실행합니다.

ORM을 사용하면 개발자는 SQL을 직접 작성하는 번거로움을 줄일 수 있으며, 객체 지향적인 코드를 작성할 수 있습니다. 또한, ORM은 데이터베이스와의 연결을 자동으로 관리하고, 보안성과 안정성을 높여줍니다. 하지만, ORM이 자동으로 생성하는 SQL 쿼리가 개발자의 예상과 다를 수 있으며, 성능이나 확장성 문제도 발생할 수 있습니다. 따라서, 개발자는 ORM을 사용할 때 성능과 확장성을 고려하여 적절한 ORM을 선택하고 사용해야 합니다.

 

5) Node.js에서의 ORM은 무엇이 있나요?

Sequelize
Sequelize는 Node.js에서 가장 인기 있는 ORM 라이브러리 중 하나입니다. MySQL, PostgreSQL, SQLite 등 다양한 데이터베이스와 호환됩니다. Sequelize는 Active Record 패턴을 기반으로 하며, 데이터베이스 테이블과 JavaScript 객체를 연결하여 CRUD 작업을 수행할 수 있습니다.

TypeORM
TypeORM은 TypeScript와 JavaScript를 지원하며, PostgreSQL, MySQL, MariaDB, SQLite, Oracle, MS SQL Server 등 다양한 데이터베이스와 호환됩니다. TypeORM은 Decorator 패턴을 기반으로 하며, Entity를 사용하여 데이터베이스 테이블과 JavaScript 객체를 매핑합니다.

Bookshelf
Bookshelf는 Node.js와 JavaScript를 지원하며, PostgreSQL, MySQL, MariaDB, SQLite 등 다양한 데이터베이스와 호환됩니다. Bookshelf는 Knex Query Builder를 기반으로 하며, 데이터베이스 테이블과 JavaScript 객체를 연결하여 CRUD 작업을 수행할 수 있습니다.

Objection.js
Objection.js는 Node.js와 JavaScript를 지원하며, PostgreSQL, MySQL, SQLite 등 다양한 데이터베이스와 호환됩니다. Objection.js는 Knex Query Builder를 기반으로 하며, 데이터베이스 테이블과 JavaScript 객체를 연결하여 CRUD 작업을 수행할 수 있습니다.

 

3. 스터디원 꼬리질문