티스토리 뷰

반응형

 

 

 

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  쓰던가 해야지 원...)

 

 

 

 

 

해결방법

 

 

 

 


 

이클립스 내 설정은 아래와 같다.

 

1) 해당 프로젝트 - properties - Java Compiler - Annotation Processing

 

여기서 Enable project specific settingEnable annotation processing 체크하고

그 하위에 Factory Path 에서 Enable project specific settings 를 선택하고

Add External JARs... 를 추가해준다.

 

lombok 과 mapstruct-processor 라이브러리를 추가 (가운데 난수폴더는 사용자마다 다름)

 

2) gradle 라이브러리 받는 폴더 가서 두 라이브러리 추가 ​

 

 

이제 Java Build Path 에 가보면 위에 추가한 .apt_generated 폴더가 잡혀있는 것을 확인 할 수 있다.

그리고 생성된 generated 폴더 위치를 조정해준다.

 

3) 생성된 generated 폴더

 

 

4) 소스폴더 순서 변경

 

 

 

* 생성된 .apt_generated 폴더가 제일 밑에 있을 건데 그 상태에서는 올바르게 작동하지 않는다.

이제 아까 구현체 없다고 하던 리퀘스트를 호출하면 정상적으로 동작하는 것을 확인 할 수 있다.

 


 

 

 

 

 

역시나 이클립스가 생성된 구현체를 바라보지 못하는 상황이었다.

물론 빌드하고 생성된 MapperImpl.java 을 패키지에 넣고 하면 되긴 하지만

그건 올바른 방법이 아니기에 그렇게 진행 할 순 없었고,

거의 하루를 날려먹은 끝에 이클립스 설정으로 해결을 하였다.

 

 

 

 

 

 

 

 

 

 

참고블로그
 

Eclipse에서 Lombok 과 MapStruct 사용

java bean mapping framework 중 MapStruct가 가장 우수합니다. ModleMapper의 경우 reflection-based라서 성능 상에 이슈가 있으므로 MapStruct를 추천합니다. MapStruct is definitely more efficient than any reflection-based approach.

sonbbang78.tistory.com

 

 

 

 

반응형
댓글
반응형
최근에 올라온 글
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Total
Today
Yesterday