Backend/Java

MapStruct와 ObjectMapper, 언제 어떤 걸 써야 할까?

누구세연 2025. 7. 23. 22:29

DTO ↔ Entity 변환, 여러분은 어떻게 처리하고 계신가요?🤔

 

많은 개발자들이 처음에는 직접 생성자나 Builder를 사용해서 매핑합니다.
필드가 몇 개 없을 때는 괜찮지만, 점점 DTO/Entity 구조가 복잡해지고, 중복 코드가 많아지면서 유지보수가 어려워지는 것 같습니다.

이럴 때 보통 두 가지 대안이 있습니다.

  • ObjectMapper: 빠르고 간편하게 쓸 수 있는 JSON 매핑 도구
  • MapStruct: 컴파일 타임에 타입 안전하게 매핑 코드를 생성해 주는 프레임워크

이번 글에서는 두 방식의 차이점과 실무에서 어떤 상황에 어떤 방식을 선택하는 것이 좋은지 정리해 보겠습니다.

 


 

ObjectMapper란?

ObjectMapper는 Jackson 라이브러리에서 제공하는 객체-JSON 변환 도구입니다.
(사실 JSON 직렬화/역직렬화가 주목적이지만, 내부적으로 필드 기반 매핑도 지원해요.)

ObjectMapper objectMapper = new ObjectMapper();
UserDto dto = objectMapper.convertValue(userEntity, UserDto.class);

 

✅ 장점

  • 개발이 빠름 (코드 1줄로 매핑 가능)
  • 유연한 타입 변환 지원 (JSON과 궁합이 좋음)

❌ 단점

  • 리플렉션 기반이라 성능이 느림
  • 런타임 오류 발생 가능 (컴파일 타임에 안전하지 않음)
  • 필드명이 다르면 동작 안 하거나 에러

 

MapStruct란?

MapStruct는 Java Annotation 기반의 정적 매핑 코드 생성기입니다.
런타임이 아니라 컴파일 타임에 매핑 코드를 만들어주는 게 핵심입니다.

@Mapper(componentModel = "spring")
public interface UserMapper {
    UserDto toDto(User user);
    User toEntity(UserDto dto);
}

 

→ 위처럼 인터페이스만 정의하면,
UserMapperImpl 클래스가 자동으로 생성됩니다.

 

✅ 장점

  • 빠른 성능 (리플렉션 없음)
  • 타입 안정성 보장 (컴파일 에러로 알려줌)
  • 코드 자동 생성, 유지보수 쉬움

❌ 단점

  • 복잡한 매핑은 추가 설정 필요 (@Mapping, custom method 등)
  • 사용 초기 진입장벽이 약간 있음 (라이브러리 설정, Gradle, lombok 등)

 

🚀 성능 비교 – 실제 코드 예시로 보기

다음은 UserDto ↔ User 간 변환을 100만 번 반복하여 실행 시간을 측정한 코드입니다.

1️⃣ 테스트 대상 클래스

User class
UserDto class

2️⃣ MapStruct 매퍼 정의

UserMapper class

3️⃣ 성능 측정 테스트 코드

Test class

⏱️ 결과

console log

리플렉션을 사용하는 ObjectMapper는 상대적으로 느리고, MapStruct는 단순 메서드 호출 수준이기 때문에 훨씬 빠릅니다.

실시간 트래픽이 많은 시스템이나 대용량 데이터 처리 시에는 MapStruct가 유리합니다.

 

언제 어떤 걸 써야 할까? 🤔

상황 추천 방식  이유
개발 초기, 필드 적음 수동 Builder 빠르고 직관적
빠르게 프로토타이핑 ObjectMapper 코드 1~2줄로 끝
성능/안정성 중요 MapStruct 정적 코드, 빠름
필드명이 다름 MapStruct (@Mapping) 명시적 매핑 가능
커스텀 로직 포함 MapStruct + default method 로직 분리 깔끔
JSON ↔ 객체 변환 ObjectMapper 원래 목적에 딱 맞음

 

 

 

실무에서는 대부분 아래와 같은 흐름을 거칩니다.
Builder로 수동 매핑 → 코드 많아짐 → ObjectMapper 써봄 → 성능 이슈 발생 → MapStruct 도입!

복잡한 매핑이 많아질수록, 그리고 성능이 중요할수록 MapStruct를 일찍 도입하는 게 장기적으로 이득이에요.
ObjectMapper는 여전히 JSON 변환이나 간단한 DTO 테스트용으로는 아주 훌륭합니다.
핵심은 “상황에 맞는 도구를 쓰는 것”이라는 점을 기억하면 좋을 것 같습니다!

 

 


 

 

https://mapstruct.org/

 

MapStruct – Java bean mappings, the easy way!

MapStruct Spring Extensions 1.1.3 released March 14, 2025 It is my pleasure to announce the next official release of MapStruct Spring Extensions. What started out as a StackOverflow question turned into its own (sub-)project within the MapStruct organizati

mapstruct.org

 

 

https://github.com/FasterXML/jackson

 

GitHub - FasterXML/jackson: Main Portal page for the Jackson project

Main Portal page for the Jackson project. Contribute to FasterXML/jackson development by creating an account on GitHub.

github.com