[ Spring ] ModelMapper를 통해 Entity와 Dto를 변환하자

신범철·2023년 4월 30일
0

스프링부트

목록 보기
11/24

Mapper의 기능

Entity <-> Dto mapping convering을 해주는 기능이다.

map()메소드를 통해 Entity와 DTO의 변환을 자유롭게 해준다.

사용법

build.gradle 등록

	implementation 'org.modelmapper:modelmapper:2.4.2'
    

사용처

Service Layer, DTO, Entity에서 사용가능하다.

하지만 Service Layer에서 사용하는 것은 모든 서비스에서 객체를 사용할때마다 mapper의 중복이 발생하니 지양

Entity나 DTO에서 사용하는 것이 옳다.
DTO가 일반적

Service Layer에서 사용

private final ModelMapper mapper//생성자 주입

private CommentDto mapToDto(Comment comment) {
/*        return CommentDto.builder()
                .id(comment.getId())
                .name(comment.getName())
                .email(comment.getEmail())
                .body(comment.getBody())
                .build();
                .build();*/
        return mapper.map(comment, CommentDto.class);
    }
    
    
    private Comment mapToEntity(CommentDto commentDto) {
/*            return Comment.builder()
                    .id(commentDto.getId())
                    .name(commentDto.getName())
                    .email(commentDto.getEmail())
                    .body(commentDto.getBody())
                    .build();
                    .build();*/
        return mapper.map(commentDto, Comment.class);
    }
    

DTO에서 사용(Entity도 동일)

@Getter
@Setter
public class ItemFormDto {

    private Long id;

    @NotBlank(message = "상품명은 필수 입력 값입니다.")
    private String itemNm;

    @NotNull(message = "가격은 필수 입력 값입니다.")
    private Integer price;

    @NotBlank(message = "이름은 필수 입력 값입니다.")
    private String itemDetail;

    @NotNull(message = "재고는 필수 입력 값입니다.")
    private Integer stockNumber;

    private ItemSellStatus itemSellStatus;

    private List<ItemImgDto> itemImgDtoList = new ArrayList<>();

    private List<Long> itemImgIds = new ArrayList<>();

    private static ModelMapper modelMapper = new ModelMapper();

    public Item createItem() {
        return modelMapper.map(this, Item.class);
    }

    public static ItemFormDto of(Item item) {
        return modelMapper.map(item, ItemFormDto.class);
    }
}

Mapper의 단점

  • 컴파일러에 의해 최적화 되지 않고, 최초 작업 시 캐싱되지 않다.(Map을 사용)
  • Refliection API를 사용해 성능이 느리다.
  • @Data를 사용시에 오류가 발생
  • @Setter를 사용하는데 일반적으로 Setter을 통해 모든 필드를 여는 것는 OOP의 맞지 않다.

새로운 방식

Mapper보단 MapStruct을 더 많이 쓴다고 한다.

다시 정리하자

MapStruct

참고

링크

profile
https://github.com/beombu

0개의 댓글