[Java] ModelMapper 로 멤버 변수 - 클래스 매핑하기

유영석·2023년 2월 22일
0

잡다한 정보

목록 보기
4/15
post-thumbnail

Java Spring 으로 간단한 웹 프로젝트를 실습하고 있었습니다. Reply 라는 객체로 댓글을 등록하는 작업을 하고 있었는데요. 데이터 베이스 작업을 위해 서비스 계층에서 DTO 객체를 Entity(엔티티) 객체로 변환해주어야 했고 이 매핑 작업을 하기 위해 ModelMapper 를 사용했죠.

아래는 ReplyDTO 객체입니다.

그리고 이것이 엔티티 객체이죠.

DTO 의 멤버 변수 bno 는 Entity 객체의 Board 엔티티의 멤버 변수입니다. Board 는 아래와 같이 구현되어 있지요.

맞습니다. Reply 의 엔티티에서는 Board 엔티티를 참조하기 위해, 즉 Foreign Key(외래 키) 로써 Board 엔티티의 클래스를 가지고 있는 구조이지요. ReplyDTO 에서는 외래 키이자 Board 엔티티의 Id 인 bno 만 가지고 있으면 됩니다. 객체를 가지고 있어봤자 자원 낭비이니까요. DB 작업을 위해 엔티티 객체로 바꿀 때만 이 bno 를 이용해 인스턴스를 만들면 되는 겁니다. 저는 ModelMapper 가 아래처럼 그냥 map() 함수를 쓰면 알아서 Builder 를 호출해서 그렇게 해줄 줄 알았습니다.

그런데 그렇게 되지 않고 null 값이 되어버리더라구요!!!🤯 제가 공부하는 교재에서 이와 같이 해서 문제가 없길래 저는 제가 잘못한 줄 알고 한참을 삽질을 했답니다. 그런데 결국 이를 위해서는 ModelMapper 의 Deep Mapping 이란 테크닉을 사용해야 하더라구요.

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/

profile
소프트웨어 엔지니어

0개의 댓글