📌 1. MapStruct란?
MapStruct는 객체 간 매핑 코드를 자동으로 생성해주는 라이브러리이다.
주로 다음과 같은 상황에서 사용된다.
- DTO ↔ Entity 변환
- API 요청/응답 객체 변환
- 계층 간 데이터 전달
👉 핵심:
반복적인 매핑 코드를 자동화하여 생산성과 안정성을 높인다.
❗ 2. 기존 방식의 문제점
✔️ 수동 매핑
UserDto dto = new UserDto();
dto.setName(user.getName());
dto.setAge(user.getAge());
❌ 문제점
- 코드 반복 많음
- 실수 발생 가능
- 유지보수 어려움
✔️ ModelMapper (대안)
- 리플렉션 기반 자동 매핑
❌ 문제점
- 성능 저하
- 런타임 에러 발생 가능
- 디버깅 어려움
✅ 3. MapStruct의 핵심 특징
✔️ 1. 컴파일 시 코드 생성
- 실행 전에 매핑 코드 자동 생성
- 일반 메서드 호출 수준 성능
✔️ 2. 리플렉션 사용 X
- 런타임 오버헤드 없음
- 빠른 실행 속도
✔️ 3. 타입 안정성 보장
- 컴파일 단계에서 오류 검출
✔️ 4. 코드 가독성 향상
- 선언형 방식으로 작성
⚙️ 4. 사용 방법
✔️ 의존성 추가
implementation 'org.mapstruct:mapstruct'
annotationProcessor 'org.mapstruct:mapstruct-processor'
✔️ Mapper 인터페이스 작성
@Mapper(componentModel = "spring")
public interface UserMapper {
UserDto toDto(User user);
User toEntity(UserDto dto);
}
👉 구현체는 MapStruct가 자동 생성
🔥 5. 고급 기능
✔️ 필드명이 다른 경우
@Mapping(source = "fullName", target = "name")
UserDto toDto(User user);
✔️ 중첩 객체 매핑
@Mapping(source = "user.name", target = "userName")
✔️ 여러 객체 매핑
OrderDto toDto(User user, Product product);
⚖️ 6. MapStruct vs ModelMapper
| 항목 | MapStruct | ModelMapper |
|---|---|---|
| 동작 방식 | 컴파일 시 생성 | 런타임 (리플렉션) |
| 성능 | 매우 빠름 | 느림 |
| 안정성 | 높음 | 낮음 |
| 에러 | 컴파일 시 발견 | 런타임 발생 |
| 디버깅 | 쉬움 | 어려움 |
🧠 7. 리플렉션이란?
리플렉션은 실행 중(runtime)에 클래스 정보를 동적으로 분석하고 실행하는 기술이다.
Class<?> clazz = Class.forName("User");
Method method = clazz.getMethod("getName");
method.invoke(obj);
❌ 단점
- 성능 저하
- 런타임 에러 발생
- 디버깅 어려움
🚀 8. MapStruct의 장점 정리
- 빠른 성능
- 타입 안정성
- 컴파일 시 오류 검출
- 유지보수 용이
- 코드 간결화
📊 9. 결론
MapStruct는 반복적인 객체 매핑 코드를 줄이고, 성능과 안정성을 동시에 확보할 수 있는 라이브러리이다.
특히 대규모 프로젝트에서 유지보수성과 생산성을 크게 향상시킨다.
✍️ 10. 느낀점
MapStruct를 통해 단순한 매핑 코드도 자동화할 수 있다는 점이 인상적이었다.
기존의 수동 매핑 방식과 비교했을 때 코드의 양이 줄어들고 가독성이 크게 향상되었다.
또한 컴파일 단계에서 오류를 잡을 수 있다는 점에서 안정성 측면에서도 큰 장점이 있다고 느꼈다.
🔥 한줄 정리
MapStruct는 컴파일 시점에 매핑 코드를 생성하여 성능과 안정성을 확보하는 객체 매핑 라이브러리이다.
'Java & Spring > Spring' 카테고리의 다른 글
| OSIV · 낙관적 락 · 비관적 락 (0) | 2026.05.09 |
|---|---|
| Spring Batch 개념, 사용 (0) | 2026.04.29 |
| 페이지네이션의 원리? 필요성? (0) | 2026.04.10 |
| [MapStruct] 내부 구현 방식 - 설계 문제 해결 (0) | 2026.04.09 |
| Spring 프록시 원리 (0) | 2026.04.03 |