TypeOrm / / 2024. 11. 8. 02:04

TypeOrm이 기본 개념

**TypeORM**은 Node.js와 TypeScript에서 객체-관계 매핑(Object-Relational Mapping, ORM)을 통해 데이터베이스를 쉽게 관리하고 조작할 수 있도록 도와주는 라이브러리입니다. ORM의 핵심은 객체 지향적 방법으로 데이터베이스와 상호작용할 수 있게 해주는 것이며, 이를 통해 SQL을 직접 작성하지 않고도 데이터베이스의 데이터를 관리할 수 있게 해줍니다.

TypeORM의 주요 기능과 역할

  1. 데이터베이스 테이블을 클래스 형태로 정의:
    • TypeORM을 사용하면 데이터베이스 테이블을 TypeScript 클래스 형태로 정의합니다. 즉, 테이블의 각 열을 클래스의 프로퍼티로 표현할 수 있습니다.
    • 예를 들어, **User**라는 테이블이 있다면 TypeORM에서 이를 User 클래스(엔티티)로 정의할 수 있습니다.
    @Entity()
    export class User {
        @PrimaryGeneratedColumn()
        id: number;
    
        @Column()
        name: string;
    
        @Column()
        age: number;
    }
    
  2. 객체와 테이블 간의 매핑 관리:
    • TypeORM은 객체 지향 프로그래밍에서 사용하는 클래스와 관계형 데이터베이스의 테이블을 매핑해줍니다. 이렇게 하면 객체의 속성으로 데이터를 다룰 수 있으며, TypeORM이 자동으로 SQL 쿼리를 생성하고 실행하여 데이터베이스와 상호작용합니다.
  3. SQL 쿼리 자동 생성:
    • TypeORM은 데이터베이스에 데이터를 삽입하거나 조회, 업데이트, 삭제할 때 필요한 SQL 쿼리를 자동으로 생성합니다. 따라서 데이터베이스 쿼리 작성에 대한 부담을 줄일 수 있으며, 코드가 간결하고 유지보수하기 쉬워집니다.
    • 예를 들어, 아래처럼 작성된 코드가 있을 때 TypeORM이 SQL 쿼리를 자동 생성해 실행합니다.
    const user = new User();
    user.name = "John Doe";
    user.age = 25;
    await repository.save(user);// SQL INSERT 쿼리를 자동으로 생성해 실행
    
  4. 데이터베이스 간의 호환성 제공:
    • TypeORM은 MySQL, PostgreSQL, SQLite, MariaDB, Oracle 등 다양한 데이터베이스를 지원하며, 이를 통해 특정 데이터베이스에 종속되지 않고 여러 데이터베이스와 호환되는 코드를 작성할 수 있습니다.
  5. 데이터베이스 관계 설정:
    • TypeORM은 엔티티 간의 관계 설정을 쉽게 할 수 있도록 해줍니다. 이를 통해 일대일, 일대다, 다대다 관계를 설정하고, 이러한 관계를 통해 객체 형태로 데이터를 조회하고 조작할 수 있습니다.
    • 예를 들어, **User**가 여러 **Post**를 작성할 수 있는 관계라면 아래처럼 작성할 수 있습니다.
    @Entity()
    export class User {
        @PrimaryGeneratedColumn()
        id: number;
    
        @Column()
        name: string;
    
        @OneToMany(() => Post, post => post.user)
        posts: Post[];
    }
    
  6. 마이그레이션 지원:
    • TypeORM은 마이그레이션 기능을 제공하여 데이터베이스 스키마를 손쉽게 관리할 수 있습니다. 스키마가 변경될 때마다 마이그레이션 파일을 생성해 데이터베이스의 구조를 업데이트할 수 있으며, 팀 프로젝트나 배포 시 스키마 변경사항을 반영하기에 매우 유용합니다.

TypeORM의 장점

  • 코드의 일관성 유지: 데이터베이스 조작 코드가 TypeScript 클래스와 메서드로 통일되기 때문에 유지보수가 용이하고 가독성이 높습니다.
  • SQL 작성 감소: 복잡한 SQL 쿼리를 작성할 필요 없이 메서드 호출로 CRUD 작업을 수행할 수 있습니다.
  • 데이터베이스 독립성: TypeORM이 다양한 데이터베이스를 지원하므로 데이터베이스에 종속되지 않고 프로젝트를 개발할 수 있습니다.
  • 객체 지향적 개발: 클래스와 데코레이터를 사용해 데이터베이스와 상호작용하기 때문에 객체 지향적 코드 스타일을 유지할 수 있습니다.

TypeORM의 단점

  • 복잡한 쿼리 성능 문제: 단순 CRUD에는 효율적이지만, 매우 복잡한 쿼리나 대용량 데이터 처리에는 성능 저하가 발생할 수 있습니다. 이럴 경우 직접 SQL 쿼리를 작성하거나 ORM과 병행해서 쿼리 빌더를 사용하기도 합니다.
  • 런타임 오버헤드: TypeORM이 메타데이터와 SQL 생성 등을 위해 추가적인 연산이 필요하기 때문에 런타임 오버헤드가 발생할 수 있습니다.

TypeORM을 사용하는 이유

TypeORM은 데이터베이스 작업을 더욱 효율적이고 생산적으로 만들며, 코드의 가독성과 일관성을 높여주기 때문에 많은 개발자들이 사용합니다. 특히 데이터베이스 작업이 빈번한 백엔드 애플리케이션에서 큰 도움이 됩니다. NestJS와 함께 사용할 때는 TypeORM의 데코레이터 기반 방식과 DI(의존성 주입) 패턴이 자연스럽게 맞물리며, 생산성을 높일 수 있는 점이 장점으로 작용합니다.

학원을 다닐때 스프링부트로 프로젝트를 진행하면서 JPA를 써보았는데


추가로,

비슷한점이 많았지만 세세한 부분은 조금씩 달랐습니다. 그래서 차이점을 정리해보았습니다.

**TypeORM**과 **JPA**는 둘 다 객체-관계 매핑(ORM) 라이브러리이지만, 사용하는 언어와 환경이 다르고 몇 가지 차이점이 있습니다. **JPA**는 Java 생태계의 표준 ORM이며, **TypeORM**은 Node.js 및 TypeScript 환경에서 사용하는 ORM입니다. 아래에서 두 ORM의 주요 차이점과 유사성을 살펴보겠습니다.

공통점

  1. ORM의 핵심 원리:
    • 두 라이브러리 모두 객체-관계 매핑을 지원하여 객체 지향 프로그래밍 언어와 관계형 데이터베이스 간의 상호작용을 쉽게 해줍니다.
    • 엔티티 클래스를 정의하고, SQL 쿼리 없이 데이터베이스의 데이터를 CRUD(생성, 조회, 업데이트, 삭제)할 수 있게 해줍니다.
  2. 객체와 데이터베이스 테이블 간 매핑:
    • 엔티티를 사용해 데이터베이스 테이블을 매핑하고, 데코레이터/어노테이션을 통해 컬럼, 기본 키, 외래 키 등을 정의합니다.
    • 관계 설정을 통해 객체 모델을 사용하면서 데이터베이스 내에서의 관계를 다루는 방식이 매우 유사합니다.

차이점

  1. 언어 및 환경
    • JPA는 Java 기반이며 Spring과 같은 Java 프레임워크에서 많이 사용됩니다. JPA는 표준 인터페이스로, 이를 구현한 Hibernate 같은 라이브러리를 주로 사용합니다.
    • TypeORM은 JavaScript와 TypeScript 환경에서 사용되며, Node.js 기반의 프레임워크(NestJS 등)와 함께 사용됩니다.
  2. 표준화 여부
    • JPA는 Java의 ORM 표준 인터페이스로 정의되어 있어, ORM 구현체(Hibernate, EclipseLink 등)를 변경해도 기본적인 코드는 그대로 사용할 수 있습니다.
    • TypeORM은 독립적인 ORM 라이브러리로, JavaScript와 TypeScript에 최적화되어 있으며, 표준화된 인터페이스가 아닌 자체적인 구현체입니다.
  3. 어노테이션 vs 데코레이터
    • JPA는 Java의 어노테이션을 사용합니다. 예를 들어 @Entity@Table@Column 등 Java 어노테이션을 통해 엔티티를 설정합니다.
    • TypeORM은 TypeScript의 데코레이터를 사용하며, @Entity@Column 등 데코레이터 구문을 사용해 테이블과 컬럼을 정의합니다. 구문은 비슷하지만 Java 어노테이션과 TypeScript 데코레이터는 다른 언어적 개념입니다.
  4. Lazy Loading 기본 지원 방식
    • JPA에서는 연관 관계 설정 시 FetchType.LAZY 옵션을 사용해 지연 로딩을 기본적으로 지원합니다.
    • TypeORM에서는 **Promise**를 통해 Lazy Loading을 구현하지만, 모든 관계에서 지원하지는 않으며, TypeScript에서 **Proxy**와 **Promise**를 활용하여 지연 로딩을 구현하는 방식이 다릅니다.
  5. Query 메서드와 Query Builder
    • JPA는 JPQL(Java Persistence Query Language)이라는 객체지향적 쿼리 언어를 지원하며, **Criteria API**와 NamedQuery 등의 다양한 쿼리 방식이 있습니다.
    • TypeORM은 **QueryBuilder**를 통해 SQL처럼 쿼리를 작성할 수 있으며, findfindOne 등 다양한 메서드를 통해 데이터를 조회합니다. Java의 **Criteria API**처럼 복잡한 쿼리 빌더도 제공하지만, JPA보다는 단순한 편입니다.
  6. 마이그레이션 지원
    • JPA는 기본적으로 마이그레이션을 직접 제공하지 않으며, Flyway 또는 Liquibase와 같은 별도의 라이브러리를 통해 마이그레이션을 관리합니다.
    • TypeORM은 마이그레이션 기능을 자체적으로 제공하며, CLI를 통해 스키마 변경사항을 추적하고 데이터베이스 스키마를 마이그레이션할 수 있습니다.
  7. 변경 감지
    • JPA에서는 **Persistence Context**라는 특별한 컨텍스트에서 엔티티를 관리하고, 데이터 변경 시 변경을 자동으로 감지하는 기능을 제공합니다.
    • TypeORM에서는 엔티티 매니저가 명시적으로 데이터를 저장하거나 업데이트해야 합니다. 즉, JPA처럼 자동으로 변경을 감지하는 기능은 없습니다.
  8. 엔티티 수명주기 관리
    • JPA에서는 @PrePersist@PostPersist@PreUpdate@PostUpdate@PreRemove, **@PostRemove**와 같은 콜백 메서드를 활용해 엔티티의 수명주기를 세밀하게 관리할 수 있습니다.
    • TypeORM도 유사한 엔티티 리스너를 제공하지만, JPA만큼 세밀하지는 않으며, 라이프사이클 이벤트가 다소 제한적입니다.
  9. 성능 및 대규모 데이터 처리
    • JPA는 대규모 엔터프라이즈 애플리케이션에 맞게 설계되어 대규모 데이터 처리에 최적화되어 있습니다. 따라서 Hibernate와 같은 JPA 구현체는 다양한 캐싱 및 최적화 옵션을 제공합니다.
    • TypeORM은 Node.js 환경에 맞춰져 있으며, 비교적 경량이기 때문에 대규모 트랜잭션 환경에서는 성능 문제가 발생할 수 있습니다. 캐시와 같은 추가 최적화 기능이 부족할 수 있습니다.

요약

  • JPA는 Java 생태계의 표준 ORM으로, 대규모 엔터프라이즈 애플리케이션과 Java 기반의 애플리케이션에 최적화되어 있습니다. 객체지향 설계를 강화하고 SQL 작성을 줄여주며, 강력한 성능 최적화 기능을 제공합니다.
  • TypeORM은 TypeScript/JavaScript와 같은 Node.js 환경에 맞춰져 있으며, 비교적 경량이기 때문에 중소형 애플리케이션이나 빠른 개발을 필요로 하는 애플리케이션에서 사용하기 적합합니다. 또한 NestJS와의 궁합이 좋으며, 비동기 처리를 통해 Node.js의 비동기 환경을 잘 활용할 수 있습니다.

이 두 ORM의 목적은 비슷하지만, 언어와 사용 환경에 따라 장단점이 나뉘므로 선택 시 이를 고려하는 것이 좋습니다.

'TypeOrm' 카테고리의 다른 글

TypeOrm Relationship  (0) 2024.11.09
TypeOrm Inheritance  (1) 2024.11.08
TypeOrm Embedded Entity  (0) 2024.11.08
TypeOrm 엔티티 옵션  (0) 2024.11.08
Typeorm 사용해보기  (1) 2024.11.08
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유