Java & Spring/Spring

MapStruct

승주우에요 2026. 3. 22. 13:03

📌 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는 컴파일 시점에 매핑 코드를 생성하여 성능과 안정성을 확보하는 객체 매핑 라이브러리이다.