ORM 데이터베이스 기초

7711 단어

목차


  • What is an ORM Database?
  • Query Builder
  • Identity Map
  • Unit of Work
  • Conclusion

  • ORM 데이터베이스란 무엇입니까?



    ORM 데이터베이스(Object Relational Mapping)는 애플리케이션이 지속성을 달성하도록 돕는 것과 관련이 있습니다. 지속성은 단순히 응용 프로그램의 데이터가 응용 프로그램 프로세스보다 오래 지속되기를 원한다는 의미입니다. 그러나 명시적으로 개체 관계 매핑은 프로그래밍 언어와 함께 사용되는 데이터베이스 데이터와 개체 간의 매핑을 달성하는 기술입니다.

    개체 관계형 매핑은 기본 개념을 통해 이 목표를 달성합니다.
  • 쿼리 작성기
  • 아이덴티티 맵
  • 작업 단위

  • 쿼리 빌더



    Query Builder는 여러 단계로 DQL(Domain Query Language) 쿼리를 구성하도록 설계된 API를 제공합니다. 프로그래밍 방식으로 쿼리를 작성할 수 있는 일련의 클래스 및 메서드를 제공합니다. 일반적으로 Query Builder API를 사용하여 쿼리를 빠르게 작성하거나 원시 DQL 언어로 작성하기 쉬운 더 복잡한 것이 필요한 경우 원시 DQL 언어를 사용할 수 있습니다.

    애플리케이션에서 다음SELECT 쿼리를 실행해야 한다고 가정해 보겠습니다.

    SELECT * FROM Users
    WHERE name='John';
    


    테이블에서 행을 선택하는 Query Builder API는 다음과 같을 수 있습니다.

    orm.select('*')
      .where({
        name: 'John',
      })
    


    대부분의 경우 사람들은 이것이 ORM의 정의라고 생각하지만, 앞으로 살펴보겠지만 ORM이 그렇게 정의되기 위해서는 두 가지 다른 기본 개념이 필수적입니다.

    아이덴티티 맵



    ID 맵은 단일 비즈니스 트랜잭션에서 데이터베이스에서 읽은 모든 개체의 레코드를 유지합니다. 객체를 원할 때마다 ORM은 먼저 해당 객체가 이미 포함되어 있는지 확인하기 위해 ID 맵을 확인합니다. 따라서 캐시 역할을 합니다.

    두 개의 서로 다른 개체에서 동일한 데이터베이스 레코드를 읽는 경우를 피하려면 ID 맵이 있어야 합니다. 이 경우 둘 다 업데이트하면 변경 사항을 데이터베이스에 올바르게 기록하는 데 시간이 많이 걸립니다.

    또한 동일한 레코드를 여러 번 읽으면 데이터베이스에 대한 원격 호출에 비용이 많이 들 수 있습니다. 따라서 동일한 데이터를 두 번 로드하지 않으면 데이터베이스에 변경 사항을 쓰는 심각한 문제를 방지하고 애플리케이션 속도를 높일 수 있습니다.

    몇 가지 자바스크립트 코드를 사용하여 실제로 적용해 보겠습니다.

    // Both queries return the same user
    const user1 = orm.select('*')
      .where({
        name: 'John',
          surname: 'Doe'
      })
    
    const user2 = orm.select('*')
      .where({
        name: 'John',
          surname: 'Doe',
        age: 27
      })
    
    // identity map in action
    console.log(user1 === user2) // true
    


    작업 단위



    작업 단위는 데이터베이스에 영향을 미칠 수 있는 비즈니스 트랜잭션 중에 수행하는 모든 변경 사항을 추적합니다. 완료되면 작업으로 인해 데이터베이스를 변경하기 위해 수행해야 하는 모든 작업을 파악합니다.

    데이터베이스에서 데이터를 가져오거나 가져올 때 변경한 내용을 추적하는 것이 기본입니다. 그렇지 않으면 해당 데이터가 데이터베이스에 다시 기록되지 않습니다.

    개체 모델을 변경할 때마다 데이터베이스를 변경할 수 있지만 이로 인해 매우 느리고 매우 작은 데이터베이스 호출이 많이 발생할 수 있습니다. 또한 전체 상호 작용에 대해 트랜잭션을 열어야 하는데, 이는 여러 요청에 걸쳐 있는 비즈니스 트랜잭션이 있는 경우 비실용적입니다.

    작업 단위가 어떻게 생겼는지 봅시다:

    const user1 = orm.select('*')
      .where({
        name: 'John',
          surname: 'Doe',
        age: 27
      })
    
    user1.age = 30;
    
    const user2 = orm.select('*')
      .where({
        name: 'Jane',
          surname: 'Doe',
        age: 25
      })
    
    user2.age = 32;
    
    // it will apply all the changes done in this unit of work
    // so user1 and user2 age will be updated in the database
    // using a single transaction
    orm.flush(); 
    


    일반적으로 변경 사항이 많은 경우 ORM은 하나의 대량 트랜잭션을 생성하지 않도록 여러 트랜잭션의 변경 사항을 일괄 처리해야 합니다.

    결론



    이 블로그 게시물에서는 데이터베이스 ORM의 기본 개념인 쿼리 작성기, ID 맵 및 작업 단위를 살펴보았습니다.

    확실히 ORM에는 데이터베이스와 쉽게 상호 작용할 수 있는 많은 기능이 있지만 이것이 주요 구성 요소입니다.

    다음 블로그 게시물을 기대해 주세요. 👀

    이 블로그 게시물이 마음에 드셨다면 Twitter에서 저를 팔로우하세요.

    좋은 웹페이지 즐겨찾기