코딩과 결혼합니다

Mongoose와 Spring JPA 본문

2세/Nest.js

Mongoose와 Spring JPA

코딩러버 2024. 8. 19. 12:26
728x90

❔ Spring JPA / Mongoose

Spring JPA와 Mongoose는 각각  Java와 JavaScript 환경에서 데이터베이스와 상호작용을 위한 ORM 및 ODM 도구이다. 

 

기본 개념

  • Spring JPA : 주로 RDBMS에서 사용되며, SQL 기반의 데이터베이스와 상호작용한다. 엔티티와 테이블 간의 매핑을 통해 관계를 설정한다.
  • Mongoose : MongoDB와 같은 NoSQL 데이터베이스와 상호작용하며, JSON 기반의 문서를 처리한다. 스키마 정의를 통해 관계를 설정한다.

 

❔ 엔티티(스키마) 정의 및 관계 설정 

Spring JPA

  • @Entity :  JPA 엔티티 정의
  • 관계 매핑 : '@OneToX', '@ManyToX' 등의 어노테이션을 사용하여 관계 설정
  • 즉시 로딩 / 지연 로딩
//Post
    @OneToMany(mappedBy = "post", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private List<Comment> comments = new ArrayList<>();
    
//Comment
    @ManyToOne
    @JoinColumn(name = "post_id", nullable = false)
    private Post post;

 

Mongoose

  • @Schema : Mongoose 스키마를 정의
  • 관계 설정: ' Types.ObjectId' 를 사용하여 다른 스키마 참조
  • 지연 로딩 : 기본적으로 지연 로딩 방식으로 동작. 관계된 데이터를 가져오려면 'populate()' 사용
//Post extends Document
    @Prop({ type: [{ type: Types.ObjectId, ref: 'Comment' }] })
    comments: Types.ObjectId[];
    
//Comment extends Document
    @Prop({ type: Types.ObjectId, ref: 'Post', required: true })
    post: Types.ObjectId;
    
//관계된 데이터 가져오기
const postWithComments = await this.postModel.findById(postId).populate('comments').exec();

❔ 주요 차이점

  • 데이터베이스 구조
    • Spring JPA : 관계형 데이터베이스를 사용하므로, 테이블 간의 관계가 명확히 정의되고 외래 키 제약 조건을 통해 일관성을 보장한다.
    • Mongoose : NoSQL 데이터베이스로 MongoDB를 사용하므로, 데이터가 스키마리스 형식으로 저장될 수 있고, 명시적인 외래키 제약 조건이 없다. 대신, 참조 관계를 통해 데이터 무결성을 관리한다.
  • 지연 로딩 vs 즉시 로딩
    • Spring JPA : 로딩 전략을 명시적으로 설정할 수 있으며, 관계형 데이터 베이스에서의 성능 최적화가 중요한 역할
    • Mongoose : 기본적으로 지연 로딩이 사용되며, 필요할 때 populate()를 호출하여 데이터를 가져온다.
  • 관계의 유연성
    • Spring JPA  : 스키마가 엄격하게 관리되며, 복잡한 관계도 쉽게 정의할 수 있다. 하지만 스키마가 변경되면, 이에 따라 엔티티와 관계 설정도 변경되어야 한다.
    • Mongoose : 더 유연한 관계 설정이 가능하지만, 데이터의 일관성을 개발자가 더 많이 관리해야 한다.
  • 구현 방법 (쿼리 작성)
    • Spring JPA  : 복잡한 쿼리 및 관계 매핑은 JPA 쿼리 메서드나 JPQL
    • Mongoose : MongoDB의 쿼리 문법을 사용하여 관계된 데이터를 처리