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 아래로 위치하는 것을 인지하자