modelmapper를 사용해서 DTO와 Entity를 매핑을 하고 있었는데
쓰면 쓸수록 가독성이 별로라는 생각이 들었다 🤨
위 사진에서 밑줄 친 부분이 모두 매핑을 위한 코드...
이러한 코드가 모든 메소드마다 들어간다고 생각하니 뭔가 잘못됐다는 생각이 들었다.
물론 Stream으로 위와 같이 간단하게 매핑할 수 있긴 하지만...🤔
이 또한 최선의 해결책은 아니라는 생각이 들었다.
사실 이런 생각을 하게된 계기가 있는데
다른 분들의 코드를 찾아보며 mapstruct를 사용하여 매핑한 코드를 보고
코드를 수정해야 할 필요성을 느꼈다.
위와 같이 mapstruct를 적용하여 매핑을 시도해봤는데
직관적이고 간편하게 매핑을 할 수 있어서 아주 맘에 들었다 ㅎㅎ
하지만 mapstruct에도 분명히 단점은 존재한다.
https://kth990303.tistory.com/403
[Spring] MapStruct를 이용한 Entity <-> DTO 고찰 (2)
mapstruct는 entity dto를 자동으로 반환해주는 객체 매핑 라이브러리이다. 엄청 옛날에 이런 포스팅을 작성한 적이 있다. (진짜 옛날 글이라 지식이 부족할 때 작성했어서 굳이 열람할 필요는 없다.)
kth990303.tistory.com
위 블로그에서 단점들을 자세하게 적어주셔서 고려하여 고민해봤는데
프로젝트의 규모가 크지않고, 한번쯤 경험해 보는 것도 좋을것 같아서(+ 직관적이고 간편 )
mapstruct를 이용해 entity와 dto를 변환하기로 결정하였다!
✅의존성 추가(Gradle)
implementation 'org.mapstruct:mapstruct:1.5.3.Final'
annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.3.Final'
annotationProcessor 'org.projectlombok:lombok-mapstruct-binding:0.2.0'
✅Entity / DTO
@ToString
@NoArgsConstructor
@Getter
@Setter
@Entity
public class Community {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int communityNo;
@ManyToOne
@NonNull
@JoinColumn(name = "memberId")
private Member memberId;
@NonNull
@Column(nullable = false)
private String title;
@NonNull
@Column(nullable = false)
private String content;
@Column(nullable = false, columnDefinition = "DEFAULT 0")
private int hits;
@NonNull
@Column(nullable = false)
private LocalDate regdate;
@NonNull
@Column(nullable = false)
private String category;
@Column(nullable = false)
private int likeCount;
}
@Getter
@Setter
public class CommunityMainListDTO {
private String title;
private int hits;
private String regdate;
private int likeCount;
}
✅Mapper
unmappedTargetPolicy = ReportingPolicy.IGNORE
매핑 중에 대상에 매핑되지 않은 속성에 대한 처리 방법을 설정( IGNORE => 무시 )
@Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface CommunityMapper {
CommunityMapper INSTANCE = Mappers.getMapper(CommunityMapper.class);
// List<CommunityMainListDTO> -> List<Community>
List<CommunityMainListDTO> toCommunityMainListDTO(List<Community> dto);
}
🚗사용하기
public List<CommunityMainListDTO> getCommunityPopularPost() throws Exception {
List<Community> popularPosts = communityRepository.getCommunityPopularPost();
List<CommunityMainListDTO> popularPostDtoList = CommunityMapper.INSTANCE.toCommunityMainListDTO(popularPosts);
return popularPostDtoList;
}
'🌱 Spring' 카테고리의 다른 글
[Spring Boot] summer note 적용하기(게시판 글쓰기) (0) | 2024.02.28 |
---|---|
Page<Entity> 👉 Page<DTO> 매핑하기(+mapstruct로 page 매핑시 에러) (0) | 2024.02.23 |
[SpringBoot]JUnit5 + mokito를 이용한 MVC 테스트 (1) | 2023.10.16 |
JUnit이란? (0) | 2023.10.12 |
스프링 빈(Spring Bean)이란? (0) | 2023.09.26 |