티스토리 뷰
JPA 쓰다보면 Entity 결과를 DTO 에 담아서 리턴해주는게 좋은데
일일이 수작업으로 넘겨주는 방법도 있고 라이브러리로 매핑해주는 방식도 있는데
간단한 결과야 수작업으로 담아서 리턴해주겠지만...
리턴 데이터가 많을 경우엔 실수 할 확률이 매우 높아 엉뚱한 값에 매칭할 수도 있다.
이런 수작업을 해결해 줄 ModelMapper 와 Mapstruct 매핑 라이브러리가 있는데
사용적인 면이나 성능면이나 이슈면에서 Mapstruct 가 이점이 더 많은 것 같아 Mapstruct 를 써보려고 한다.
List<SampleEntity> sampleList = sampleRepository.findAll();
// ModelMapper
List<SampleDTO> sampleResult = sampleList.stream()
.map(sampleEntity -> modelMapper.map(sampleEntity, SampleDTO.class))
.collect(Collectors.toList());
// Mapstruct
List<SampleDTO> sampleResult = SampleToMapper.INSTANCE.sampleListToDto(sampleList);
대충 리스트를 조회해서 DTO에 맵핑하는 예시만 봐도 가독성이 너무 좋다.
속도 이슈로만 따져도 Mapstruct 가 훨씬 압도적이다.
하지만 이번 포스트는 mapstruct 설정 후 구현체를 못찾는
STS (이클립스;eclipse) 로컬환경에서 작동하는 방법을 다룰 예정이다.
대부분 Mapstruct 설정 환경이 intelliJ 여서 이클립스를 사용중인 나에게 약간 시련이 다가왔다.
Mapstruct 를 설정하고 사용하는 방법은 너무 나도 간단하다.
라이브러리를 추가하고 엔티티랑 DTO를 잘 만들고 맵퍼를 생성해서 빌드하면 구현체를 알아서 떨궈준다.
( mapstruct 사용 셋팅은 10분도 안걸렸다. )
mapstruct mapper 를 작성하고 빌드 하니 build 폴더에 mapperImpl java파일과 class 가 잘 생성된 것을 보았다.
여기 까진 순조로웠다.
근데!!!!!!!!!!!!!!!!!!
로컬환경에서 해당 리퀘스트를 호출하니 에러로그에 Mapper 구현체가 없다는 것... 아니 있는데 왜 없다는겨~!
이때 부터 나의 삽질은 시작 되었다.
jar 파일로 배포해서 실행해보면 아주 잘된다. mapper 구현체가 잘 생성된 상태기 때문에...
하지만 로컬환경에서는 이상하게 이클립스(sts)가 해당 파일을 찾지 못하는 상태에 빠졌다.
java.lang.ClassNotFoundException: Cannot find implementation for com.sample.web.sample.SampleToMapper
응? 아니 너가 알아서 생성했는데 ... 왜???
빌드했을때 구현체들이 잘 생성되었기에 다른 문제들은 없다고 보고 개발툴 문제로 판단하고 이 점을 많이 검색해봤는데
대부분 인텔리J 에서 작업하는 내용이 많았고, 크게 뭐 개발툴에서 해줄 이슈가 없었다.
스택오버플로우에 나와 같은 오류를 접한 사람들이 있긴했으나 거기에 있는 방법들로는 해결되지 않았다.
그러던 중 국내 어느 한분이 이클립스 AnnotationProcessing 설정을 해야 한다는 글을 보고 좀 더 해당 부분을 찾아보았다.
결국 해당 부분에서 lombok 과 mapstruct 라이브러리를 추가해주니 로컬환경에서 올바르게 실행되었다. 하...
(인텔리J 쓰던가 해야지 원...)
해결방법
이클립스 내 설정은 아래와 같다.
여기서 Enable project specific setting 과 Enable annotation processing 체크하고
그 하위에 Factory Path 에서 Enable project specific settings 를 선택하고
Add External JARs... 를 추가해준다.
lombok 과 mapstruct-processor 라이브러리를 추가 (가운데 난수폴더는 사용자마다 다름)
이제 Java Build Path 에 가보면 위에 추가한 .apt_generated 폴더가 잡혀있는 것을 확인 할 수 있다.
그리고 생성된 generated 폴더 위치를 조정해준다.
* 생성된 .apt_generated 폴더가 제일 밑에 있을 건데 그 상태에서는 올바르게 작동하지 않는다.
이제 아까 구현체 없다고 하던 리퀘스트를 호출하면 정상적으로 동작하는 것을 확인 할 수 있다.
역시나 이클립스가 생성된 구현체를 바라보지 못하는 상황이었다.
물론 빌드하고 생성된 MapperImpl.java 을 패키지에 넣고 하면 되긴 하지만
그건 올바른 방법이 아니기에 그렇게 진행 할 순 없었고,
거의 하루를 날려먹은 끝에 이클립스 설정으로 해결을 하였다.
참고블로그
'Java > Mapstruct' 카테고리의 다른 글
[Mapstruct] @Mapping 활용하기 (0) | 2024.02.27 |
---|---|
[Mapstruct] LocalDateTime To String Converter, 엔티티와 DTO간 타입이 다를때 맵핑하기 (feat.AttributeConverter) (0) | 2023.07.05 |