MapStruct는 <T> 제네릭 타입 메서드 자체는 구현코드 생성 못한다.

2026. 3. 10. 10:50·코드잇 스프린트/실습
<T> PageResponse<T> fromPage(Page<T> page);

MapStruct 입장에서 보면 T가 무엇인지 모르는 상태이다.

컴파일 시점에서 Page<T> -> PageResponse<T> T가 어떤 타입인지 확정되지 않는다.

 

그래서 어떤 타입으로 매핑코드를 생성해야될지 몰라서 이런 error가 생긴다.

Can't generate mapping method for a generic type variable source

 

PageResponse<UserDto> fromPage(Page<UserDto> page);

PageResponse<MessageDto> fromPage(Page<MessageDto> page);

이런 구체 타입은 가능하다.

 

[해결방법 3가지]

1.자바 클래스 사용

public class PageResponseMapper {

    public static <T> PageResponse<T> fromPage(Page<T> page) {
        return new PageResponse<>(
            page.getContent(),
            page.getNumber() + 1,
            page.getSize(),
            page.hasNext(),
            page.getTotalElements()
        );
    }
}

 

2.인터페이스 + default 메서드

public interface PageResponseMapper {

    default <T> PageResponse<T> fromPage(Page<T> page) {
        return new PageResponse<>(
                page.getContent(),
                page.getNumber(),
                page.getSize(),
                page.getTotalElements(),
                page.getTotalPages(),
                page.isFirst(),
                page.isLast()
        );
    }

    default <T> PageResponse<T> fromSlice(Slice<T> slice) {
        return new PageResponse<>(
                slice.getContent(),
                slice.getNumber(),
                slice.getSize(),
                slice.hasNext(),
                slice.isFirst(),
                slice.isLast()
        );
    }
}

 

3.추상 클래스 방식

package com.sprint.mission.discodeit.mapper;

import com.sprint.mission.discodeit.dto.response.PageResponse;
import org.mapstruct.Mapper;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Slice;

@Mapper(componentModel = "spring")
public abstract class PageResponseMapper {

    public <T> PageResponse<T> fromPage(Page<T> page) {
        return new PageResponse<>(
                page.getContent(),
                page.getNumber() + 1,
                page.getSize(),
                page.hasNext(),
                page.getTotalElements()
        );
    }

    public <T> PageResponse<T> fromSlice(Slice<T> slice) {
        return new PageResponse<>(
                slice.getContent(),
                slice.getNumber() + 1,
                slice.getSize(),
                slice.hasNext(),
                null
        );
    }
}

'코드잇 스프린트 > 실습' 카테고리의 다른 글

디스코드 프로젝트 실습: JPA N+1 문제 해결하기  (0) 2026.03.11
디스코드 프로젝트 실습: JPA Public 채널생성시 ReadStatus에 채널id가 null값으로 들어간다.  (0) 2026.03.10
BinaryContent 저장로직 고도화  (0) 2026.03.09
MapStruct 라이브러리를 통해 Entity를 DTO로 자동 변환  (0) 2026.03.09
Entity를 Controller까지 그대로 노출 할때 발생할 수 있는 문제점  (0) 2026.03.09
'코드잇 스프린트/실습' 카테고리의 다른 글
  • 디스코드 프로젝트 실습: JPA N+1 문제 해결하기
  • 디스코드 프로젝트 실습: JPA Public 채널생성시 ReadStatus에 채널id가 null값으로 들어간다.
  • BinaryContent 저장로직 고도화
  • MapStruct 라이브러리를 통해 Entity를 DTO로 자동 변환
과컴
과컴
벡엔드 개발자 최소기준 맞추겠습니다.
  • 과컴
    곽의 프로그램
    과컴
  • 전체
    오늘
    어제
    • 분류 전체보기 (76)
      • 위클리페이퍼 (6)
      • 파이썬 (4)
      • 코드잇 스프린트 (48)
        • Spring 이론 (7)
        • Java이론 (11)
        • 실습 (23)
      • 백엔드 개발자 최소기준 (1)
      • 코딩테스트 (5)
        • 알고리즘 (0)
        • SQL (1)
      • Git (5)
      • 스프링부트 핵심가이드 (1)
      • 트러블 슈팅 (2)
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    혼공파
    파이썬기초
    백준브론즈
    백준1075번
    문자열
    파이썬입문
    백준1152
    백준2576
    파이썬
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
과컴
MapStruct는 <T> 제네릭 타입 메서드 자체는 구현코드 생성 못한다.
상단으로

티스토리툴바