• 티스토리 홈
starryeye
  • 프로필사진
    starryeye
    • 분류 전체보기 (189)
      • C++ (17)
      • Java (24)
      • OOP (5)
      • Spring Reactive Stack (12)
        • Reactive Streams (3)
        • Netty (4)
        • Reactor (1)
        • Webflux (3)
        • DB, Cache 연동 (1)
      • Spring (90)
        • Core (17)
        • MVC (33)
        • Client (2)
        • Security (4)
        • DB, Cache 연동 (33)
      • DataBase (12)
        • RDBMS (2)
        • NoSQL (10)
      • Message Broker (6)
      • Web (4)
      • Network (4)
      • 대규모 시스템 설계 (15)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • Spring Data, Object Mapping
        2024년 01월 07일
        • starryeye
        • 작성자
        • 2024.01.07.:13
        반응형

         

        R2dbc (Reactive Relational Database Connectivity), MongoDB 등에서 사용하는

        Spring Data 의 기본적인 객체 매핑의 방법을 알아보겠다.

        다양한 data store 에서 공통적으로 사용하는 방법이지만, 구현체 별로 다를 수 있다.

         

        참고로..

        1. JPA(Jdbc) 는 Reactive Stack 에서 사용이 불가능 하여 R2dbc 가 나온 것이므로 헷갈리지 말 것.

        2. JPA 는 앞으로 소개할 Spring Data 의 기본 Object mapping 과 좀 다르게 사용할 것을 권장 하므로 엮어서 생각하지 말 것.

         

         

        Object Mapping 은 크게 두 단계로 이루어진다.

         

        1. Instance creation (Object creation)

        2. Instance population (Property population)

         

        두 단계를 하나씩 알아보자..

         

        Object creation

        객체 생성 단계이다.

         

        객체 생성 단계에서는 다음 우선 순위에 따라 하나를 택해서 객체를 생성하게 된다. 

        (Target 에 대한 Custom converter 는 없다고 가정)

         

        1. @PersistenceCreator 어노테이션이 달려있는 단일 static factory 메서드가 있다.

        -> 있으면 해당 메서드로 객체 생성

         

        2. 단일 생성자가 있다.

        -> 있으면 해당 생성자로 객체 생성

         

        3. 여러 생성자가 있는데 그 중 하나에 @PersistenceCreator 어노테이션이 달려있는 생성자가 있다.

        -> 있으면 해당 생성자로 객체 생성 (@PersistenceCreator 가 여러군데 있다면 line 기준으로 마지막이 사용됨)

         

        4. Java record 타입이 Target 이다.

        -> canonical 생성자로 객체 생성

         

        5. 여러 생성자가 있는데 그 중에 no-argument 생성자가 존재한다.

        -> no-argument 생성자로 객체 생성

         

         

        주의 사항

        생성자의 파라미터 이름은 프로퍼티 이름과 동일하게 셋팅해주자.

        다르게 해야할 필요가 있다면, @ConstructorProperties 를 활용해보도록 하자.

         

         

        Property population

        속성 채우기 단계이다.

         

        Object creation 단계에서 생성자 파라미터로 채워지지 않은 속성들을 채우게 된다.

         

        가장 먼저 identifier property 가 먼저 채워지고

        @Transient 필드 제외하고 나머지 필드를 채운다.

         

        프로퍼티를 채우는 방법에 대한 우선 순위는 다음과 같다.

         

        1. property 가 immutable 할 때, with{property name}() 메서드가 존재

        -> withXXX() 메서드 리턴 타입은 Target 객체이며 new 로 새로운 instance 를 만들어 리턴한다.

        -> 보통 identifier property 에 해당한다. (data store 에서 id 를 할당)

        entity 를 insert 할 때 id 값은 null 이고 리턴 객체는 withId 로 채워서 새로운 객체가 리턴된다.

        -> immutable 이면서, All-argument 생성자를 만들어 놓으면 withXXX() 가 없어도 된다.

         

        2. Setter 메서드가 존재

        -> Setter 메서드로 속성을 채운다.

         

        3. mutable property 이면, reflection 을 사용하여 direct(동일한 엔티티) 로 채운다.

         

         

        정리

        Spring Data 에서는 여러 우선 순위에 의해서 Object 가 Mapping 된다..

        일반적으로 추천하는 방법을 알아보자..

         

        1. Object creation 단계에서 property 를 함께 할당하도록 한다.

        property population 에서 속성을 할당 할 경우 성능이 30% 느려진다.

        따라서, final 키워드까지 사용하여 immutable 객체로 만들어 immutable 장점까지 취해보자.

         

        2. All-argument 생성자를 만들자.

        mutable property 가 있거나, all-argument 생성자를 쓰고 싶지 않아도 일단 쓰면

        property population 단계를 건너 뛸 수 있으므로 성능상 이점이 있다.

         

        3. static factory 메서드를 사용하여 실제 application 에서 사용할 다양한 생성자를 제공하자.

         

        4. All-argument 생성자를 사용하거나, withXXX() 메서드를 사용하자

        final identifier property 를 data store 에 의해 자동으로 생성할 수 있도록 도와준다.

         

        5. lombok 을 사용하면 boilerplate 코드를 줄여준다.

         

         

         

         

         

        Spring Data Common, Object mapping fundamentals

        https://docs.spring.io/spring-data/commons/reference/object-mapping.html

        아래는 Spring Data R2dbc, MongoDB Object mapping 이지만 Common 과 동일한 가이드를 한다.

        https://docs.spring.io/spring-data/relational/reference/object-mapping.html

        https://docs.spring.io/spring-data/mongodb/reference/mongodb/mapping/mapping.html

        반응형
        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바