Server/Spring Boot

MapStruct 의 @Mapper 사용에 대해 알아보자!

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

🛠️ Mapper 인터페이스 작성 & 사용 예제

1. Entity, DTO 클래스 예시

// User 엔티티
public class User {
    private Long id;
    private String username;
    private String email;
    // getter/setter 생략
}
// UserDto
public class UserDto {
    private String username;
    private String email;
    // getter/setter 생략
}

2. Mapper 인터페이스 작성

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;

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

    // Entity → DTO
    UserDto toDto(User user);

    // DTO → Entity
    User toEntity(UserDto userDto);
}

✅ Tip: 이름이 같은 필드는 자동 매핑됩니다.
이름이 다르거나 변환 로직이 필요할 경우 @Mapping 어노테이션을 사용하세요.

3. 실제 사용 예제 (Service 계층)

@Service
public class UserService {

    private final UserRepository userRepository;
    private final UserMapper userMapper;

    public UserService(UserRepository userRepository, UserMapper userMapper) {
        this.userRepository = userRepository;
        this.userMapper = userMapper;
    }

    public UserDto getUserDtoById(Long id) {
        User user = userRepository.findById(id)
                .orElseThrow(() -> new RuntimeException("사용자 없음"));

        return userMapper.toDto(user);
    }

    public void saveUser(UserDto userDto) {
        User user = userMapper.toEntity(userDto);
        userRepository.save(user);
    }
}

🧩 @Mapper 주요 속성 설명

속성명 설명
componentModel spring, jsr330, cdi, default 중 선택.
Spring Bean으로 등록하고 싶다면 spring 사용.
uses 다른 Mapper를 내부적으로 사용하는 경우 명시.
예: @Mapper(uses = AddressMapper.class)
imports static 메서드 등을 매핑에 활용하기 위해 클래스 import 가능.
unmappedTargetPolicy 매핑되지 않은 필드에 대한 경고 설정. IGNORE, WARN, ERROR 가능.
nullValueMappingStrategy null 값 처리 방식 지정. RETURN_NULL, RETURN_DEFAULT 등 사용 가능.

💡 추가 팁

  • 컴파일 시 자동으로 UserMapperImpl 클래스가 생성됩니다.
  • @Mapping 어노테이션을 활용하면 필드명이 다른 경우도 쉽게 매핑할 수 있습니다.
  • 리스트 매핑도 아래처럼 쉽게 작성 가능해요:
List<UserDto> toDtoList(List<User> users);
728x90
반응형