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
반응형