Java Spring 으로 간단한 웹 프로젝트를 실습하고 있었습니다. Reply
라는 객체로 댓글을 등록하는 작업을 하고 있었는데요. 데이터 베이스 작업을 위해 서비스 계층에서 DTO
객체를 Entity(엔티티)
객체로 변환해주어야 했고 이 매핑 작업을 하기 위해 ModelMapper 를 사용했죠.
아래는 Reply
의 DTO 객체입니다.
그리고 이것이 엔티티 객체이죠.
DTO 의 멤버 변수 bno
는 Entity 객체의 Board 엔티티의 멤버 변수입니다. Board 는 아래와 같이 구현되어 있지요.
맞습니다. Reply 의 엔티티에서는 Board 엔티티를 참조하기 위해, 즉 Foreign Key(외래 키) 로써 Board 엔티티의 클래스를 가지고 있는 구조이지요. ReplyDTO 에서는 외래 키이자 Board 엔티티의 Id 인 bno
만 가지고 있으면 됩니다. 객체를 가지고 있어봤자 자원 낭비이니까요. DB 작업을 위해 엔티티 객체로 바꿀 때만 이 bno
를 이용해 인스턴스를 만들면 되는 겁니다. 저는 ModelMapper 가 아래처럼 그냥 map()
함수를 쓰면 알아서 Builder
를 호출해서 그렇게 해줄 줄 알았습니다.
그런데 그렇게 되지 않고 null
값이 되어버리더라구요!!!🤯 제가 공부하는 교재에서 이와 같이 해서 문제가 없길래 저는 제가 잘못한 줄 알고 한참을 삽질을 했답니다. 그런데 결국 이를 위해서는 ModelMapper 의 Deep Mapping 이란 테크닉을 사용해야 하더라구요.
알아서 map()
함수가 인스턴스를 해줄 줄 알았는데, 그것을 직접 코드로 이 과정을 등록해주어야 하는 것이었고 이를 Deep Mapping 이라 합니다. 위의 예시로 설명을 드리겠습니다. 먼저 이 Deep Mapping 을 위해서, 커스텀을 한 PropertyMap 을 작성해주어야 합니다.
위와 같이 ReplyDTO 에서 Reply (엔티티) 객체로의 매핑임을 지정하고 configure
함수를 오버라이딩 합니다. 여기서 직접 엔티티에서 우리가 타겟하는 객체에 DTO 의 변수를 set 해주어야 합니다. 이를 위해서 엔티티 객체에 Setter
등록은 필수가 되겠죠?
이런식으로 PropertyMap 을 만들어 주었다면, 아래와 같이 우리가 사용할 ModelMapper 객체의 addMappings
함수로 이를 등록해주면 됩니다.
여기까지만 하면, 애시당초 우리가 원했던 대로 ModelMapper 의 map() 함수가 알아서 등록된 객체 - 객체 간의 매핑이 이루어져 있을 때 set
을 하여 원하는 결과를 만들어주게 됩니다. 쉽죠? 이를 몰라서 조금 해멨네요...😂
참고 : https://amydegregorio.com/2018/08/02/deep-mapping-with-modelmapper/