- Spring Data, Object Mapping2024년 01월 07일
- starryeye
- 작성자
- 2024.01.07.오후06: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
다음글이전글이전 글이 없습니다.댓글