MapStruct 사용

yanju·2022년 12월 29일
0
post-thumbnail

기존 매퍼 클래스

  • entity → dto 변환을 생성자를 통해 직접 해줘야한다.
public class ProductMapper {

    public static ProductResponse toResponse(Product product){
        return ProductResponse.builder()
                .productId(product.getProductId())
                .name(product.getName())
                .price(product.getPrice())
                .caption(product.getCaption())
                .thumbnailImgUrl(product.getThumbnailImgUrl())
                .detailImgUrl(product.getDetailImgUrl())
                .build();
    }
}

MapStruct 인터페이스

  • 다음과 같이 인터페이스에 메소드 정의만 하면 됨
  • 인터페이스 위에 @Mapper 어노테이션 사용
@Mapper
public interface ProductMapperMapStruct {

    ProductMapperMapStruct PRODUCT_MAPPER = Mappers.getMapper(ProductMapperMapStruct.class);

		// 매핑 인터페이스 정의
    ProductResponse productToProductResponse(Product product);
}

MapStruct를 실제 이용

  • MapStruct 인터페이스에서 정의한 static 변수를 이용해 메소드에 접근한다.
  • 사용 방법은 기존 매퍼 클래스와 크게 다르지 않다.
// 기존 매퍼 사용 (보라색 부분)
public List<ProductResponse> getNewProducts() {
  List<ProductResponse> list = new ArrayList<>();
  List<Product> products = productRepository.findTop4ByOrderByProductIdDesc();
  for (Product product : products) {
      list.add(productMapper.toResponse(product));
  }
  return list;
}

// ------------------------------------------

// MapStruct 사용 (보라색 부분)
public List<ProductResponse> getNewProducts() {
        List<ProductResponse> list = new ArrayList<>();
        List<Product> products = productRepository.findTop4ByOrderByProductIdDesc();
        for (Product product : products) {
            ProductResponse productResponse = PRODUCT_MAPPER.productToProductResponse(product);
            list.add(productResponse);
        }
        return list;
    }

인터페이스의 구현체는 어디서?

MapStruct 인터페이스를 정의하고 프로그램을 실행하면 다음과 같이 generated 폴더가 생긴다.

다음과 같이 인터페이스명Impl 클래스를 확인해보면 자동으로 인터페이스에서 정의한 메소드의 인자와 반환 값에 맞는 매핑 로직을 만들어준다.

@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2022-12-29T14:44:16+0900",
    comments = "version: 1.5.3.Final, compiler: javac, environment: Java 17.0.5 (Oracle Corporation)"
)
public class ProductMapperMapStructImpl implements ProductMapperMapStruct {

    @Override
    public ProductResponse productToProductResponse(Product product) {
        if ( product == null ) {
            return null;
        }

        ProductResponse.ProductResponseBuilder productResponse = ProductResponse.builder();

        productResponse.productId( product.getProductId() );
        productResponse.name( product.getName() );
        productResponse.price( product.getPrice() );
        productResponse.caption( product.getCaption() );
        productResponse.thumbnailImgUrl( product.getThumbnailImgUrl() );
        productResponse.detailImgUrl( product.getDetailImgUrl() );

        return productResponse.build();
    }
}

0개의 댓글

관련 채용 정보