티스토리 뷰

MapStruct

소개

DTO<->Entity간 객체 Mapping을 편하게 도와주는 라이브러리
비슷한 라이브러리로ModelMapper가 있습니다.

ModelMapper는 변환과정에서 리플렉션이 발생합니다.
MapStruct는 컴파일 시점에 구현체를 만들어내기 떄문에 리플렉션이 발생하지 않아 보다 빠릅니다.

간단하게 Gradle 프로젝트로 구성

1. add dependency

  • build.gradle
plugins {
    id 'java'
}

ext {
    mapstructVersion = '1.4.2.Final'
    lombokVersion = "1.18.12"
}

group 'io.alxndr'
version '1.0-SNAPSHOT'

repositories {
    mavenCentral()
}

dependencies {
    // 순서 주의!
    // Lombok 사용시 MapStruct가 먼저오게 작성해야함
    implementation "org.mapstruct:mapstruct:${mapstructVersion}"
    compileOnly 'org.projectlombok:lombok-mapstruct-binding:0.2.0'
    compileOnly group: 'org.projectlombok', name: 'lombok', version: "${lombokVersion}"
    annotationProcessor "org.projectlombok:lombok:${lombokVersion}"
    annotationProcessor "org.mapstruct:mapstruct-processor:${mapstructVersion}"

    // If you are using mapstruct in test code
    // testAnnotationProcessor "org.mapstruct:mapstruct-processor:1.4.2"

    testCompile group: 'junit', name: 'junit', version: '4.12'
}

2. Create Test Dto and Model

  • Person.java
//@Entity
@Builder
@Getter
@AllArgsConstructor
@NoArgsConstructor
public class Person {

    private Long id;

    private String name;

    private String email;

    private String birth;

    private String group;

    private LocalDateTime creationDate;
}
  • PersonDto.java
@Builder
@Getter
@AllArgsConstructor
@NoArgsConstructor
public class PersonDto {
    private Long id;

    private String name;

    private String email;

    private String birth;

    private String team;

}

Person은 Entity 역할을한다.

3. Mapper 정의

@Mapper
public interface PersonMapper {
    PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);

    /**
     * @return {@link Person}
     */
    @Mapping(target = "id", ignore = true)  // 1 
    @Mapping(source = "team", target = "group") // 2
    @Mapping(target = "creationDate", expression = "java(java.time.LocalDateTime.now())")   // 3
    Person toEntity(PersonDto personDto);

    @Mapping(source = "group", target = "team") // 4
    PersonDto toDto(Person person);
}
  • toEntity(): Dto => Entity로 변환
  • toDto(): Entity => Dto변환
  1. DTO에서Entity로 변환시 ID는 제외
  2. DTO.team을Entity.group으로 매핑
  3. Entity.creationDate는LocalDateTime.now()로 초기화
  4. Entity.group은DTO.team매핑

Mapper를 만든 후 Project Build를 한번 해준다.

이미지 처럼 MapperImpl이 생긴것을 확인할 수 있다.

5. TEST

  • PersonTest.java
public class PersonTest {

    @Test
    public void dtoToEntity() {
        PersonDto personDto = PersonDto.builder()
                .id(1L)
                .name("Alexander Choi")
                .email("dev.alxndr@gmail.com")
                .birth("1995-01-01")
                .build();

        Person person = PersonMapper.INSTANCE.toEntity(personDto);

        assertEquals(personDto.getEmail(), person.getEmail());
        assertEquals(personDto.getTeam(), person.getGroup());
    }

    @Test
    public void entityToDto() {
        Person person = Person.builder()
                .id(1L)
                .name("Alexander Choi")
                .email("dev.alxndr@gmail.com")
                .birth("1995-01-01")
                .build();

        PersonDto personDto = PersonMapper.INSTANCE.toDto(person);

        assertEquals(personDto.getEmail(), person.getEmail());
        assertEquals(personDto.getTeam(), person.getGroup());
    }
}

전체코드는 아래 깃헙에서 확인하실 수 있습니다.
깃헙!

References

'Dev > Java' 카테고리의 다른 글

[JAVA] 문자열이 Base64 인지 확인하는 방법 (정규표현식)  (0) 2020.08.24
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함