Jpa

ModelMapper & MapStruct

배고픈 징징이 ㅣ 2024. 1. 22. 15:48

1. 서론

ModelMapper와 MapStruct 둘다 객체 간의 매핑을 위한 Library이다.

 

2. ModelMapper

동시성 성능 이슈가 있다.

위의 이슈로 수천 TPS( Transaction Per Second )의 Reactive Model에서는 명확하게 병목현상이 나타났다 한다.

Runtime 시점에 Reflection을 사용한다.

간결한 코드 작성이 가능하다.

서비스의 여러 요청마다 각각의 DTO를 사용할 수 있다.

 

private final ModelMapper modelMapper;

....

List<MenuResponseDto> dtoList = 
    entityList
    .stream()
    .map(data -> modelMapper.map(data, MenuResponseDto.class))
    .collect(Collectors.toList());

 

3. MapStruct

Compile 시점에 코드를 생성하면서 타입이나 매핑이 불가능한 상태 등의 문제가 발생한 경우 컴파일 에러를 발생시킨다.

이로인해 상대적으로 Rumtime에서 안정성을 보장한다.

Compile 시점에 미리 생성된 코드를 사용하기 때문에 ModelMapper에 비해 처리속도가 압도적으로 빠르다.

하나의 서비스당 하나의 DTO를 사용해야한다.

 

 

CommonMapper.java ( MapStruct의 기본 메소드들을 명시한다. )

public interface CommonMapper<DTO, Entity> {
    DTO toDto(Entity entity);
    ArrayList<DTO> toDtoList(List<Entity> entity);
    Entity toEntity(DTO dto);
    ArrayList<Entity> toEntityList(List<DTO> dto);
}

 

 

MenuMapper.java ( CommonMapper를 상속받으면서 INSTANCE를 생성한다. 또한 DTO와 Entity를 명확히 설정 해준다.)

@Mapper(componentModel = "spring")
public interface MenuMapper extends CommonMapper<MenuResponseDto, Menu> {
    MenuMapper INSTANCE = Mappers.getMapper(MenuMapper.class);
}

 

 

MenuService.java

List<MenuResponseDto> dtoList = MenuMapper.INSTANCE.toDtoList(entityList);

 

반응형

'Jpa' 카테고리의 다른 글

Entity & Dto  (0) 2024.01.18
번외. QueryDSL & JPA  (0) 2023.01.19
5. 연관관계 매핑  (0) 2023.01.19
4. 엔티티 매핑  (0) 2023.01.19
3. 영속성(Persistence) 관리  (0) 2023.01.19