DTO → Entity 혹은 Entity → DTO 간 매핑이 자주 일어나는데, 매번 손으로 일일히 변환시키는 것은 번거롭다. 다양한 매핑 프레임워크들 중 Mapstruct가 월등히 빠른 속도를 보인다. 맨 마지막에 있음.
(= DTO와 엔티티 필드명이 같을 때)
다들 아시는 그 사용법.
@Mapping
애너테이션을 사용하자.
@Mapping(source = "challenge.habit.title", target = "habitTitle")
@Mapping(source = "challenge.user.username", target = "challenger")
ChallengeDto.Response toDto(Challenge challenge);
habitTitle
, challenger
를 source와 target 속성을 이용해 매핑했다.<aside> 💡 DTO → Entity 전환할 때 외래키로 참조하는 객체는 어떻게 설정하지?
</aside>
우선 mapper로 DTO를 entity로 전환한 후, 비어있는 필드들을 Service 혹은 Controller에서 채워준다.
Habit과 Category를 예로 들자면 다음과 같다.
@PostMapping
public ResponseEntity postHabit(@RequestBody HabitDto.Post postDto) {
Habit habit = habitMapper.toHabit(postDto); // 우선 mapper로 DTO를 Entity로 전환한다.
habit.setCategory(categoryService.findById(postDto.getCategoryId())); // setter로 Entity에 자동매핑 되지 않는 필드들을 채운다.
Habit createHabit = habitService.createHabit(habit);
return new ResponseEntity(habitMapper.toDto(createHabit), HttpStatus.CREATED);
}