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