본문 바로가기

마주쳤던 이슈 기록

#5 Mapper: Dto -> Entity 변환 시 Null 에러

사이드 프로젝트를 진행하던 중, 회원 가입 로직을 처리하던 중이었다.

내가 구현하는 회원 가입의 로직 순서는 다음과 같다.

1. Client 측으로부터 회원 가입을 위한 정보를 전달 받는다.

2. Server는 Client의 요청에 담긴 데이터를 DTO 객체로 받는다.
3. Mapper (Map Struct)를 활용하여 전달받은 DTO를 Entity 객체로 변경 후 DB에 저장.
4. DB에 저장 후 저장된 Entity객체를 response에 담기 위해 DTO 객체로 변경.
5. Response DTO 타입을 반환


[에러]

application를 가동 후 Client 측에서 정보를 담아 Server측으로 전달하면,
전달받은 정보 중 password 필드가 null 이 되는 에러가 발생.

즉, Mapper가 DTO -> Entity 변환함에 있어 어떠한 에러로 인해 DTO의 정보가 전달되지 않음

어디부터 전달되지 않는지 확인하기 위해 사진과 같이 로직 코드를 디버깅하여 전달되는지 확인했다.

그 결과, Client가 전달하는 DTO의 password 필드 데이터는 문제없이 전달이 된 것이 확인되었다.

그렇다는건, Dto 객체가 전달은 되지만,
Dto -> Entity 로 변환을 해주는 Mapper가 제 역할을 하지 못한다는 말.

역시 빌드 작업 후 생성되는 mapper의 구현체를 확인해보면

Client로부터 전달받은 Data가 DTO -> Member 객체에 전달되지 않는다.
이로써 원인은 Mapper(Map Struct)가 에러의 원인임을 확인했다.


[원인]

MapStuct:MapperImpl 파일은 Lombok의 @Setter에 의해 생성되는데,
Gradle Dependency 순서 상 MapStruct가 Lombok보다 위에 위치하고 있으면, 
MapperImpl이 생성되는 당시 Lombok @Setter가 지원되지 않는 상황이라 동작할 수 없다.

[해결]

Gradle 순서를 Lombok, mapstruct 순으로 변경함.


위와 같이 Gradle의 Dependency 순서를 변경한 뒤 Application을 다시 실행해보았다.

이전과는 다르게 Client로부터 전달받은 DTO 객체를 Entity로 변경하여도 Data들이 잘 전달된다.

[결론]

Lombok의 @Setter를 사용하는 객체는 모두 Lombok 아래로 위치하는 것을 인지하자