Server/Spring Boot

[Springboot] 엔티티와 DTO 간 변환시 MapStruct 사용해야 하는 이유?

hoonylab 2025. 4. 16. 11:29
728x90
반응형

✅ MapStruct 기본 설정 방법

1. 의존성 추가 (Maven 기준)

<dependencies>
    <!-- MapStruct Core -->
    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct</artifactId>
        <version>1.5.5.Final</version>
    </dependency>
    
    <!-- MapStruct Processor -->
    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct-processor</artifactId>
        <version>1.5.5.Final</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.11.0</version>
            <configuration>
                <source>17</source>
                <target>17</target>
                <annotationProcessorPaths>
                    <path>
                        <groupId>org.mapstruct</groupId>
                        <artifactId>mapstruct-processor</artifactId>
                        <version>1.5.5.Final</version>
                    </path>
                </annotationProcessorPaths>
            </configuration>
        </plugin>
    </plugins>
</build>

Gradle을 사용하는 경우:

dependencies {
    implementation 'org.mapstruct:mapstruct:1.5.5.Final'
    annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.5.Final'
}

2. Mapper 인터페이스 작성 예시

@Mapper(componentModel = "spring")
public interface UserMapper {

    UserDto toDto(User user);

    User toEntity(UserDto userDto);
}

💡 TIP: componentModel = "spring" 옵션을 사용하면 해당 Mapper를 Spring Bean으로 등록할 수 있어 @Autowired로 주입받을 수 있어요.


✅ MapStruct vs ModelMapper

항목 MapStruct ModelMapper
동작 방식 컴파일 타임에 코드 생성 런타임에 Reflection 사용
성능 매우 빠름 (정적 바인딩) 느림 (동적 바인딩 + 리플렉션)
타입 안정성 컴파일 시 타입 체크 가능 런타임 오류 가능
유지보수 명시적인 코드로 명확함 자동 매핑이 편리하나 가독성 낮을 수 있음
커스터마이징 @Mapping, @Named, default methods로 정밀하게 제어 가능 Expression 설정은 가능하지만 복잡한 매핑은 힘듦
러닝커브 초기 세팅 약간 필요하지만 구조적 설정은 간단하지만 복잡한 매핑 제약

✨ MapStruct를 추천하는 이유

  • 대규모 프로젝트에서 성능 이슈를 줄일 수 있음
  • DTO ↔ Entity 간 매핑이 명시적이라 유지보수와 디버깅이 쉬움
  • 컴파일 타임 에러 검출로 안전한 개발 가능
  • Spring과의 궁합도 매우 좋음 (@Mapper(componentModel = "spring"))
728x90
반응형